在 C# 中最佳化點陣圖處理
簡介
對於影像處理任務,有效處理 Bitmap 物件中的像素資料至關重要。 但是,標準 Bitmap.GetPixel()
和 Bitmap.SetPixel()
方法在處理大圖像時可能會非常慢。本文探討了透過有效地將點陣圖資料與位元組數組相互轉換來顯著提高效能的技術。
高速位圖到位元組數組的轉換:不安全碼
不安全程式碼提供直接記憶體訪問,從而可以更快地操作原始像素資料。 透過使用BitmapData
和LockBits
,您可以獲得指向點陣圖第一條掃描線的指標。 然後,指針算術允許透過每個像素進行有效迭代,存取各個 RGB 位元組組件。
不安全程式碼範例:
<code class="language-csharp">public unsafe Image ThresholdUA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // ... pixel processing using pointer arithmetic ... b.UnlockBits(bData); return b; }</code>
託管位圖到位元組數組的轉換:封送處理
編組提供了一種更安全、託管的替代方案,用於將點陣圖資料轉換為位元組數組。 Marshal.Copy()
有效地將像素資料從 BitmapData.Scan0
指標複製到預先分配的位元組數組。 處理完畢後,用同樣的方法將修改後的資料複製回來。
編組範例:
<code class="language-csharp">public Image ThresholdMA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); // ... process byte array data ... Marshal.Copy(data, 0, bData.Scan0, data.Length); b.UnlockBits(bData); return b; }</code>
效能分析
不安全程式碼和封送處理之間的最佳選擇取決於應用程式的效能需求。 不安全程式碼提供卓越的速度,但需要仔細處理以防止記憶體錯誤。 編組較安全,但效能稍差。 應根據項目的具體需求選擇最佳方法。
以上是如何使用不安全程式碼或封送處理在 C# 中加速位圖處理?的詳細內容。更多資訊請關注PHP中文網其他相關文章!