我正在制作视频播放器。因为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
我尝试首先创建图像而不是将数据复制到图像。但它也不起作用。它将第一行复制到所有行。
左图像是原始图像,右图是通过字节数组复制创建的。我使用以下代码来创建此图像。
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 :(得分: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添加到上一行的起始地址,以找到下一行的开始。"这意味着它不断从同一个内存地址中获取行,解释了为什么你看到"第一行重复"。