首页 >后端开发 >C++ >如何加快 C# 中的位图操作速度?

如何加快 C# 中的位图操作速度?

Linda Hamilton
Linda Hamilton原创
2025-01-21 13:41:09575浏览

How Can I Speed Up Bitmap Manipulation in C#?

提升 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn