【问题标题】:How create Managed.Graphics.Direct2D.Bitmap object from byte array c#如何从字节数组 c# 创建 Managed.Graphics.Direct2D.Bitmap 对象
【发布时间】:2017-05-23 15:23:11
【问题描述】:

我正在制作视频播放器。由于 cpu 问题,我想用 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;
    }

【问题讨论】:

  • 1) 您是否确认frame 包含您所期望的内容?也就是说,确保它不包含您所看到的内容(第一行重复)。 (打印出足够多的字节值来证明第二行与第一行不同。) 2) 尝试用随机字节填充它,看看是否再次得到重复的一行。 3) 另外,显示你的代码行 显示 新位图 - 那里可能有问题吗?

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


【解决方案1】:

最后一个参数,你有“0”的地方需要是源位图的“pitch”。

来自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,找到下一行的起始”。这意味着它不断从同一个内存地址获取行,解释了为什么你会看到“第一行重复”。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2010-09-26
    • 2011-09-28
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多