C# でのビットマップ処理の最適化
はじめに
画像処理タスクでは、ビットマップ オブジェクト内のピクセル データを効率的に処理することが重要です。 ただし、標準の Bitmap.GetPixel()
メソッドと Bitmap.SetPixel()
メソッドは、大きな画像を処理する場合に大幅に遅くなる可能性があります。この記事では、ビットマップ データとバイト配列の間の効率的な変換により、パフォーマンスを大幅に向上させる手法について説明します。
高速ビットマップから ByteArray への変換: 安全でないコード
安全でないコードはメモリへの直接アクセスを提供し、生のピクセル データをより高速に操作できるようにします。 BitmapData
と LockBits
を使用すると、ビットマップの最初のスキャンラインへのポインターを取得できます。 ポインタ演算により、各ピクセルの効率的な反復が可能になり、個々の RGB バイト コンポーネントにアクセスできます。
安全でないコードの例:
<code class="language-csharp">public unsafe Image ThresholdUA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); byte* scan0 = (byte*)bData.Scan0.ToPointer(); // ... pixel processing using pointer arithmetic ... b.UnlockBits(bData); return b; }</code>
マネージド ビットマップから ByteArray への変換: マーシャリング
マーシャリングは、ビットマップ データをバイト配列に変換するための、より安全な管理された代替手段を提供します。 Marshal.Copy()
は、ピクセル データを BitmapData.Scan0
ポインタから事前に割り当てられたバイト配列に効率的にコピーします。 処理後、変更されたデータは同じ方法でコピーされます。
マーシャリングの例:
<code class="language-csharp">public Image ThresholdMA(float thresh) { Bitmap b = new Bitmap(_image); BitmapData bData = b.LockBits(new Rectangle(0, 0, _image.Width, _image.Height), ImageLockMode.ReadWrite, b.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); // ... process byte array data ... Marshal.Copy(data, 0, bData.Scan0, data.Length); b.UnlockBits(bData); return b; }</code>
パフォーマンス分析
安全でないコードとマーシャリングの最適な選択は、アプリケーションのパフォーマンスのニーズによって異なります。 安全でないコードは速度に優れていますが、メモリ エラーを防ぐために慎重な処理が必要です。 マーシャリングは安全ですが、パフォーマンスがわずかに低下します。 プロジェクトの具体的な要求に基づいて最適な方法を選択する必要があります。
以上が安全でないコードまたはマーシャリングを使用して C# でビットマップ処理を高速化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。