如何从字节数组c#创建Managed.Graphics.Direct2D.Bitmap对象

时间:2017-05-23 15:23:12

标签: c# .net bitmap sharpdx image-conversion

我正在制作视频播放器。因为cpu isue,我想用sharpdx sdk绘制图像。但我有一个问题。我得到帧作为字节数组。图像的像素格式是BGRA32。我写了下面的代码来转换它。但它给了我错误“价值不在预期的范围内”。

我的代码是:

private Bitmap getBitmap(byte[] frame) {
   return RenderTarget.CreateBitmap(new SizeU((uint)img_w, (uint)img_h), frame, 0, new BitmapProperties(new PixelFormat(DxgiFormat.B8G8R8A8_UNORM, AlphaMode.Ignore), 100, 100));
}

注:img_w = 720,img_h = 576,帧阵列长度= 720 * 576 * 4

我尝试首先创建图像而不是将数据复制到图像。但它也不起作用。它将第一行复制到所有行。 enter image description here

左图像是原始图像,右图是通过字节数组复制创建的。我使用以下代码来创建此图像。

private Bitmap getBitmap(byte[] frame) {
        var bmp = RenderTarget.CreateBitmap(new SizeU((uint)img_w, (uint)img_h), IntPtr.Zero, 0, new BitmapProperties(new PixelFormat(DxgiFormat.B8G8R8A8_UNORM, AlphaMode.Ignore), 100, 100));
        bmp.CopyFromMemory(new RectU(0, 0, (uint)img_w, (uint)img_h), frame, 0);

        return bmp;
    }

1 个答案:

答案 0 :(得分:1)

最后一个参数,你有" 0"需要成为"音调"源位图。

来自ID2D1Bitmap::CopyFromMemory method

  

存储在srcData中的源位图的步幅或间距。步幅是扫描线的字节数(存储器中的一行像素)。步幅可以通过以下公式计算:像素宽度*每像素字节数+内存填充。

每个像素使用4个字节,源行可能没有填充,因此请尝试4 * img_w

bmp.CopyFromMemory(new RectU(0, 0, (uint)img_w, (uint)img_h), frame, 4 * img_w);

投入" 0"这意味着"在每一行,将0添加到上一行的起始地址,以找到下一行的开始。"这意味着它不断从同一个内存地址中获取行,解释了为什么你看到"第一行重复"。