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

`SetPixel` と `GetPixel` を超えて C# でのビットマップ操作を高速化するにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-19 02:27:08591ブラウズ

How Can I Speed Up Bitmap Manipulation in C# Beyond `SetPixel` and `GetPixel`?

C# ビットマップ操作の最適化: 遅い SetPixel および GetPixel

の代替案

はじめに

ビットマップ操作用の C# の組み込み GetPixel メソッドと SetPixel メソッドは、特に大きな画像を扱う場合に遅いことで有名です。この記事では、パフォーマンスを大幅に向上させる優れた代替手段を紹介します。

高性能の代替手段

3 つの主要な方法により、標準機能よりも大幅に速度が向上します。

  1. DirectBitmap Class: このカスタム クラスは、ビットマップ データへの直接的で管理されていないアクセスを提供し、ロックやコピーのオーバーヘッドを排除します。 直感的なピクセル操作のための GetPixel メソッドと SetPixel メソッドを提供します。

  2. LockBits メソッド: この組み込みメソッドは、生データに直接アクセスできるように、メモリ内のビットマップのセクションをロックします。 SetPixel/GetPixel よりも高速ですが、明示的なロックとロック解除が必要なため、パフォーマンスに若干のコストがかかります。

  3. 安全でないコード ブロック: このアプローチでは、安全でないポインターを利用してメモリを直接操作します。 潜在的に最速ですが、メモリの破損を防ぐために慎重な取り扱いが必要です。この方法は、経験豊富な開発者に最適です。

パフォーマンス ベンチマーク

パフォーマンスは画像サイズと特定の操作によって異なります。 一般に、DirectBitmapLockBits を上回り、より大きなビットマップでは SetPixel/GetPixel を劇的に上回ります。 次の表は、パフォーマンスの違いを示しています:

Method 4x4 16x16 64x64 256x256 1024x1024 4096x4096
DirectBitmap 2 28 668 8219 178639
LockBits 2 3 33 670 9612 197115
SetPixel 45 371 5920 97477 1563171 25811013

コードサンプル: DirectBitmap

DirectBitmap クラスはピクセルへのアクセスを簡素化します:

<code class="language-csharp">public void SetPixel(int x, int y, Color colour)
public Color GetPixel(int x, int y)</code>

使用例:

<code class="language-csharp">var dbm = new DirectBitmap(width, height);
dbm.SetPixel(x, y, Color.Red);
Color c = dbm.GetPixel(x, y);</code>

結論

大きなビットマップで最適なパフォーマンスを実現するために、DirectBitmap クラスは魅力的なソリューションを提供し、従来の方法に比べて速度が大幅に向上します。 LockBits は速度と使いやすさの間でバランスの取れた妥協点を提示しますが、安全でないコードは最速の可能性がありますが、慎重な実装が必要です。

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

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