SetPixel
と GetPixel
は、Windows フォームでのピクセル レベルのビットマップ操作によく使用されますが、特に大きな画像や頻繁な操作の場合、パフォーマンスが低いことで知られています。 この記事では、より高速な代替手段について説明します。
DirectBitmap クラス
非常に効率的なソリューションは DirectBitmap
クラスです。 このクラスは固定メモリを利用し、LockBits
や SetPixel
を必要とせずにビットマップ データへの直接アクセスを許可します。 この生のビットマップ データへの直接アクセスにより、パフォーマンスが大幅に向上します。
バイトベースの生ピクセルデータ
生のピクセル データを整数ではなくバイトとして表すことで、さらに最適化できます。これにより、データ形式が ARGB (アルファ/レッド/グリーン/ブルー) に移行し、各ピクセルが 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 中国語 Web サイトの他の関連記事を参照してください。