windows 保存rgb数据为bmp文件
2016-04-11 10:08
295 查看
//构建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;
/////注意BMP在y方向是反着存储的,一次必须设置一个负值,才能使图像正着显示出来
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;
}
//iWidth:图像宽; iHeight:图像高;pBuffer:图像RGB数据;filePath:存储路径;fileName:保存文件名;fileNum:保存文件编号
//SaveDIB2Bmp(100, "frame", "D://screenshot")
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);
TCHAR BMPFileName[1024];
int widthStep = (((iWidth * 24) + 31) & (~31)) / 8 ; //每行实际占用的大小(每行都被填充到一个4字节边界)
int DIBSize = widthStep * iHeight ; //buffer的大小 (字节为单位)
//save
FILE * fp = fopen("a.bmp","wb" );
if( !fp ) return false;
fwrite(&bhh, 1,sizeof(bhh),fp);
fwrite(&bih, 1,sizeof(bih),fp);
//fwrite( &bih, sizeof(BMPINFOHEADER_T),1,fp );
fwrite(pBuffer,1,DIBSize,fp);
fclose( fp );
return false;
}
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;
/////注意BMP在y方向是反着存储的,一次必须设置一个负值,才能使图像正着显示出来
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;
}
//iWidth:图像宽; iHeight:图像高;pBuffer:图像RGB数据;filePath:存储路径;fileName:保存文件名;fileNum:保存文件编号
//SaveDIB2Bmp(100, "frame", "D://screenshot")
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);
TCHAR BMPFileName[1024];
int widthStep = (((iWidth * 24) + 31) & (~31)) / 8 ; //每行实际占用的大小(每行都被填充到一个4字节边界)
int DIBSize = widthStep * iHeight ; //buffer的大小 (字节为单位)
//save
FILE * fp = fopen("a.bmp","wb" );
if( !fp ) return false;
fwrite(&bhh, 1,sizeof(bhh),fp);
fwrite(&bih, 1,sizeof(bih),fp);
//fwrite( &bih, sizeof(BMPINFOHEADER_T),1,fp );
fwrite(pBuffer,1,DIBSize,fp);
fclose( fp );
return false;
}
相关文章推荐
- HTTP基本认证(Basic Authentication)的JAVA示例
- SQL优化原则 编辑
- ZOJ 3923 Handshakes
- 浅谈php字符串
- Zookeeper 安装和配置---学习三
- 关于如何提高研发部门工作效率的探讨
- 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)
- 判断List、Map、Set是否为空及效率比较
- jQuery基础事件
- Android AIDL学习
- Gradle compile依赖jar,GroupId,ArtifactId查询
- 京东2016笔试题,小东复习
- HTML5常用标签
- 解决几个编译警告我和错误问题
- SecureCRT 7.3.4破解版(含注册机)
- 小米3手机重置
- Glide用在CircleImageView上每次进入第一次显示默认图片
- MVC5中路由新特性
- Redis 快速入门
- 从HAL层到java应用层重写mini6410 led功能