3

LockedBitmapC# でのビットマップ データの操作を簡素化するクラスを使用しています。現在、データをローカルbyte[]配列にコピーしています。これは、クラス メソッドによってアクセスされ、ピクセルの色の値を取得/設定します。

これは、ポインタを介してロックされたビットマップ データに直接アクセスするよりも高速または優れていますか? コピーはまったく必要ですか?

編集:ビットマップデータを直接操作できるかどうかは尋ねていません。私はこれを毎日使用しています。2つの方法の比較と、ピクセルデータをコピーする必要があるかどうかを尋ねているだけです。


ピクセル データを一時配列にコピーする:

// create byte array to copy pixel values
int step = Depth / 8;
Pixels = new byte[PixelCount * step];
Iptr = bitmapData.Scan0;

// Copy data from pointer to array
Marshal.Copy(Iptr, Pixels, 0, Pixels.Length);

ピクセル値の直接読み取り:

byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
int ws = bmData.Stride;
byte* row = &p[i * ws];
byte Gcolor = row[j];
byte Bcolor = row[j + 1];
byte Rcolor = row[j + 2];
4

2 に答える 2

3

これは、ポインターを介してロックされたビットマップ データに直接アクセスするよりも高速または優れていますか?

いいえ。追加のコピー操作が必要です。次に、処理された値をビットマップにコピーする別の操作が必要です。

コピーはまったく必要ですか?

unsafeコードが望ましくないか利用できない環境でのみ。

于 2013-02-12T15:41:17.400 に答える
2

ビットマップ データをコピーせずに直接操作できます。以下は、顧客の 16bpp グレー スケール形式を表示可能なビットマップに取り込むために使用したコードの一部です。

    Rectangle rect = new Rectangle(0, 0, bmOut.Width, bmOut.Height);
    System.Drawing.Imaging.BitmapData bmpData =
        bmOut.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
        bmOut.PixelFormat);
    IntPtr ptr = bmpData.Scan0;
    Byte[] bytes;

    bytes = rawIn.ReadBytes(framesize);

    for (int x = 0; x < bytes.Length; x += 2)
    {
        short[] rgb = new short[3];
        int value = bytes[x + 1] * 256 + bytes[x];
        //value = value / 32;
        value = iMax * (value - iMin) / (iMax - iMin);

        if (value < iMin)
        {
            value = iMin;
        }
        else if (value > iMax)
        {
            value = iMax;
        }

        value = 65536 * (value - iMin) / (iMax - iMin);

        rgb[0] = rgb[1] = rgb[2] = (short)(value);
        System.Runtime.InteropServices.Marshal.Copy(rgb, 0, ptr + (x) * 3, 3);

    }
    bmOut.UnlockBits(bmpData);

キーは、LockBitsUnlockBits

簡単に説明すると、ファイルから に 16bpp を読み込みbytes、16 ビットを に再構築していますvalue。次に、外部から提供さiMiniMaxたスケーリングを使用して、適切なシェーディングを取得します。次に、そのシングルvalueを取得してRGBを構築し、を使用しMarshal.Copyてビットマップに配置します。

于 2013-02-12T14:25:33.197 に答える