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

C# でビットマップを効率的に操作するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-21 13:36:10
オリジナル
413 人が閲覧しました

How Can I Efficiently Manipulate Bitmaps in C#?

C# での高速ビットマップ処理

大きなビットマップを操作する場合、ピクセルごとにアクセスして操作を実行すると、パフォーマンスに影響を与える可能性があります。 C# の組み込み Bitmap.GetPixel() メソッドと Bitmap.SetPixel() メソッドは便利ですが、時間がかかります。この記事では、ビットマップをバイト配列にすばやく変換し、ビットマップに戻す別の方法を検討して、効率的なピクセル操作を可能にします。

ビットマップをバイト配列に変換します

  • LockBits メソッド: このメソッドにより、ビットマップの内部データ バッファーへの直接アクセスが可能になります。安全でないコードを使用すると、生のピクセル データにポインターとしてアクセスできるため、高速な操作が可能になります。ただし、このアプローチには慎重なメモリ管理が必要です。
  • マーシャリング: マーシャリングには、マネージド メモリとアンマネージド メモリ間のデータのコピーが含まれます。 Marshal.Copy() メソッドを使用すると、ピクセル データをビットマップ バッファからバイト配列にコピーできます。マーシャリングには安全でないコードは必要ありませんが、LockBits メソッドよりも若干遅くなる可能性があります。

バイト配列をビットマップに変換します

  • LockBits メソッド: バイト配列内のピクセル データを変更した後、LockBits メソッドを通じてビットマップにコピーして戻すことができます。これは、ビットマップをバイト配列に変換することに似ています。
  • マーシャリング: Marshal.Copy() メソッドを使用すると、変更されたピクセル データをバイト配列からビットマップ バッファーにコピーして戻すことができます。

パフォーマンスの比較

  • LockBits: 高速ですが、安全でないコードが必要です
  • マーシャリング: 速度は遅くなりますが、安全でないコードは必要ありません

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 サイトの他の関連記事を参照してください。

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