提升 C# 中的位图性能
对于要求高图像处理速度的应用程序,优化位图像素数据操作至关重要。虽然 Bitmap.GetPixel()
和 Bitmap.SetPixel()
足以完成简单的任务,但处理大图像或频繁修改需要更有效的方法。
直接像素数据访问
有效修改单个像素涉及将位图转换为字节数组。 最好使用 LockBits
或编组来实现这一点。
LockBits
技术:
BitmapData.LockBits()
提供指向像素数据的直接内存指针,允许快速访问。 然而,这需要使用不安全的代码并显式锁定位图。 示例:
<code class="language-csharp">unsafe Image ThresholdUA(Image image, float thresh) { Bitmap b = new Bitmap(image); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // Pixel manipulation loop using scan0 pointer... }</code>
编组安全访问:
System.Runtime.InteropServices.Marshal.Copy()
提供了一种更安全的替代方案,将像素数据传输到字节数组,而无需使用不安全的代码。 方法如下:
<code class="language-csharp">Image ThresholdMA(Image image, float thresh) { Bitmap b = new Bitmap(image); BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, size); // Pixel manipulation loop using data array... }</code>
性能比较:
由于直接内存访问,LockBits
通常优于封送处理。然而,编组可以避免不安全的代码,使其在某些情况下更可取。
结论:
使用 LockBits
或编组将位图转换为字节数组可显着提高像素操作效率,特别是对于大型或频繁处理的图像。 选择最能平衡性能和代码安全要求的方法。
以上是如何加快 C# 中的位图操作速度?的详细内容。更多信息请关注PHP中文网其他相关文章!