C# ビットマップ操作の最適化: 遅い SetPixel
および GetPixel
はじめに
ビットマップ操作用の C# の組み込み GetPixel
メソッドと SetPixel
メソッドは、特に大きな画像を扱う場合に遅いことで有名です。この記事では、パフォーマンスを大幅に向上させる優れた代替手段を紹介します。
高性能の代替手段
3 つの主要な方法により、標準機能よりも大幅に速度が向上します。
DirectBitmap Class: このカスタム クラスは、ビットマップ データへの直接的で管理されていないアクセスを提供し、ロックやコピーのオーバーヘッドを排除します。 直感的なピクセル操作のための GetPixel
メソッドと SetPixel
メソッドを提供します。
LockBits メソッド: この組み込みメソッドは、生データに直接アクセスできるように、メモリ内のビットマップのセクションをロックします。 SetPixel
/GetPixel
よりも高速ですが、明示的なロックとロック解除が必要なため、パフォーマンスに若干のコストがかかります。
安全でないコード ブロック: このアプローチでは、安全でないポインターを利用してメモリを直接操作します。 潜在的に最速ですが、メモリの破損を防ぐために慎重な取り扱いが必要です。この方法は、経験豊富な開発者に最適です。
パフォーマンス ベンチマーク
パフォーマンスは画像サイズと特定の操作によって異なります。 一般に、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 中国語 Web サイトの他の関連記事を参照してください。