Img.GetPixel(i + row, j + col) 换成 LockBits怎么写

buhnbuhn1000 2013-06-06 11:41:28
我不想用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);
}
...全文
240 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
buhnbuhn1000 2013-06-15
  • 打赏
  • 举报
回复
尽量模仿GetPixel的功能
buhnbuhn1000 2013-06-15
  • 打赏
  • 举报
回复
引用 7 楼 conmajia 的回复:
lock之后你还是可以getpixel。。。我猜你多半没有尝试过。。 http://bbs.csdn.net/topics/390128489 不解释。。
看了你的贴感觉很牛逼,我其实是想做高斯模糊,但是又只找到 GetPixel的办法,但是速度又太慢了. 如果能够得到锁内存的办法就可以加快10倍甚至更高的速度. 我的操作系统是在XP下的,没办法使用GDI+2.0的高斯模糊(有办法不过那个是违反规定的不想用). 锁内存,内存复制,还有指针法我是知道的,我不知道的是高斯模糊的算法在lockbits下应该怎么写
Conmajia 2013-06-15
  • 打赏
  • 举报
回复
lock之后你还是可以getpixel。。。我猜你多半没有尝试过。。 http://bbs.csdn.net/topics/390128489 不解释。。
stonespace 2013-06-08
  • 打赏
  • 举报
回复
Img.GetPixel(i + row, j + col) i+row不太好处理,因为每个扫描线都有多余的字节,
yanghailun_ 2013-06-07
  • 打赏
  • 举报
回复
下午写了一个类似的,你参考一下这个帖子 20楼... http://bbs.csdn.net/topics/390479917
stonespace 2013-06-07
  • 打赏
  • 举报
回复
这不是写出来了吗?byte* ptr = (byte*)(bmpData.Scan0);就是指向保存颜色值的内存空间,Scan0是位图的第一条扫描线的颜色值的内存地址, ptr += bmpData.Stride - bmpData.Width * 3 ;作用是让ptr指向下一条扫描线的颜色值的存储空间的地址, 对于PixelFormat.Format24bppRgb的位图,每个颜色值用3个byte数据保存,占3字节空间,分别表示RGB颜色分量值, 你要取得第i行第j列的R颜色值,就直接:*(ptr+j*3)就可以了额,
卧_槽 2013-06-07
  • 打赏
  • 举报
回复
byte* ptr = (byte*)(bmpData.Scan0); 这里的ptr是图片锁定区域左上角像素的指针。 bitmapdata可以认为是一个byte数组。排列是按照从左至右,从上至下扫描。 如果你要找 x=10,y=8的点的像素值。 就是ptr+((height*8)+10)*像素宽度。 像素宽度与你的图片文件类型有关,有32位,24位等不同。32位就是*4,24位就是*3。 这里面太多基础知识你不懂,所以不会写。
buhnbuhn1000 2013-06-07
  • 打赏
  • 举报
回复
没有写出来 ! 关键的 Img.GetPixel(i + row, j + col) 并没有,下面的是在两个for里还有两个for for (int row = -1; row <= 1; row++) //X { for (int col = -1; col <= 1; col++) // Y { Img.GetPixel(i + row, j + col) //是这部分不知道怎么用 ptr来代替

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧