24位RGB数据保存为BMP图片
2016-05-10 14:59
387 查看
在做Qt与ffmpeg结合的视频播放器时,由于解码后是RGB24数据格式,不知道解码的数据是否正确,于是在网上找了很久才找到一个RGB24转bmp文件的方法,于是尝试了一下,发现生成的bmp文件是电影中的片段截图,才知道解码的RGB24数据是正确的,最终才成功用Qt显示出视频图像。
以下代码为转载的,原文地址:
http://blog.csdn.net/wesleyluo/article/details/6561518
以下代码为转载的,原文地址:
http://blog.csdn.net/wesleyluo/article/details/6561518
bool SaveDIB2Bmp(int fileNum, const char * fileName, const char * filePath, int iWidth, int iHeight, BYTE *pBuffer) { BITMAPINFOHEADER bih; ConstructBih(iWidth,iHeight,bih); BITMAPFILEHEADER bhh; ContructBhh(iWidth,iHeight,bhh); CHAR BMPFileName[1024]; int widthStep = (((iWidth * 24) + 31) & (~31)) / 8 ; //每行实际占用的大小(每行都被填充到一个4字节边界) int DIBSize = widthStep * iHeight ; //buffer的大小 (字节为单位) //save char path[1024]; char str[1024]; char num[10]; sprintf(num,"%d",fileNum); sprintf(str, fileName); strcat(str, num); strcat(str,".bmp"); //frame100.bmp sprintf(path,"%s", filePath); strcat(path,str); //Path//frame100.bmp strcpy(BMPFileName,path); FILE *file; if(file = fopen(BMPFileName, "wb")) {//写入文件 fwrite((LPSTR)&bhh,sizeof(BITMAPFILEHEADER), 1, file); fwrite((LPSTR)&bih,sizeof(BITMAPINFOHEADER), 1, file); fwrite(pBuffer, sizeof(char), DIBSize, file); fclose(file); return true; } return false; } //构建BMP位图文件头 void ContructBhh(int nWidth,int nHeight,BITMAPFILEHEADER& bhh) //add 2010-9-04 { int widthStep = (((nWidth * 24) + 31) & (~31)) / 8 ; //每行实际占用的大小(每行都被填充到一个4字节边界) bhh.bfType = ((WORD) ('M' << 8) | 'B'); //'BM' bhh.bfSize = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + widthStep * nHeight; bhh.bfReserved1 = 0; bhh.bfReserved2 = 0; bhh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); } //构建BMP文件信息头 void ConstructBih(int nWidth,int nHeight,BITMAPINFOHEADER& bih) { int widthStep = (((nWidth * 24) + 31) & (~31)) / 8 ; bih.biSize=40; // header size bih.biWidth=nWidth; bih.biHeight=nHeight; bih.biPlanes=1; bih.biBitCount=24; // RGB encoded, 24 bit bih.biCompression=BI_RGB; // no compression 非压缩 bih.biSizeImage=widthStep*nHeight*3; bih.biXPelsPerMeter=0; bih.biYPelsPerMeter=0; bih.biClrUsed=0; bih.biClrImportant=0; }
相关文章推荐
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- Managed Media Aggregation using Rtsp and Rtp
- QT学习 第一章:基本对话框
- 使用Shiboken为C++和Qt库创建Python绑定
- [总结]FFMPEG视音频编解码零基础学习方法
- Qt 5.6更新至RC版,最终版本近在咫尺
- 获取图片宽度和高度的类,支持JPG,GIF,PNG,BMP
- C语言实现BMP转换JPG的方法
- 利用Ffmpeg获得flv视频缩略图和视频时间的代码
- JavaScript实现把rgb颜色转换成16进制颜色的方法
- JavaScript 十六进制RGB色码转换器
- Qt定时器和随机数详解
- codeigniter教程之上传视频并使用ffmpeg转flv示例
- RGB 加成色 说明
- php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
- php 将bmp图片转为jpg等其他任意格式的图片
- Qt实现图片移动实例(图文教程)
- VC运用OPENGL加载BMP纹理图的实现方法汇总
- bmp 缩放代码(BMP位图任意放大 和缩小)
- php Imagick获取图片RGB颜色值