C++ AVFrame转BMP 或者其他形式转化也可
void CffmpegUIDlg::SaveAsBMP(AVFrame *pFrameRGB, int width, int height, int index, 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完后,需要释放资源,以免造成内存泄漏。 }