先用ffmpeg将图像进行翻转,得到RGB32的AVFrame,然后将RGB32图像转为BMP。
翻转过程:https://blog.csdn.net/qq_36568418/article/details/113563986
BMP格式详解:https://blog.csdn.net/nicholas_duan/article/details/90717599
转换过程代码:
// bpp->BMP图像的色深,即一个像素用多少位表示,常见有1、4、8、16、24和32
// 例 RGB32,bpp = 32
int CWPlay::ReFreshFrame(AVFrame * pFrameRGB, int bpp)
{
//填充BMP图像
int width = pFrameRGB->width;
int height = pFrameRGB->height;
BITMAPFILEHEADER bmpheader;
BITMAPINFOHEADER bmpinfo;
bmpheader.bfType = 0x4d42;//必须表示"BM"
bmpheader.bfReserved1 = 0;
bmpheader.bfReserved2 = 0;
bmpheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmpheader.bfSize = bmpheader.bfOffBits + width * height*bpp / 8;
bmpinfo.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.biWidth = width;
bmpinfo.biHeight = height;
bmpinfo.biPlanes = 1;
bmpinfo.biBitCount = bpp;
bmpinfo.biCompression = BI_RGB;
bmpinfo.biSizeImage = (width*bpp + 31) / 32 * 4 * height;
bmpinfo.biXPelsPerMeter = 100;
bmpinfo.biYPelsPerMeter = 100;
bmpinfo.biClrUsed = 0;
bmpinfo.biClrImportant = 0;
if (m_hbitmap)
::DeleteObject(m_hbitmap);
CDC* dc = GetDC();
m_hbitmap = CreateDIBitmap(dc->GetSafeHdc(), //设备上下文的句柄
(LPBITMAPINFOHEADER)&bmpinfo, //位图信息头指针
(long)CBM_INIT, //初始化标志
pFrameRGB->data[0], //初始化数据指针
(LPBITMAPINFO)&bmpinfo, //位图信息指针
DIB_RGB_COLORS);
//以下将bmp图像绘制到屏幕上
CDC memDc;
memDc.CreateCompatibleDC(dc);
CRect rcClient;
GetWindowRect(rcClient);
memDc.SelectObject(m_hbitmap);
int nleft = (rcClient.Width() - width) / 2;
int top = (rcClient.Height() - height) / 2;
dc->StretchBlt(nleft, top, width, height, &memDc, 0, 0, width, height, SRCCOPY);
memDc.DeleteDC();
ReleaseDC(dc);
return 0;
}