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