C++ AVFrame转BMP 或者其他形式转化也可
2015-12-16 12:12
465 查看
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完后,需要释放资源,以免造成内存泄漏。 }
相关文章推荐
- 冒泡算法
- C++ Vector
- c语言数据类型及表示 l
- C++ Map
- C++系列: 如何将十六机制的字符串转成整数
- c语言中内存管理
- 23种设计模式C++实例之享元模式
- PY++ 自动将你的C++程序接口封装供python调用
- c++: allocator, uninitialized_copy, uninitialized_fill_n
- 23种设计模式C++实例之组合模式
- 23种设计模式C++实例之桥接模式
- 开发中遇到C++ 问题,记在这里,方便以后查看
- 23种设计模式C++实例之装饰模式
- 23种设计模式C++实例之代理模式
- c语言基础
- oc中new和init的区别
- 23种设计模式C++实例之适配器模式
- Blade - 腾讯开源的构建系统 c/c++编译环境
- c++11: allocator construct
- windows C++ 创建快捷方式API, 100% 能运行