C# 从数组创建位图对象

C# 从数组创建位图对象,c#,winforms,bitmap,C#,Winforms,Bitmap,我有一个类似于字节[]像素的数组。是否有任何方法可以从像素创建位图对象而不复制数据?我有一个小的图形库,当我需要在WinForms窗口上显示图像时,我只需将该数据复制到bitmap对象,然后使用draw方法。我可以避免这个复制过程吗?我记得我在什么地方见过它,但也许我的记忆力不好 编辑:我尝试了这个代码,它的工作,但这是安全的 byte[] pixels = new byte[10 * 10 * 4]; pixels[4] = 255; // set 1 pixel pixels[5] = 2

我有一个类似于
字节[]像素的数组。是否有任何方法可以从
像素创建
位图
对象而不复制数据?我有一个小的图形库,当我需要在
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);

有一个构造函数接受指向原始图像数据的指针:

例如:

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;
你就不能用:

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

我认为这些方法调用不会进行任何复制,因为MSDN中没有任何指示:

这有点相关,我认为:当我尝试绘制newBitmap时,它会引发访问冲突:/它说应该从Paint方法(PaintEventArgs)调用它。许多人似乎忽略了一个事实,即FromStream方法希望流包含位图标题信息以及RGB或像素值。