日期:2014-05-17  浏览次数:20895 次

Img.GetPixel(i + row, j + col) 换成 LockBits怎么写
我不想用GetPixel那么慢的函数
但是不懂LockBits的写法



private unsafe void PointerFun(Bitmap curBitmap)
        {
            int width = curBitmap.Width; 
            int height = curBitmap.Height;

            Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
            System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb );//curBitmap.PixelFormat
            byte temp = 0;
                int w = bmpData.Width;
                int h = bmpData.Height;
                byte* ptr = (byte*)(bmpData.Scan0);
                for (int i = 0; i < h; i++)
                {
                    for (int j = 0; j <w; j++)
                    {
 
                    }
                    ptr += bmpData.Stride - bmpData.Width * 3 ;//每行读取到最后“有用”数据时,跳过未使用空间XX
                }
            curBitmap.UnlockBits(bmpData);    
        }

------解决方案--------------------
下午写了一个类似的,你参考一下这个帖子
20楼...
http://bbs.csdn.net/topics/390479917


------解决方案--------------------
  byte* ptr = (byte*)(bmpData.Scan0);

这里的ptr是图片锁定区域左上角像素的指针。
bitmapdata可以认为是一个byte数组。排列是按照从左至右,从上至下扫描。

如果你要找  x=10,y=8的点的像素值。

就是ptr+((height*8)+10)*像素宽度。

像素宽度与你的图片文件类型有关,有32位,24位等不同。32位就是*4,24位就是*3。


这里面太多基础知识你不懂,所以不会写。
------解决方案--------------------
Img.GetPixel(i + row, j + col) i+row不太好处理,因为每个扫描线都有多余的字节,
------解决方案--------------------