gpt4 book ai didi

c++ - sws_scale YUV --> RGB 失真图像

转载 作者:可可西里 更新时间:2023-11-01 16:50:47 26 4
gpt4 key购买 nike

我想将 YUV420P 图像(从 H.264 流接收)转换为 RGB,同时调整它的大小,使用 sws_scale.
原始图像的大小为 480 × 800。只需使用相同的尺寸进行转换即可。
但是,当我尝试更改尺寸时,我得到了一个扭曲的图像,具有以下模式:

  • 更改为 481 × 800 会产生扭曲的黑白图像,看起来像是在中间被切掉了
  • 482 × 800会更加扭曲
  • 483 × 800 变形但有颜色
  • 484 × 800 可以(正确缩放)。

现在遵循此模式 - 缩放仅在除以 4 之间的差异时才能正常工作。

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

int srcX = 480;
int srcY = 800;
int dstX = 481; // or 482, 483 etc
int dstY = 800;

AVFrame* avFrameYUV = avcodec_alloc_frame();
avpicture_fill((AVPicture *)avFrameYUV, decoded_yuv_frame, PIX_FMT_YUV420P, srcX , srcY);

AVFrame *avFrameRGB = avcodec_alloc_frame();

AVPacket avPacket;
av_init_packet(&avPacket);
avPacket.size = read; // size of raw data
avPacket.data = raw_data; // raw data before decoding to YUV

int frame_decoded = 0;
int decoded_length = avcodec_decode_video2(g_avCodecContext, avFrameYUV, &frame_decoded, &avPacket);
int size = dstX * dstY * 3;

struct SwsContext *img_convert_ctx = sws_getContext(srcX, srcY, SOURCE_FORMAT, dstX, dstY, PIX_FMT_BGR24, SWS_BICUBIC, NULL, NULL, NULL);

avpicture_fill((AVPicture *)avFrameRGB, rgb_frame, PIX_FMT_RGB24, dstX, dstY);
sws_scale(img_convert_ctx, avFrameYUV->data, avFrameYUV->linesize, 0, srcY, avFrameRGB->data, avFrameRGB->linesize);

// draws the resulting frame with windows BitBlt
DrawBitmap(hdc, dstX, dstY, rgb_frame, size);

sws_freeContext(img_convert_ctx);

最佳答案

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

所以你必须改变宽度,比如 480、484、488、492 ...

这里是改成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);
}

希望你能解决问题。

关于c++ - sws_scale YUV --> RGB 失真图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8494546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com