簡體   English   中英

sws_scale YUV --> RGB 失真圖像

[英]sws_scale YUV --> RGB distorted image

我想將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);
}

我希望你能解決問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM