c语言读取bmp图片另存为raw,BMP之二:转成RAW文件及应用
RAW文件是位图的图像数据,根据不同的BMP格式它的内容和使用场合都有不同。比如在嵌入式系统中,显示LOGO要使用BMP图,只需要往映射地址放入像素的RGB数据即可实现。以下举一个DOS程序实例,把16位BMP转成十六进制RAW数据。
(1)主函数。因为main可以利用argv带参数,可处理同一路径下的具体文件。
int main(int argc, char *argv[])
{
FILE *fp_s=NULL;
BITMAPFILEHEADER biFileHeader;
BITMAPINFOHEADER biInfoHeader;
PBITMAPFILEHEADER pbiFileHeader= &biFileHeader;
PBITMAPINFOHEADER pbiInfoHeader= &biInfoHeader;
if(!(fp_s=fopen(argv[1],"r+b")))//以二进制可读方式打开流文件
{
printf("打开文件不成功!");
return 1;
}
//读取文件头
if(!(GetBitmapHeader(fp_s, pbiFileHeader, pbiInfoHeader)))
{
printf("读取文件头不成功!");
return 1;
}
//用读取的数据头生成文件
if(!(GenerateIFile(pbiFileHeader,pbiInfoHeader,fp_s, argv)))
{
printf("生成i文件失败!");
return 1;
}
if(fclose(fp_s)==EOF)
printf("关闭失败!");
return 0;
}
(2)获取头文件信息函数
int GetBitmapHeader(FILE *fp, BITMAPFILEHEADER *bfhp, BITMAPINFOHEADER *bihp)
{
//设置文件读写位置为开头
if((fseek(fp,0,SEEK_SET)==-1))
{
puts("GetBitmapHeader定位失败!");
return 0;
}
//读取fileheader
if(!(fread(bfhp,sizeof(BITMAPFILEHEADER),1,fp)))
{
puts("GetBitmapHeader读取fileheader失败!");
return 0;
}
//读取fileheader后的位置
long i;
if((i=ftell(fp))==-1L)
{
puts("GetBitmapHeader读取文件指针位置失败!");
return 0;
}
else
printf("当前位置为:%d\n",i);
//
if(!(fread(bihp, sizeof(BITMAPINFOHEADER), 1, fp)))
{
puts("读取infoheader失败!");
return 0;
}
if((i=ftell(fp))==-1L)
{
puts("读取文件指针位置失败!");
return 0;
}
else
printf("当前位置为:%d\n",i);
return 1;
}
(3)生成raw文本文件
int GenerateIFile(PBITMAPFILEHEADER bfhp, PBITMAPINFOHEADER bihp, FILE *fp_s, char **stringp)
{
//检查是倒序文件还是正序文件
if( bihp->biHeight > 0 )
puts("GenerateIFile该文件为倒序文件!");
else
{
puts("GenerateIFile该文件为正序文件!");
return 0;
}
//检查是否压缩,只处理BI_BITFIELDS的情况
if( bihp->biCompression == BI_BITFIELDS )//#define BI_BITFIELDS 3
puts("GenerateIFile该文件为BI_BITFIELDS压缩格式!");
else
{
printf("BI_BITFIELDS=%d\n", bihp->biCompression);
puts("GenerateIFile该文件不为BI_BITFIELDS压缩格式!");
return 0;
}
//检查文件类型
if(bfhp->bfType==19778)//'M' 'B'
puts("该文件为bmp格式!");
else
{
puts("该文件不为bmp格式!");
return 0;
}
//检查像素位数
if(bihp->biBitCount==16)
puts("该bmp文件为16位!");
else
{
puts("该bmp文件不为16位!");
return 0;
}
printf("the start of the image area is %d\n",bfhp->bfOffBits);
printf("the size of the image area is %d\n",bihp->biSizeImage);
printf("the height of the image is %d\n", bihp->biHeight);
printf("the width of the image is %d\n", bihp->biWidth);
//开辟一个数据缓冲区,存储image区的数据
short *pimage=NULL;
pimage=(short *)malloc((bihp->biHeight * bihp->biWidth)*2);
if(pimage== NULL)
{
printf("分配缓冲区失败!");
return 0;
}
fseek(fp_s, bfhp->bfOffBits, SEEK_SET);//定位文件指针到数据区
printf(" %d\n",ftell(fp_s));
if(!(fread(pimage, 1, bihp->biHeight * bihp->biWidth*2, fp_s))) //填充缓冲区
{
printf("填充数据缓存失败!");
return 0;
}
//重列顺序并且生成文件
if(!(RerangeData(bfhp, bihp, pimage, stringp)))
{
printf("RerangeData函数失败!");
return 0;
}
//释放缓冲区
free(pimage);
return 1;
}
未完待续。。。。
c语言读取bmp图片另存为raw,BMP之二:转成RAW文件及应用相关推荐
- C# bmp图片另存为位图 位深度1
用微软自带的画图,打开一个已经存在的单色PNG图片文件,然后复制图像粘贴上去,做点反色或其他处理再保存,可以得到黑白单色PNG图片:但是,如果有很多黑底白字的图片要想改成白纸黑字的单色PNG格式保存这 ...
- php 生成bmp图片,[GD]生成bmp格式的图片(imagebmp)
GD库里没有生成bmp图片的函数,所以自己写了一个,这个函数尚有一个压缩算法没有写,不过已经够用了.需要的同学可以看看. int imagebmp ( resource image [, string ...
- c语言读取pnm图片,ppm图像相关 - osc_p1rj1z8j的个人空间 - OSCHINA - 中文开源技术交流社区...
PPM图像格式介绍 直接拿具体的数据来说明是最直接的,使用ue打开ppm文件,采用的都是十六进制asc码表示的,这里要注意地址00000000h中的最后一个字母是始终不变的,这原来没注意晕了我好久,第 ...
- matlab产生bmp图片,matlab 生成.bmp格式的文件
生成.bmp格式的文件 .bmp格式的图片是未压缩的图片,相比于.raw格式,需要加上头文件.下面以大小为M*N的图片为例,说明头文件格式和内容. M = 128; N = 128; % 构造头文件 ...
- 用C语言读取png图片十六进制,C/C++ 二进制读写 png 文件
#include #include usingnamespacestd; typedefunsignedcharbyte; /* class PngMsg { private : unsigned c ...
- c语言 读取摄像头图片分辨颜色,opencv摄像头捕获识别颜色
本文实例为大家分享了opencv摄像头捕获识别颜色的具体代码,供大家参考,具体内容如下 #include "highgui.h" #include "iostream&q ...
- 使用C语言读取.txt文本数据构建链表时fscanf用法不当以及文件编码格式不对导致读取失败
问题描述 做C语言课设的时候想要通过读取文本的方式构建一个链表. 结构体 typedef struct grade {char subject[15];//科目char startTime[10];/ ...
- 用C语言读取.txt文本,并保存在二维数组中
将a.txt里面的内容如下: 在C语言里面保存为数组a[6][3]. 代码如下: #include<stdio.h> #include<stdlib.h> int main() ...
- 【数字图像处理】BMP图片的读取显示存储(C语言实现)
(一)背景介绍 这段时间接到了一个新活,是关于图像处理的一个探地摄像头的项目.所以也差不多是时候开始学习一下数字图像处理的知识了.本来我们的方案是直接移植opencv,编译一下以后其他就基本啥都不用管 ...
最新文章
- AKOJ-2037-出行方案
- feign返回null_109、Feign的服务降级和Turbine
- linux轻量级进程LWP
- gentoo rt-thread scons --menuconfig libs/lxdialog/util.o: undefined reference to symbol 'nodelay'
- 1/5 MySQL入门总结:下载安装
- 微服务组件记事本:本地搭建Skywalking
- C#使用Xamarin开发可移植移动应用(3.Xamarin.Views控件)附源码
- linux expr格式,计算2-expr命令举例
- java小程序开发平台,隔壁都馋哭了
- 成功必读本:培养人脉的106个技巧
- 面试常见java异常题_Java异常面试题(含答案)
- ODBC、OLEDB、ADO的区别和联系
- IB客座主编(三):西门子(中国)有限公司工业业务领域楼宇科技集团杜明轩(Christophe de Maistre)先生...
- RuntimeError: all elements of input should be between 0 and 1
- 深度技术 Windows 7 SP1 x64 极速装机版 V2013.05
- poi 同时 冻结第一行和第一列
- 如何从Word,Excel和PowerPoint文档中提取图像,文本和嵌入式文件
- SpringBoot电商项目之购物车下单(沙箱支付)
- 判断一个多边形的凸凹性
- Git实战(五)| 让工作更高效,Git的分支管理
热门文章
- 使用turtle来画奥运五环使用turtle进行图形化的程序设计来绘制自己想要的图形
- html左右超出显示滚动条,div内容宽度超出边界后怎样设置为左右滑动,而且不显示滚动条?...
- LightWAN场景以及方案说明
- 理解DSCP PHB AF DF(转载)
- 《计算机工程与应用》投稿详解
- Shareaza协议分析
- Cisco ASA(防火墙)基本配置
- Visual Studio 2019无法安装
- asp.net超市管理系统(源码+数据库)
- finereport使用java_finereport和java