C# でのビットマップ操作の最適化: SetPixel および GetPixel の優れた代替手段
C# の SetPixel
メソッドと GetPixel
メソッドは、ビットマップ操作が遅いことで有名です。この記事では、より高速で効率的な代替手段を紹介します。
SetPixel/GetPixel の非効率性
次のコードは、SetPixel
と GetPixel
の従来の非効率的な使用例を示しています。
<code class="language-csharp">// Inefficient code using SetPixel and GetPixel</code>
このアプローチでは、GetPixel
と SetPixel
への多数の呼び出しにより、重大なオーバーヘッドが発生します。
DirectBitmap クラス: 高性能ソリューション
非常に効果的な代替手段は、ビットマップの生データへの直接アクセスを提供する DirectBitmap
クラスです。これにより、GetPixel
と SetPixel
の必要性が回避され、大幅なパフォーマンスの向上につながります。 DirectBitmap
を使用して長方形を描画する例:
<code class="language-csharp">using (var g = Graphics.FromImage(dbm.Bitmap)) { g.DrawRectangle(Pens.Black, new Rectangle(50, 50, 100, 100)); }</code>
バイト配列によるメモリの最適化
メモリ使用量が最重要であるアプリケーションの場合、整数配列の代わりにバイト配列を利用するように DirectBitmap
クラスを適応させることができます。
<code class="language-csharp">Bits = new byte[width * height * 4];</code>
DirectBitmap クラスの利点:
LockBits
の必要性がなくなり、ガベージ コレクションのオーバーヘッドが削減されます。Bitmap
プロパティを保持します。重要な考慮事項:
DirectBitmap
インスタンスを破棄してください。パフォーマンス ベンチマークの比較
ベンチマーク テストは、従来の DirectBitmap
/SetPixel
および GetPixel
メソッドと比較して、LockBits
の優れたパフォーマンスを明らかに示しています。
<code>| Method | 4x4 | 16x16 | 64x64 | 256x256 | 1024x1024 | 4096x4096 | |--------------|---------|----------|----------|-----------|------------|------------| | DirectBitmap | | | | | | |</code>
結論
DirectBitmap
クラスは、C# の従来のビットマップ操作メソッドに比べてパフォーマンスが大幅に向上しています。 生データへの直接アクセスと GetPixel
/SetPixel
呼び出しの回避により、パフォーマンス重視のアプリケーションにとって理想的な選択肢となります。
以上がSetPixel と GetPixel を超えて C# でのビットマップ操作を高速化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。