Bitmap图片处理的效率

  1. 在对图片进行处理时,如果每次都对 Bitmap 的对象直接处理,效率不高

    原因:因为 bitmap 存储在内存中时,它的每一个像素点是被压缩编码过的,这种编码方式使得直接对其操作需要进行解压缩、编码等操作,增加了处理的时间和复杂度。而对于一些常见的图像处理操作(如旋转、裁剪、缩放等),可以使用一些专门优化过的算法,避免直接对位图数据进行操作,从而提高处理效率。此外,还可以使用硬件加速技术(如使用GPU)来加速位图处理。

  2. 改进的一些方法,在每次处理图像之前,对其进行 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;
  3. 内存释放问题

  4. SrcBmp.UnlockBits(SrcBmpData); 记得要释放图像,才能对 SrcBmp 进行操作

  5. test1