您的位置:首页 > 编程语言 > Qt开发

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

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RGB bmp ffmpeg qt