BitmapData
Bitmap图片处理的效率
在对图片进行处理时,如果每次都对 Bitmap 的对象直接处理,效率不高
原因:因为 bitmap 存储在内存中时,它的每一个像素点是被压缩编码过的,这种编码方式使得直接对其操作需要进行解压缩、编码等操作,增加了处理的时间和复杂度。而对于一些常见的图像处理操作(如旋转、裁剪、缩放等),可以使用一些专门优化过的算法,避免直接对位图数据进行操作,从而提高处理效率。此外,还可以使用硬件加速技术(如使用GPU)来加速位图处理。
改进的一些方法,在每次处理图像之前,对其进行 lock ,生成对应的 BitmapData 对象
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmd = bmp.LockBits(rect, ImageLockMode.ReadWrite, bmp.PixelFormat);类似于上面这种
注:BitmapData 类是将 Bitmap 里面的像素映射成为一个一维数组,Bitmap 中一个像素为 4bytes ,分别对应为 ARGB ,而 BitmapData 中 4bytes 中颜色的排列顺序为 BGRA 。
- Scan0 是该一维数组对应的首地址,采用
BYTE* m_p=(BYTE*)srcBitmapData.Scan0;
就可以按颜色对一维数组中的像素进行访问。例如:*m_p
为蓝色,*(m_p+1)
为绿色 srcBitmapData.Width
,srcBitmapData.Height
, 分别为原来二维数组中的宽、高srcBitmapData.Stride
, 为一行的字节数,且为4的整数倍,如果不足末尾会不成4的倍数。故对 Bitmap 中的 [i][j]处的蓝色可以这样访问(j*srcBitmapData.Stride)+4*i;
- Scan0 是该一维数组对应的首地址,采用
内存释放问题
SrcBmp.UnlockBits(SrcBmpData);
记得要释放图像,才能对 SrcBmp 进行操作test1
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 银河系漫游指南!
评论