您的位置:首页 > 其它

ffmpeg AVFrame转BMP 或者其他形式转化也可

2016-11-25 13:40 169 查看
void CffmpegUIDlg::SaveAsBMP(AVFrame *pFrameRGB, int width, int height, int bpp)
{
BITMAPFILEHEADER bmpheader;
BITMAPINFOHEADER bmpinfo;

bmpheader.bfType = 0x4d42;
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;

DWORD dwInfoSize = width*height*bpp / 8;
HGLOBAL hGlobal = GlobalAlloc( GMEM_MOVEABLE, sizeof(bmpheader) + sizeof(bmpinfo) + dwInfoSize);
BYTE *pvData = (BYTE*)GlobalLock( hGlobal );
memcpy(pvData, &bmpheader, sizeof(bmpheader));
memcpy(pvData + sizeof(bmpheader), &bmpinfo, sizeof(bmpinfo));
memcpy(pvData + sizeof(bmpheader) + sizeof(bmpinfo), pFrameRGB->data[0], dwInfoSize);
GlobalUnlock( hGlobal );

Gdiplus::Graphics graphics(hdcClient);
IStream *pStream = NULL;
HRESULT hr = CreateStreamOnHGlobal( hGlobal,  TRUE,  &pStream );
Gdiplus::Bitmap bmp(pStream);
graphics.DrawImage(&bmp, 0, 0);
GlobalFree( hGlobal ); // 使用Bitmap完后,需要释放资源,以免造成内存泄漏。
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: