ホームページ >バックエンド開発 >C++ >パフォーマンスを向上させるために C# でのビットマップ操作を最適化するにはどうすればよいですか?

パフォーマンスを向上させるために C# でのビットマップ操作を最適化するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-21 13:26:10409ブラウズ

How Can I Optimize Bitmap Manipulation in C# for Better Performance?

C# ビットマップ処理パフォーマンスを向上させるヒント

ビットマップ ピクセルに直接アクセスして変更することは、特に標準の Bitmap.GetPixel() メソッドと Bitmap.SetPixel() メソッドを使用する場合、大量の計算を必要とする操作です。パフォーマンスを向上させるには、次のテクニックを検討してください:

ビットマップをバイト配列に変換し、その逆を行います

ビットマップ ピクセルに対する高速バッチ操作の場合、ビットマップをバイト配列に変換し、生のピクセル データを直接処理できます。これにより、個々のピクセル アクセスのオーバーヘッドが回避され、実行時間が大幅に短縮されます。

次のコードは、ビットマップをバイト配列に変換する方法を示しています。

<code class="language-csharp">public static byte[] BitmapToByteArray(Bitmap bitmap)
{
    int size = bitmap.Width * bitmap.Height * 4; // 假设为32位RGBA格式
    byte[] data = new byte[size];

    BitmapData bData = bitmap.LockBits(
        new Rectangle(0, 0, bitmap.Width, bitmap.Height),
        ImageLockMode.ReadOnly,
        PixelFormat.Format32bppArgb);

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

    return data;
}</code>

次のコードは、バイト配列をビットマップに変換する方法を示しています。

<code class="language-csharp">public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height)
{
    int size = width * height * 4; // 假设为32位RGBA格式
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);

    BitmapData bData = bitmap.LockBits(
        new Rectangle(0, 0, width, height),
        ImageLockMode.WriteOnly,
        PixelFormat.Format32bppArgb);

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

    return bitmap;
}</code>

安全でないコードを使用してピクセル データに直接アクセスする

最高のパフォーマンスを得るには、安全でないコードを使用してビットマップ ピクセル データに直接アクセスできます。これにより、マーシャリングのオーバーヘッドが回避され、可能な限り最速のアクセス速度が提供されます。

次のコードは、安全でないコードを使用してビットマップ ピクセルを変更する例を示しています。

<code class="language-csharp">public unsafe void ModifyPixelsUnsafe(Bitmap bitmap)
{
    BitmapData bData = bitmap.LockBits(
        new Rectangle(0, 0, bitmap.Width, bitmap.Height),
        ImageLockMode.ReadWrite,
        PixelFormat.Format32bppArgb);

    byte* scan0 = (byte*)bData.Scan0.ToPointer();
    // ... 直接操作 scan0 指针访问像素数据 ...
}</code>
安全でないコードは、誤って使用するとメモリ破損を引き起こす可能性があるため、注意して使用する必要があることに注意してください。

以上がパフォーマンスを向上させるために C# でのビットマップ操作を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。