C++ sws_标度YUV-->;RGB畸变图像

C++ sws_标度YUV-->;RGB畸变图像,c++,ffmpeg,yuv,libavcodec,C++,Ffmpeg,Yuv,Libavcodec,我想将YUV420P图像(从H.264流接收)转换为RGB,同时使用sws\u比例调整其大小 原始图像的大小为480×800。仅使用相同的维度进行转换就可以了。 但当我试图改变尺寸时,我得到了一个扭曲的图像,具有以下模式: 更改为481×800将产生扭曲的黑白图像,看起来像是在中间剪切的 482×800将更加失真 483×800失真,但颜色不同 484×800正常(缩放正确) 现在,这个模式如下-只有当两者之间的差值除以4时,缩放才能正常工作 下面是我解码和转换图像的方法的示例代码。所有方法

我想将
YUV420P
图像(从
H.264
流接收)转换为
RGB
,同时使用
sws\u比例调整其大小
原始图像的大小为
480×800
。仅使用相同的维度进行转换就可以了。
但当我试图改变尺寸时,我得到了一个扭曲的图像,具有以下模式:

  • 更改为
    481×800
    将产生扭曲的黑白图像,看起来像是在中间剪切的
  • 482×800
    将更加失真
  • 483×800
    失真,但颜色不同
  • 484×800
    正常(缩放正确)
现在,这个模式如下-只有当两者之间的差值除以4时,缩放才能正常工作

下面是我解码和转换图像的方法的示例代码。所有方法都显示“成功”


制作位图图像时,图像的宽度必须是4的倍数

所以你必须改变宽度,比如48048492

下面是更改为4的倍数的方法

#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)

void main()
{
    BITMAPFILEHEADER bmFileHeader;
    BITMAPINFOHEADER bmInfoHeader;

    // load image
    // ...

    // when you use the method, put parameter like this.
    int tempWidth = WIDTHBYTES(width * bmInfoHeader.biBitCount);
}

我希望您能解决这个问题。

请随意在sws_getContext()函数中发布一个bug,您正在将格式标识符PIX_FMT_BGR24作为参数传递,而不是像在avpicture_Fill中那样将其作为参数传递。您是否曾经使用过该函数?不,它不必是4的倍数。代码片段甚至与整个内容相去甚远,因为它演示了如何对齐宽度,这与问题无关。
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)

void main()
{
    BITMAPFILEHEADER bmFileHeader;
    BITMAPINFOHEADER bmInfoHeader;

    // load image
    // ...

    // when you use the method, put parameter like this.
    int tempWidth = WIDTHBYTES(width * bmInfoHeader.biBitCount);
}