为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;
}
- 为raw数据添加图像头,并保存为bmp图像(改进)
- 为raw数据添加图像头,并保存为bmp图像(改进)
- 为raw数据添加图像头,并保存为bmp图像
- 获取当前屏幕图像并保存为bmp文件
- v4l2获取raw图像数据并保存
- DM642学习点滴三:将DSP内存中的图像数据保存为BMP图像
- Android Bitmap保存为.bmp格式,图像转化为黑白图片
- Android Bitmap保存为.bmp格式,图像转化为黑白图片
- Android Bitmap保存为.bmp格式,图像转化为黑白图片
- matlab 读取txt数据并保存为图像
- 1.1.0-学习Opencv与MFC混合编程之---全屏截图,保存为BMP图像(并增加快捷键)
- 将rgb图像数据保存为BMP格式图片的方法
- 将rgb图像数据保存为BMP格式图片的方法
- .net读取图像并保存为文件
- GDI+ 将BMP 32图像转换为JPG文件格式保存
- 将开发板中显示的图像保存为bmp
- tchart 保存为图像
- label保存为图像
- 把yum安装到CentOS+OpenVZ中
- 文档测试
- mysql export & import (backup and restore)
- 上传和管理 Python 应用程序
- 替换数据库字段为大写
- 为raw数据添加图像头,并保存为bmp图像(改进)
- 致软5全体同志们的一封信
- 使用jpeglib库实现bmp转jpg
- 代码换行中间空格处理
- vmwar 和 IBM 虚拟机实时迁移技术
- Oracle 扩展表空间
- directdraw直接读写显存的方法
- 堆(heap)和栈(stack)有什么区别?
- C-内存地址对齐及大小端