时间:2021-05-20
心血来潮想了解下常用图片的格式解析,翻看了一些资料后,发现最简单的是bmp格式,所以先拿它开刀。
BMP格式
这种格式内的数据分为三到四个部分,依次是:
文件信息头 (14字节)存储着文件类型,文件大小等信息
图片信息头 (40字节)存储着图像的尺寸,颜色索引,位平面数等信息
调色板 (由颜色索引数决定)【可以没有此信息】
位图数据 (由图像尺寸决定)每一个像素的信息在这里存储
一般的bmp图像都是24位,也就是真彩。每8位为一字节,24位也就是使用三字节来存储每一个像素的信息,三个字节对应存放r,g,b三原色的数据,每个字节的存贮范围都是0-255。
那么以此类推,32位图即每像素存储r,g,b,a(Alpha通道,存储透明度)四种数据。8位图就是只有灰度这一种信息,还有二值图,它只有两种颜色,黑或者白。
文件信息头格式
typedef struct tagBITMAPFILEHEADER { unsigned short bfType; // 19778,必须是BM字符串,对应的十六进制为0x4d42,十进制为19778 unsigned int bfSize; // 文件大小 unsigned short bfReserved1; // 一般为0 unsigned short bfReserved2; // 一般为0 unsigned int bfOffBits; // 从文件头到像素数据的偏移,也就是这两} BITMAPFILEHEADER;图片信息头格式
typedef struct tagBITMAPINFOHEADER { unsigned int biSize; // 此结构体的大小 int biWidth; // 图像的宽 int biHeight; // 图像的高 unsigned short biPlanes; // 1 unsigned short biBitCount; // 一像素所占的位数,一般为24 unsigned int biCompression; // 0 unsigned int biSizeImage; // 像素数据所占大小, 这个值应该等于上面文件头结构中bfSize-bfOffBits int biXPelsPerMeter; // 0 int biYPelsPerMeter; // 0 unsigned int biClrUsed; // 0 unsigned int biClrImportant;// 0} BITMAPINFOHEADER;调色板信息
这里需要根据文件信息头的bfOffBits是否等于54(由前面的固定14+40字节得出)来判断是否存在此调色板信息,如果是,则不存在;大于的话即存在。
可以根据需求提取其中的信息,或者直接移动到位图数据区读取像素信息。
这个地方可以表示为一个二维数组unsigned char palette[N][M], 其中N表示总的颜色索引数,M表示每像素占的字节数。例如一个24位图,每像素由3个字节构成,M即为3,每个字节可表示0-255共256种颜色,所以N为256 。
数组中存放的是索引信息,也就是一张映射表,标识颜色索引号与其代表的颜色的对应关系
位图数据
这里就存放着所有的像素信息了,每像素为一字节,读取出来后通过查询调色板获得颜色信息。
如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布:
24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。
32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。
注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。
也就是说,最先读取到的是位于从上往下数最后一行最左端的像素,然后是同行向右一列的像素,读取完一整行后,继续读取倒数第二行,然后继续向上直到读完所有数据。
以上这篇c语言解析bmp图片的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C语言实现BMP转换JPG的方法。分享给大家供大家参考。具体实现方法如下:/***********************************
本文实例讲述了C++针对bmp格式解析的方法,分享给大家供大家参考。具体方法如下:写这代码时,容易出现如下错误:1.忘了on_wm_paint()一直在界面上画
C语言实现BMP图像的读写对于刚接触数字图像的同学,应该都有一个疑问,如何把一个BMP格式的图像用纯C语言读入呢,我相信这也是数字图像处理的第一步,如果有幸看到
C语言数据输入与输出实例详解1概论C语言提供了跨平台的数据输入输出函数scanf()和printf()函数,它们可以按照指定的格式来解析常见的数据类型,例如整数
验证是否为图片格式复制代码代码如下:functionIsImgType(src){varrFilter=/^(?:image\/bmp|image\/c