首頁 >後端開發 >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