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