SetPixel
和 GetPixel
經常用於 Windows 窗體中的像素級位圖操作,但它們的性能非常差,特別是對於較大的圖像或頻繁的操作。 本文探討了更快的替代方案。
DirectBitmap 類別
一個高效率的解決方案是 DirectBitmap
類別。 此類利用固定內存,無需使用 LockBits
或 SetPixel
即可直接存取點陣圖資料。 這種對原始點陣圖資料的直接存取顯著提高了效能。
基於位元組的原始像素資料
可以透過將原始像素資料表示為位元組而不是整數來實現進一步的最佳化。這會將資料格式轉換為 ARGB(Alpha/Red/Green/Blue),每個像素消耗 4 個位元組。 這需要相應地調整 GetPixel
和 SetPixel
函數。
使用 DirectBitmap
類別有以下主要優點:
IDisposable
,類似於Bitmap
,最大限度地減少物件管理開銷。 unsafe
程式碼區塊。 DirectBitmap
使用的固定記憶體有一個限制:它是不可移動的。固定記憶體存取的這種固有特徵會影響垃圾收集效率。 因此,僅在性能至關重要時才明智地使用此技術,並始終確保正確處理以解鎖記憶體。
儘管 DirectBitmap
提供了直接訪問,Graphics
物件仍然是點陣圖操作的可行工具。
DirectBitmap
、LockBits
和 SetPixel
的比較揭示了巨大的性能差異,特別是對於較大的圖像:
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
類別明顯優於 LockBits
和 SetPixel
,特別是在處理較大影像時。
以上是如何加快 Windows 窗體應用程式中的像素操作?的詳細內容。更多資訊請關注PHP中文網其他相關文章!