BMP,全称Bitmap(位图),是Windows操作系统中的标准图像文件格式,能被多种Windows程序支持。这种图像文件格式的特点是图像包含的信息比较丰富,因为它基本不进行压缩操作,但是也导致了数据量较大的缺点,其默认的文件扩展名是BMP或bmp。
BMP图像文件的结构主要由四个部分组成,位图文件头、位图信息头、调色板、DIB图像数据。下面将逐个部分进行讲述,辅以相应的C语言程序。
一、位图文件头(bitmap-file header)
位图文件头中主要包含文件类型、文件大小、存放位置等信息

typedef struct tagBMPFileHeader {char  bfty[2];  //文件类型,这里我们用"BM",即0x424D 才是Windows位图文件int   bfsize; //整个BMP文件的大小short bfreserved1;  //保留字符,必须设置为0short bfreserved2;  //保留字符,必须设置为0int   bfoffbit; //从文件起始位置到图像像素数据的字节偏移量
} BMPFileHeader;

二、位图信息头(bitmap-information header)
位图信息头主要包含位图文件的尺寸、格式等信息

typedef struct tagBMPInfoHeader {int  bisize ;       //INFOHEADER结构体大小int  biwidth;  //图像宽度(以像素为单位)int  biheight;  //图像高度(可以为正或负,为正说明图像是倒向的即图像存储是由下到上)short biplanes;       //为目标设备说明位面数,由于图像数据平面,其值总是设为1short bibitcount;    //比特数/像素;1(2色),4(16色),8(256色)(要调色板);16,24,32(不要调色板)int  bicompression;    //压缩标志(说明图像数据压缩类型):0:不压缩,1:RLE8,2:RLE4,3:,4:int  bisizeimage;   //说明图像数据的大小,以字节为单位。这里使用4字节对齐的图像数据大小int  bix;     //指定目标设备的水平分辨率,单位是像素/米int  biy;      //指定目标设备的垂直分辨率,单位是像素/米int  biclrused;    //实际使用的调色板索引数,0:使用所有的调色板索引int  biclrimportant;        //重要的调色板索引数,0:所有的调色板索引都重要
} BMPInfoHeader;

关于上述bisize的说明:bisize代表的是上述tagBMPInfoHeader结构体所需要的字数。注:这个值并不一定是上述tagBMPInfoHeader结构体的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像中bisize都是指上述tagBMPInfoHeader结构体大小的(可能是后两者太新的缘故)
三、彩色表(color table)
也称为调色板,使用RGB三色合成,主要控制图像颜色。

typedef struct tagRGBQUAD {unsigned char     rgbBlue;unsigned char     rgbGreen;unsigned char     rgbRed;unsigned char     rgbReserved;
} RGBQUAD;

四、图像数据
像素按照每行每列的顺序来进行排列,每一行的字节数必须是4的整倍数。

上述的结构是大多数BMP的文件结构,值得注意的一点是,如果是24位的BMP图像文件,那么其中是没有彩色表这一部分的,因为24位的BMP图像每个像素采用的是3个字节表示,分别存储R、G、B三色,像素数据按照BIP的排列方式进行存储。24位与8位的BMP图像文件结构并不完全相同。

上述代码仅为BMP图像文件的结构代码,由于具体绘制代码太长,具体如何使用C语言绘制自己想要的BMP图像(例如画个滑稽脸),请参考博主上传的资源。

BMP图像结构及绘制相关推荐

  1. C语言实现bmp图像对比度扩展

    假设有一幅图,由于成象时光照不足,使得整幅图偏暗(例如,灰度范围从0到63):或者成象时光照过强,使得整幅图偏亮(例如,灰度范围从200到255),我们称这些情况为低对比度,即灰度都挤在一起,没有拉开 ...

  2. C语言实现将彩色bmp图像转化为灰图、灰度图像反色

    彩色图像转灰度图像 彩色(24位)bmp图像结构: typedef struct{bitmapFileHeader bfHeader;bitmapInfoHeader biHeader;unsigne ...

  3. GDI C++ 位图的绘制

    在GDI有一个特点: 就是所有的图片绘制,都是通过DC来完成的.DC之间是可以相互传递的. 两个DC之中的图形  通过DC--->DC  来相互传递信息. 无论 位图--->屏幕 位图-- ...

  4. opengl 多边形线框_opengl基础学习专题 (三) 多边形绘制的几种样式

    题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. --艾萨克·牛顿(1643年1月4日-1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...

  5. 车牌识别(一)BMP文件读写

    车牌识别代码,作者地址:https://blog.csdn.net/liujia2100/article/details/6989712 BMP格式的文件,也就是没有任何压缩的原始位图,占用的磁盘空间 ...

  6. C#在控件中绘制矩形、圆、线段等(切换不同的图片,自定义翻页控件,通过委托监控某个字段)

    1.效果展示 2 自定义翻页控件 public partial class PageManagemen : UserControl{/// <summary>/// 当前页(从1开始计数) ...

  7. C语言TransparentBlt函数,技术分享 - 使用TransparentBlt函数实现绘制透明位图

    背景 在自己本科的时候,喜欢用 VC6.0 写一些小游戏来锻炼自己的编程水平.那些小游戏的游戏画面绘制都是使用Windows提供的GDI(图形设备接口)函数实现的,并没有调用现成的游戏引擎.所以,使得 ...

  8. 手写数字阅读器用户界面

    目录 介绍 背景 使用代码 解决方案 为什么这么多框架? 解析Mnist数据 实例化和训练神经网络 Mnist培训师 前进通行证 反向传播 Mnist测试用户界面 图像预处理 最后 C#面向对象的神经 ...

  9. duilib之源码分析

    Duilib入门教程 http://www.cnblogs.com/Alberl/p/3342030.html http://blog.csdn.net/wogel/article/details/9 ...

最新文章

  1. CSDN与易观联合发布《2017-2018中国人工智能产业路线图》
  2. mongo-log参数与config参数
  3. go mysql 数据 json,golang查询数据返回json
  4. 并发的发展历史-集成电路和多道程序设计
  5. MYSQL 数据库怎样快速的复制表以及表中的数据
  6. 《代码敲不队》第九次团队作业:Beta冲刺第1天
  7. Firemonkey的旁门左道[六]
  8. 因接外包坐牢456天,我都经历了什么?
  9. 如何编辑微信文章(微信文章导出word)
  10. 淘宝大数据之流式计算
  11. java计算机毕业设计html5大众汽车网站MyBatis+系统+LW文档+源码+调试部署
  12. 托利多bcom电子秤常用设置
  13. 【python--爬虫】千图网高清背景图片
  14. Phpstudy官网于2016年被入侵,犯罪分子篡改软件并植入后门
  15. 【caffe2从头学】:3.3.Brewing Models(快速构建模型)
  16. ege寻宝挑战游戏(C、C++)(大一上游戏项目)
  17. Java毕设项目艾灸减肥管理网站计算机(附源码+系统+数据库+LW)
  18. html5扩展函数的使用方法,知识分享:JavaScript基础语法
  19. 报表生成器FastReport .Net报表的使用原则
  20. TeamTalk客户端源码分析七

热门文章

  1. 【前端 Canvas 训练营】第一期:鼠标交互粒子背景效果
  2. 攻防世界 1000Click
  3. c语言程序结构体排序,C语言结构体排序方法
  4. css app菜单,5种实用的移动手机APP导航菜单设计方案
  5. Winform界面实现控件中英文语言切换
  6. 教育培训班仅靠一个小策略,一个月垄断附近同行脱颖而出!
  7. mpu6050姿态解算与卡尔曼滤波(2)卡尔曼滤波
  8. c 语言数组转换字符串,数组 – 将C字符数组转换为字符串
  9. android glide 4旋转图片,Android 效率开发之图片---Glide 旋转图片处理
  10. 如何在ElementaryOS(Ubuntu 12.10)上搞定娇羞的Lumia920(Win8 phone)