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
以反转一个图像为例子
慢速,这是以像素点操作为代表:
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