您的位置:首页 > 编程语言 > VB

VB.NET快速操作图像

2008-10-14 22:07 405 查看
VB.NET快速操作图像

以反转一个图像为例子

慢速,这是以像素点操作为代表:

Public Function fan_slow(ByVal inputImage As Image) As Image

Dim pic As Bitmap = New Bitmap(inputImage)

Dim i As Integer, j As Integer

Dim R As Integer, G As Integer, B As Integer

Dim Width As Integer, Height As Integer

Width = Pic.Width : Height = Pic.Height

Dim myColor As Color

For i = 0 To Height - 1

For j = 0 To Width - 1

R = 255-pic.GetPixel(i, j).R

G = 255-pic.GetPixel(i, j).G

B = 255-pic.GetPixel(i, j).B

myColor = Color.FromArgb(R, G, B)

pic.SetPixel(i, j, myColor)

Next

Next

Return pic

End Function

快速,以内存指针操作为代表,这是最快的方法

Public Function fan_fast(ByVal inputImage As Image) As Image

Dim R As Byte, G As Byte, B As Byte, Col As Byte

Dim Width As Integer, Height As Integer

Dim Pic As Bitmap = New Bitmap(inputImage)

Width = Pic.Width : Height = Pic.Height

Dim rect As New Rectangle(0, 0, Width, Height)

Dim bmpData As BitmapData = Pic.LockBits(rect, ImageLockMode.ReadWrite, Pic.PixelFormat)

Dim ptr As IntPtr = bmpData.Scan0'得到第一个像素的指针

'数组操作()

Dim bytes As Integer = bmpData.Stride * Height

Dim rgbValues(bytes - 1) As Byte

Marshal.Copy(ptr, rgbValues, 0, bytes) '将内存块复制到数组,这是该方法的关键

For k As Integer = 0 To rgbValues.Length - 4 Step 4

B = CByte(255 - rgbValues(k))

G = CByte(255 - rgbValues(k + 1))

R = CByte(255 - rgbValues(k + 2))

rgbValues(k) = B

rgbValues(k + 1) = G

rgbValues(k + 2) = R

Next

Marshal.Copy(rgbValues, 0, ptr, bytes)'再将数组复制到内存块

'数组操作结束

Pic.UnlockBits(bmpData)

Return Pic

End Function

还有一种以C#中的非安全代码 指针操作

public Bitmap fan_fast2(Bitmap b)

{

int width = b.Width;

int height = b.Height;

BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

unsafe

{

byte* p = (byte*)data.Scan0;

int offset = data.Stride - width * 4; for (int y = 0; y < height; y++)

{

for (int x = 0; x < width; x++)

{

p[2] ^= 0xFF;

p[1] ^= 0xFF;

p[0] ^= 0xFF;

p += 4;

}

p += offset;

}

b.UnlockBits(data);

return b;

}

}

如果要改造成vb.net,就是这样,速度大约比数组加指针慢2-3倍

Public Function fan_fast2(ByVal inputImage As Image) As Image

Dim R As Byte, G As Byte, B As Byte, Col As Byte

Dim Width As Integer, Height As Integer

Dim Pic As Bitmap = New Bitmap(inputImage)

Width = Pic.Width : Height = Pic.Height

Dim rect As New Rectangle(0, 0, Width, Height)

Dim bmpData As BitmapData = Pic.LockBits(rect, ImageLockMode.ReadWrite, Pic.PixelFormat)

Dim ptr As IntPtr = bmpData.Scan0'得到第一个像素的指针

''指针操作 在这种模式下,比数组操作要慢2-3倍

Dim offset As Integer = bmpData.Stride - bmpData.Width * 4

For j As Integer = 0 To Height - 1

For i As Integer = 0 To Width - 1

B = CByte(255 - Marshal.ReadByte(ptr))

G = CByte(255 - Marshal.ReadByte(ptr, 1))

R = CByte(255 - Marshal.ReadByte(ptr, 2))

Marshal.WriteByte(ptr, 0, B)

Marshal.WriteByte(ptr, 1, G)

Marshal.WriteByte(ptr, 2, R)

ptr = CType(ptr.ToInt32 + 4, IntPtr)

Next

ptr = CType(ptr.ToInt32 + offset, IntPtr)

Next

''指针操作结束

Pic.UnlockBits(bmpData)

Return Pic

End Function
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: