C# での高速ビットマップ処理
大きなビットマップを操作する場合、ピクセルごとにアクセスして操作を実行すると、パフォーマンスに影響を与える可能性があります。 C# の組み込み Bitmap.GetPixel()
メソッドと Bitmap.SetPixel()
メソッドは便利ですが、時間がかかります。この記事では、ビットマップをバイト配列にすばやく変換し、ビットマップに戻す別の方法を検討して、効率的なピクセル操作を可能にします。
ビットマップをバイト配列に変換します
Marshal.Copy()
メソッドを使用すると、ピクセル データをビットマップ バッファからバイト配列にコピーできます。マーシャリングには安全でないコードは必要ありませんが、LockBits メソッドよりも若干遅くなる可能性があります。 バイト配列をビットマップに変換します
Marshal.Copy()
メソッドを使用すると、変更されたピクセル データをバイト配列からビットマップ バッファーにコピーして戻すことができます。 パフォーマンスの比較
LockBits メソッドの例
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public unsafe class FastBitmap { public static 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(); for (int i = 0; i < ... }</code>
マーシャリング方法の例
<code class="language-csharp">using System; using System.Drawing; using System.Runtime.InteropServices; public class FastBitmap { public static 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); byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat); int size = bData.Stride * bData.Height; byte[] data = new byte[size]; Marshal.Copy(bData.Scan0, data, 0, size); for (int i = 0; i < ... }</code>
以上がC# でビットマップを効率的に操作するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。