C语言读取bmp图像并做简单显示)

  • bmp文件格式
  • 读取bmp文件信息并展示

bmp文件格式

bmp文件大体上分为四个部分:

bmp文件构成
位图文件头BITMAPFILEHEADER
位图信息头BITMAPINFOHEADER
调色板Palette
实际的位图数据ImageDate

第一部分为位图文件头,位图文件头长度固定,为14个字节。

typdef struct {WORD bfType;    //指定文件类型,必须是0x424d,即”BM”
DWORD bfSize;   //指定文件大小
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //为文件头到实际的位图数据的偏移字节数,即上图前三部分和
}bitmapFileHeader;

第二部分为位图信息头,这个结构的长度也是固定的,为40个字节。

typedef struct {DWORD biSize;  //指这个机构的长度,为40LONG biWidth;  //指定图像的宽度,单位是像素LONG biHeight;  //指定图像的高度,单位是像素WORD biPlanes;  //平面数,必须为1,不用考虑 WORD biBitCount; //指定表示颜色是要用到的位数,常用值为1(黑白二色图),//4(16色图),8(256色),24(真彩色图)(新的.bmp格式支持32位色)DWORD biCompression; //指定位图是否压缩,有效的值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFILELDSDWORD biSizeImage; //指定实际的位图数据占用的字节数,其实也可以从以下的公式计算出来://biSizeImage=bitWidth’*biHeight,bitWidth‘为大于等于bitWidth的4的倍数LONG biXPelsPerMeter; //指定设备的水平分辨率,单位是每米的图像个数LONG biYPelsPerMeter; //同上,垂直分辨率DWORD biClrUsed; //指定本图像实际用到的颜色数,如果该值为零,则用到的颜色数为2^biBitCountDWORD biClrImportant;// 指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的
}bitmapInfoHeader;

第三部分为调色板(真彩图像不需要调色版,bitmapInfoHeader后直接是数据)调色板实际是一个数组,共有biClrUsed个元素(如果该值为0,则有2^biBitCount个元素),数组中每个元素的类型是一个RGBQUAD结构,占四个字节,其定义如下:

typedef struct {BYTE rgbBlue; //该颜色的蓝色分量BYTE rgbGreen; //该颜色的绿色分量BYTE rgbRed; //该颜色的红色分量BYTE rgbReserved; //保留值
} RGBQUAD;

第四部分为实际图像数据
对于用到调色版的位图,图像数据就是该像素颜在调色板中的索引值。对于真彩图,图像数据就是实际的R、G、B值。

需要注意两点:
(1)每一行的字节数必须是4的整倍数,如果不是,则需要补齐。
(2)一般来说,.bmp文件的数据是从下到上,从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个像素,然后是左边第二个像素……接下来是倒数第二行左边第一个像素,左边第二个像素……依次类推 ,最后得到的是最上面一行的最右一个像素。

读取bmp文件信息并展示

以24位bmp图像为例

定义数据结构:

typedef struct {unsigned char bfType[2];unsigned long bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned long bfOffBits;
}bitmapFileHeader;typedef struct {unsigned long biSize;long biWidth;long biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned long biCompression;unsigned long biSizeImage;long biXPixPerMeter;long biYPixPerMeter;unsigned long biClrused;unsigned long biClrImportant;
}bitmapInfoHeader;

读入文件头:

//仅展示,不用于实验
int readFileHeader(FILE *fp,bitmapFileHeader*bfHeader){fseek(fp,0,SEEK_SET);fread(bfHeader,sizeof(bitmapFileHeader),1,fp);/*int i;  printf("读入文件头:");char*p=(char*)bfHeader;for(i=0;i<sizeof(bitmapFileHeader);i++,p++){printf("%02x ",*p);}printf("\n");printf("文件头信息如下:\n");printf("文件类型:%c%c\n",bfHeader->bfType[0],bfHeader->bfType[1]);printf("文件大小: %d 字节\n",bfHeader->bfSize);printf("位图数据偏移:%d\n",bfHeader->bfOffBits);*/return 0;
}

读信息头:

//仅展示,不用于实验
int readInfoHeader(FILE*fp,bitmapInfoHeader*biHeader){fseek(fp,14,SEEK_SET);fread(biHeader,sizeof(bitmapInfoHeader),1,fp);/*int i;printf("读入位图信息头:\n");char*p=(char*)biHeader;for(i=0;i<sizeof(bitmapInfoHeader);i++,p++){printf("%02x ",*p);if(i%20==0&&i!=0)printf("\n");}printf("\n");printf("位图信息头信息如下:\n");printf("bmp图像宽度:%d\n",biHeader->biWidth);printf("bmp图像高度:%d\n",biHeader->biHeight);printf("bmp图像颜色位数: %d\n",biHeader->biBitCount);printf("bmp图像实际数据占用字节:%d\n",biHeader->biSizeImage);*/return 0;
}

读入bmp图像数据,并展示

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>#pragma pack(1)  //这个选项挺重要,不加的话程序就会报错,原因参考
//https://blog.csdn.net/qq_44310495/article/details/109181857typedef struct {unsigned char bfType[2];unsigned long bfSize;unsigned short bfReserved1;unsigned short bfReserved2;unsigned long bfOffBits;
}bitmapFileHeader;typedef struct {unsigned long biSize;long biWidth;long biHeight;unsigned short biPlanes;unsigned short biBitCount;unsigned long biCompression;unsigned long biSizeImage;long biXPixPerMeter;long biYPixPerMeter;unsigned long biClrused;unsigned long biClrImportant;
}bitmapInfoHeader;int main(){FILE *fp,*fp_txt;if((fp=fopen("d:\Temp\\skull.bmp","rb"))==NULL){perror("can not open file!");return -1;}bitmapFileHeader bfHeader;fread(&bfHeader,14,1,fp);bitmapInfoHeader biHeader;fread(&biHeader,40,1,fp);int imSize=biHeader.biSizeImage;int width=biHeader.biWidth;int height=biHeader.biHeight;int bitCount=biHeader.biBitCount;fseek(fp,bfHeader.bfOffBits,SEEK_SET);unsigned char*imageData=(unsigned char*)malloc(imSize*sizeof(unsigned char));fread(imageData,imSize*sizeof(unsigned char),1,fp);//图像为24位图像int lineBytes=(bitCount*width+31)/32*4;//得到图像数据的bitwidth'int i,j;int r,g,b;for(i=0;i<height;i++){ //对于每一行for(j=0;j<width*3;j++){ //对于每一列r=*(imageData+lineBytes*(height-1-i)+j); //从最后一行往上读j++;g=*(imageData+lineBytes*(height-1-i)+j);j++;b=*(imageData+lineBytes*(height-1-i)+j);if(r==255&&g==255&&b==255) //模拟二值图像展示printf("  ");elseprintf(".$");}printf("\n");}free(imageData);fclose(fp);getchar();return 0;
}

代码效果展示:

C语言读取bmp图像并做简单显示相关推荐

  1. C语言读取bmp图像

    BMP图像编码 BMP即bitmap,也就是位图,一般由4部分组成:文件头信息块.图像描述信息块.颜色表(在真彩色模式无颜色表)和图像数据区. 在图像数据之前,如图所示,共有54位数据 其中,0x42 ...

  2. C语言读取BMP格式图片

    C语言读取BMP格式图片 BMP 维基百科,自由的百科全书 汉漢▼ 位图 扩展名 .bmp 开发者 Microsoft 格式 图像文件格式  本文介绍的是一种图像文件格式. 关于Unicode的第1区 ...

  3. c语言实现pdf显示图片,C语言读取BMP格式图片.pdf

    C语言读取BMP格式图片 C 语言读取BMP 格式图片 以下摘自维基百科,自由的百科全书 BMP 取自位图BitMaP 的缩写,也称为DIB (与设备无关的位图)是微软视窗图形 子系统(Graphic ...

  4. C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放)

    C语言实现bmp图像几何变换(移动,旋转,镜像,转置,缩放) 移动 旋转 镜像 转置 缩放 自定义结构及函数如下: #define pi 3.1415926 typedef struct {unsig ...

  5. 利用C语言读取BMP文件

    文章目录 什么是bmp文件 1.文件头信息块 2.图像描述信息块 3.颜色表 4.图像数据区 编写代码 C文件 h头文件 存储算法 什么是bmp文件 BMP是bitmap的缩写形式,bitmap顾名思 ...

  6. java读取bmp图像_JAVA实现对BMP图片的读取

    BMP图片格式,是windows自带的一个图片格式,(*bmp),在windows的系统下都支持这种格式,bmp格式与设备无关的位图(DIB)格式,BMP简称位图,BMP的原始数据是没有经过压缩处理的 ...

  7. bmp 像素点 php,读取BMP图像每一像素点RGB数据 | 学步园

    对于24位bmp图片,每一个像素点存放着此点的RGB值.首先定义一个结构体,包含红(red).绿(green).蓝(blue)这三个字段,如下: //像素颜色值 typedef struct tagP ...

  8. c语言编程读取bmp文件数据,c语言读取BMP图片的RGB数据

    BMP图片是位图(bitmap),一般未压缩,要读取BMP文件只要知道它的文件结构就可以了,具体格式可以百度或者google,就不多说了,几个重要的点在代码里面有注释. /** c语言读取位图信息 * ...

  9. 读取BMP图像每一像素点RGB数据

    对于24位bmp图片,每一个像素点存放着此点的RGB值.首先定义一个结构体,包含红(red).绿(green).蓝(blue)这三个字段,如下: [html] view plaincopy //像素颜 ...

最新文章

  1. left join左表百万数据查询慢_Spark SQL 之 Join 实现
  2. 如何探测局域网中某台主机是否开机_如何选购倒车雷达 倒车雷达的选购和安装方法...
  3. ORACLE基础学习-RMAN应用之(归档模式无备份,丢失数据文件的恢复)
  4. 函数的傅立叶展开掐死我吧_《傅立叶的梦》第一章——天才少年Fejér的平均和一致收敛问题...
  5. 计算机专业可以报考放射医学吗吗,文科生可以报考医学影像技术专业吗
  6. 当当网价格系统架构分析
  7. adobe黑体std能商用_请问Adobe 黑体 Std R能免费商用吗?
  8. 一键平仓含挂单全商品版脚本.mq4
  9. 7月的尾巴,你是XXX
  10. win10专业版与家庭版区别分析
  11. HTML5期末大作业:在线电影网站设计——电影我不是药神响应式页播(4页) HTML+CSS+JavaScript HTML+CSS+JS网页设计期末课程大作业 web前端开发技术 web课程设计
  12. Web scraper 爬虫傻瓜教程(不断更新中)
  13. 区块链行业人才市场大盘点(附求职指南)
  14. Can't create pdf file with font calibri bold 错误解决方案
  15. linux下的时间 date 和 hwclock命令
  16. 根据E-R图设计数据库表
  17. 计算机科学与技术本科相当于计算机几级,软件工程的学生毕业后计算机等级算几级?...
  18. IDEA配置SpringBoot项目热部署
  19. 日语学习资料下载 N5—N1都有
  20. double free or corruption (!prev)

热门文章

  1. RecyclerView 判断滑动到顶部和底部
  2. 小程序 navigator 无法跳转 tabBar上的页面
  3. 2022-2028年中国石油套管行业市场研究及前瞻分析报告
  4. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
  5. libcurl 客户端实例
  6. Silverlight WCF RIA服务(二十三)Silverlight 客户端 4
  7. c语言定义字符类型变量的关键字,C语言数据类型
  8. am5718_AM5718如何扩大内存 - Sitara™ Cortex-A8 和 ARM9 微处理器 - Sitara™ Cortex-A8 和 ARM9 微处理器 - E2E™ 中文支持论坛...
  9. 乐高无限无法进入服务器,乐高无限6.13更新 无法进入游戏问题修复
  10. 军团要塞2正版服务器,专用服务器配置 - Official TF2 Wiki | Official Team Fortress Wiki