ホームページ > バックエンド開発 > C++ > C# でビットマップ操作を高速化するにはどうすればよいですか?

C# でビットマップ操作を高速化するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-21 13:41:09
オリジナル
573 人が閲覧しました

How Can I Speed Up Bitmap Manipulation in C#?

C# でのビットマップのパフォーマンスの向上

高い画像処理速度を要求するアプリケーションでは、ビットマップ ピクセル データ操作の最適化が重要です。単純なタスクには Bitmap.GetPixel()Bitmap.SetPixel() で十分ですが、大きな画像や頻繁な変更を処理するには、より効率的なアプローチが必要です。

ピクセル データへの直接アクセス

個々のピクセルを効率的に変更するには、ビットマップをバイト配列に変換する必要があります。 これは、LockBits またはマーシャリングを使用して実現するのが最適です。

LockBits テクニック:

BitmapData.LockBits() はピクセル データへのダイレクト メモリ ポインタを提供し、迅速なアクセスを可能にします。 ただし、これには安全でないコードを使用し、ビットマップを明示的にロックする必要があります。 例:

<code class="language-csharp">unsafe Image ThresholdUA(Image image, float thresh)
{
    Bitmap b = new Bitmap(image);
    BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);

    byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
    byte* scan0 = (byte*)bData.Scan0.ToPointer();

    // Pixel manipulation loop using scan0 pointer...
}</code>
ログイン後にコピー

安全なアクセスのためのマーシャリング:

System.Runtime.InteropServices.Marshal.Copy() は、安全でないコードを使用せずにピクセル データをバイト配列に転送する、より安全な代替手段を提供します。 その方法は次のとおりです:

<code class="language-csharp">Image ThresholdMA(Image image, float thresh)
{
    Bitmap b = new Bitmap(image);
    BitmapData bData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);

    byte bitsPerPixel = GetBitsPerPixel(bData.PixelFormat);
    int size = bData.Stride * bData.Height;
    byte[] data = new byte[size];

    System.Runtime.InteropServices.Marshal.Copy(bData.Scan0, data, 0, size);

    // Pixel manipulation loop using data array...
}</code>
ログイン後にコピー

パフォーマンスの比較:

LockBits は、直接メモリ アクセスを行うため、一般的にマーシャリングよりも優れたパフォーマンスを発揮します。ただし、マーシャリングにより安全でないコードが回避されるため、特定のコンテキストでは推奨されます。

結論:

LockBits またはマーシャリングを使用してビットマップをバイト配列に変換すると、特に大きな画像や頻繁に処理される画像の場合、ピクセル操作の効率が大幅に向上します。 パフォーマンスとコードの安全性要件のバランスが最適な方法を選択してください。

以上がC# でビットマップ操作を高速化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート