首頁 > 後端開發 > C++ > 如何加快 C# 中的點陣圖操作速度?

如何加快 C# 中的點陣圖操作速度?

Linda Hamilton
發布: 2025-01-21 13:41:09
原創
573 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板