3

私はのような配列を持っていbyte[] pixelsます。データをコピーせずにそこbitmapからオブジェクトを作成する方法はありますか?pixels私は小さなグラフィックライブラリを持っています。WinFormsウィンドウに画像を表示する必要がある場合は、そのデータをbitmapオブジェクトにコピーしてから、drawメソッドを使用します。このコピープロセスを回避できますか?どこかで見たのを覚えていますが、記憶が悪いのかもしれません。

編集:私はこのコードを試しましたが、動作しますが、これは安全ですか?

byte[] pixels = new byte[10 * 10 * 4];

pixels[4] = 255; // set 1 pixel
pixels[5] = 255;
pixels[6] = 255;
pixels[7] = 255;

// do some tricks
GCHandle pinnedArray = GCHandle.Alloc(pixels, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();

// create a new bitmap.
Bitmap bmp = new Bitmap (10, 10, 4*10, PixelFormat.Format32bppRgb, pointer);

Graphics grp = this.CreateGraphics ();
grp.DrawImage (bmp, 0, 0);

pixels[4+12] = 255; // add a pixel
pixels[5+12] = 255;
pixels[6+12] = 255;
pixels[7+12] = 255;

grp.DrawImage (bmp, 0, 40);
4

2 に答える 2

6

生の画像データへのポインターを取るコンストラクターがあります。

ビットマップ コンストラクター (Int32、Int32、Int32、PixelFormat、IntPtr)

例:

byte[] _data = new byte[]
{
    255, 0, 0, 255, // Blue
    0, 255, 0, 255, // Green
    0, 0, 255, 255, // Red
    0, 0, 0, 255,   // Black
};

var arrayHandle = System.Runtime.InteropServices.GCHandle.Alloc(_data,
        System.Runtime.InteropServices.GCHandleType.Pinned);

var bmp = new Bitmap(2, 2, // 2x2 pixels
    8,                     // RGB32 => 8 bytes stride
    System.Drawing.Imaging.PixelFormat.Format32bppArgb,
    arrayHandle.AddrOfPinnedObject()
);

this.BackgroundImageLayout = ImageLayout.Stretch;
this.BackgroundImage = bmp;
于 2012-08-16T14:39:01.083 に答える
0

あなたはただ使うことができませんでした:

System.Drawing.Bitmap.FromStream(new MemoryStream(bytes));

MSDNには何も示されていないため、これらのメソッド呼び出しはコピーを行わないと思います:http://msdn.microsoft.com/en-us/library/9a84386f

于 2012-08-16T14:51:28.517 に答える