C# Graphics.DrawImage能否绘制YV12 DIB?

C# Graphics.DrawImage能否绘制YV12 DIB?,c#,.net,winforms,gdi+,dib,C#,.net,Winforms,Gdi+,Dib,我继承了一个C#.Net Windows窗体项目,该项目从托管预编译DLL接收一个与设备无关的位图(作为字节数组)。C#代码从DIB生成一个虚拟BMP文件,以便它可以创建位图,然后使用System.Drawing.Graphics.DrawImage绘制位图 using (MemoryStream ms = new MemoryStream()) { ms.Write(fileHeader, 0, fileHeader.Length); ms.Write(dibBuffer, 0

我继承了一个C#.Net Windows窗体项目,该项目从托管预编译DLL接收一个与设备无关的位图(作为字节数组)。C#代码从DIB生成一个虚拟BMP文件,以便它可以创建位图,然后使用System.Drawing.Graphics.DrawImage绘制位图

using (MemoryStream ms = new MemoryStream())
{
    ms.Write(fileHeader, 0, fileHeader.Length);
    ms.Write(dibBuffer, 0, dibBuffer.Length);
    Bitmap img = (Bitmap)Image.FromStream(ms);
    g.DrawImage(img, 0, 0, width, height);
}
如果DIB包含未压缩的像素数据,但在某些硬件上,像素数据为YV12格式,Image.FromStream会引发System.ArgumentException,我认为这表明底层代码(GDI+?)认为BMP格式无效或不受支持

在此场景中,DIB的BitMapInfo标头(前40个字节)具有以下值:

biSize: 40
biWidth:640
biHeight: 480
biPlanes: 1
biBitCount: 12
biCompression: 'YV12'
biSizeImage: 460800
biXPelsPerMeter: 0
biYPelsPerMeter: 0
biClrUsed: 0
biClrImportant: 0
  • BMP格式是否支持YV12?我找不到任何例子 图片在线

  • 是否有不同的方式处理DIB,使其适合 绘图图像?上面的代码似乎是跳转


  • 在YV12中,V(Cr)平面步幅是Y步幅的一半,因此GDI+中没有任何东西可以在不进行手动重采样的情况下处理该步幅。我认为GDI也无法在没有人工干预的情况下处理它。当然可以。IIRC,ffmpeg有一个库,
    libw
    ——提供转换功能的东西(对不起,我不记得全名);YV12应该包括在内(4:2:0下采样格式比较常见)。@Jimi,谢谢。没有人反驳过你,所以如果你把你的评论格式化为回答,我可以接受。