为raw数据添加图像头,并保存为bmp图像(改进)

来源:互联网 发布:战舰世界乌达洛伊数据 编辑:程序博客网 时间:2024/05/23 01:22

为raw数据添加图像头,并保存为bmp图像(改进)

改进:不再从参考图像读调色板,程序内部创建调色板

http://blog.csdn.net/lichengyu/archive/2011/02/18/6194362.aspx

 

view plaincopy to clipboardprint?

#include "stdio.h"  

#include "Windows.h"  

 

unsigned char *pBmpBuf;//读入图像数据的指针  

int bmpWidth;//图像的宽  

int bmpHeight;//图像的高  

//RGBQUAD *pColorTable;//颜色表指针  

int biBitCount;//图像类型,每像素位数  

 

/***************************************** 

* 函数名称: 

*     saveBmp() 

*函数参数: 

*    char *bmpName-文件名字及路径 

*    unsigned char *imgBuf-待存盘的位图数据 

*    int width-以像素为单位待存盘位图的宽 

*    int  height-以像素为单位待存盘位图高 

*    int biBitCount-每像素所占位数 

*    RGBQUAD *pColorTable-颜色表指针 

*返回值: 

*    0为失败,1为成功 

*说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息, 

*      将其写到指定文件中 

***********************************************************************/  

bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,   

int biBitCount, RGBQUAD *pColorTable)  

{  

//如果位图数据指针为0,则没有数据传入,函数返回  

if(!imgBuf)  

return 0;  

//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0  

int colorTablesize=0;  

if(biBitCount==8)  

colorTablesize=1024;  

//待存储图像数据每行字节数为4的倍数  

int lineByte=(width * biBitCount/8+3)/4*4;  

//以二进制写的方式打开文件  

FILE *fp=fopen(bmpName,"wb");  

if(fp==0) return 0;  

//申请位图文件头结构变量,填写文件头信息  

BITMAPFILEHEADER fileHead;  

fileHead.bfType = 0x4D42;//bmp类型  

//bfSize是图像文件4个组成部分之和  

fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)  

+ colorTablesize + lineByte*height;  

fileHead.bfReserved1 = 0;  

fileHead.bfReserved2 = 0;  

//bfOffBits是图像文件前3个部分所需空间之和  

fileHead.bfOffBits=54+colorTablesize;  

//写文件头进文件  

fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);  

//申请位图信息头结构变量,填写信息头信息  

BITMAPINFOHEADER head;   

head.biBitCount=biBitCount;  

head.biClrImportant=0;  

head.biClrUsed=0;  

head.biCompression=0;  

head.biHeight=height;  

head.biPlanes=1;  

head.biSize=40;  

head.biSizeImage=lineByte*height;  

head.biWidth=width;  

head.biXPelsPerMeter=0;  

head.biYPelsPerMeter=0;  

//写位图信息头进内存  

fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);  

//如果灰度图像,有颜色表,写入文件   

if(biBitCount==8)  

fwrite(pColorTable, sizeof(RGBQUAD),256, fp);  

//写位图数据进文件  

fwrite(imgBuf, height*lineByte, 1, fp);  

//关闭文件  

fclose(fp);  

return 1;  

}  

 

 

int main(int argc, char* argv[])  

{  

//输入参数为3个: 执行程序名,图像数据的路径名,生成图像路径名  

if( argc != 3)  

{  

fprintf(stderr, "Input parameter number is not 4!/n");  

exit(1);  

}  

 

bmpWidth = 256;  

bmpHeight = 256;  

biBitCount = 8;  

int lineByte=(bmpWidth * biBitCount/8+3)/4*4;  

pBmpBuf=new unsigned char[lineByte * bmpHeight];  

 

//创建灰度图像调色板  

RGBQUAD rgbquad[256];  

for(int i = 0; i < 256; i++)  

{  

rgbquad[i].rgbBlue = i;  

rgbquad[i].rgbGreen = i;  

rgbquad[i].rgbRed = i;  

rgbquad[i].rgbReserved = 0;  

}  

 

//创建新图像  

char *bmpName = argv[1];//argv[1]为图像数据的路径名  

FILE *fp=fopen(bmpName,"rb");  

if(fp==0)  

{  

fprintf(stderr, "can't open file %s!/n", bmpName);  

exit(1);  

}  

fread(pBmpBuf,1,lineByte * bmpHeight,fp);  

if( ferror(fp) )  

{  

fprintf(stderr, "?Read error/n");  

exit(1);  

}  

 

//修改图像数据(二值化)  

for(int i = 0; i < bmpWidth; i++)  

for(int j = 0; j < bmpHeight; j++)  

{  

//  if( pBmpBuf[j*lineByte+i] == atoi(argv[1]) ) pBmpBuf[j*lineByte+i] = 255;//argv[1]为二值化的阈值  

if( pBmpBuf[j*lineByte+i] == 2 ) pBmpBuf[j*lineByte+i] = 255;//argv[1]为二值化的阈值  

}  

 

fclose(fp);  

 

saveBmp(argv[2], pBmpBuf, bmpWidth, bmpHeight, biBitCount, rgbquad);//argv[3]为整合后的图像路径名  

 

return 0;  

}  

原创粉丝点击