11

16 ビット グレースケールである必要がある .NET を使用してメモリ内の小さなビットマップをレンダリングしようとしています。ビットマップのフォーマットは PixelFormat.Format16bppGrayScale に設定されています。ただし、Bitmap.SetPixel は Color 引数を取ります。色は、R、B、および G (およびオプションで A) のそれぞれに 1 バイトを使用します。

ビットマップに描画するときに、8 ビット値ではなく 16 ビット グレー スケール値を指定するにはどうすればよいですか?

4

1 に答える 1

12

画像形式に関係なく、SetPixel()非常に遅いです。実践で使うことはありません。

LockBits メソッドを使用すると、ピクセルをはるかに高速に設定できます。これにより、マネージ データをアンマネージ ビットマップ バイトにすばやくマーシャリングできます。

これがどのように見えるかの例を次に示します。

Bitmap bitmap = // ...

// Lock the unmanaged bits for efficient writing.
var data = bitmap.LockBits(
    new Rectangle(0, 0, bitmap.Width, bitmap.Height),
    ImageLockMode.ReadWrite,
    bitmap.PixelFormat);

// Bulk copy pixel data from a byte array:
Marshal.Copy(byteArray, 0, data.Scan0, byteArray.Length);

// Or, for one pixel at a time:
Marshal.WriteInt16(data.Scan0, offsetInBytes, shortValue);

// When finished, unlock the unmanaged bits
bitmap.UnlockBits(data);

16bpp グレースケールは GDI+ でサポートされていないように見えることに注意してください。つまり、.NET は 16bpp グレースケール ビットマップをファイルまたはストリームに保存するのに役立ちません。http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/10252c05-c4b6-49dc-b2a3-4c1396e2c3abを参照してください。

于 2010-08-17T06:41:27.573 に答える