首頁 >後端開發 >C++ >除了「SetPixel」和「GetPixel」之外,如何加快 C# 中的點陣圖操作速度?

除了「SetPixel」和「GetPixel」之外,如何加快 C# 中的點陣圖操作速度?

DDD
DDD原創
2025-01-19 02:27:08550瀏覽

How Can I Speed Up Bitmap Manipulation in C# Beyond `SetPixel` and `GetPixel`?

最佳化 C# 點陣圖操作:慢 SetPixelGetPixel

的替代方案

簡介

C# 中用於點陣圖操作的內建 GetPixelSetPixel 方法非常慢,尤其是在處理較大影像時。本文提出了顯著增強性能的卓越替代方案。

高效能替代品

三種主要方法比標準函數提供了顯著的速度提升:

  1. DirectBitmap 類別: 此自訂類別提供對位圖資料的直接、非託管訪問,消除了鎖定和複製的開銷。 它提供了直觀像素操作的 GetPixelSetPixel 方法。

  2. LockBits 方法: 此內建方法將位圖的一部分鎖定在記憶體中,以便直接存取其原始資料。 雖然比 SetPixel/GetPixel 更快,但它需要明確鎖定和解鎖,從而引入較小的效能成本。

  3. 不安全程式碼區塊:這種方法利用不安全指標進行直接記憶體操作。 雖然可能是最快的,但它需要仔細處理以防止記憶體損壞;此方法最適合經驗豐富的開發人員。

效能基準

效能因影像大小和具體操作而異。 一般來說,對於較大的點陣圖,DirectBitmap 優於 LockBits,且顯著優於 SetPixel/GetPixel。 下表說明了性能差異:

Method 4x4 16x16 64x64 256x256 1024x1024 4096x4096
DirectBitmap 2 28 668 8219 178639
LockBits 2 3 33 670 9612 197115
SetPixel 45 371 5920 97477 1563171 25811013

程式碼範例:DirectBitmap

DirectBitmap 類別簡化了像素存取:

<code class="language-csharp">public void SetPixel(int x, int y, Color colour)
public Color GetPixel(int x, int y)</code>

使用範例:

<code class="language-csharp">var dbm = new DirectBitmap(width, height);
dbm.SetPixel(x, y, Color.Red);
Color c = dbm.GetPixel(x, y);</code>

結論

為了獲得大位圖的最佳效能,DirectBitmap 類別提供了一個引人注目的解決方案,與傳統方法相比,速度顯著提高。 LockBits 在速度和易用性之間實現了平衡折衷,而不安全的程式碼雖然可能最快,但需要仔細實施。

以上是除了「SetPixel」和「GetPixel」之外,如何加快 C# 中的點陣圖操作速度?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn