架构深渊

慢慢走进程序的深渊……关注领域驱动设计、测试驱动开发、设计模式、企业应用架构模式……积累技术细节,以设计架构为宗。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

VB.NET快速操作图像

Posted on 2008-10-14 22:07  chen eric  阅读(859)  评论(0编辑  收藏  举报
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