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

C# 如何从字节数组c创建Managed.Graphics.Direct2D.Bitmap对象#,c#,.net,bitmap,sharpdx,image-conversion,C#,.net,Bitmap,Sharpdx,Image Conversion,我正在努力制作视频播放器。我想用sharpdx sdk绘制图像,因为cpu不可用。但是我有一个isue。我得到的帧是字节数组。图像的像素格式为BGRA32。我编写了以下代码来转换它。但它给我的错误是“值不在预期范围内” 我的代码是: private Bitmap getBitmap(byte[] frame) { return RenderTarget.CreateBitmap(new SizeU((uint)img_w, (uint)img_h), frame, 0, new Bitma

我正在努力制作视频播放器。我想用sharpdx sdk绘制图像,因为cpu不可用。但是我有一个isue。我得到的帧是字节数组。图像的像素格式为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

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

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

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;
    }

最后一个参数,其中的“0”必须是源位图的“螺距”

发件人:

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

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

bmp.CopyFromMemory(new RectU(0, 0, (uint)img_w, (uint)img_h), frame, 4 * img_w);
在这里输入“0”意味着“在每一行,将0添加到上一行的起始地址,以找到下一行的起始地址”。这意味着它不断从相同的内存地址中获取行,解释为什么会看到“第一行重复”。

1)您是否验证了
frame
包含您期望的内容?也就是说,确保它不包含您看到的内容(第一行重复)。(打印出足够的字节值,以证明第二行与第一行不同。)2)尝试用随机字节填充它,看看是否再次只重复一行。3) 另外,显示显示新位图的代码行-是否有错误?