您的位置:首页 > 其它

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

2011-02-18 22:38 369 查看
改进:不再从参考图像读调色板,程序内部创建调色板

 

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