VB.NET最为一款功能强大的.NET编程语言,其实用价值在开发领域是公认的。我们在这里将会为大家介绍一下有关VB.NET图像操作的相关实现技巧,从另一角度去慢慢体会其功能应用的简便及强大性。 #t#
慢速,这是以像素点操作为代表:
- 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
快速,以内存指针操作为代表,这是VB.NET图像操作中最快的方法
- 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,就是这样,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
VB.NET图像操作的相关操作方法就为大家介绍到这里