论文部分内容阅读
[摘 要]介绍了使用C++对BMP图像进行文件信息读取和文件数据读取的相关概念和方法。根据BMP格式图像的格式类型和存储原理,介绍用C++程序语言对BMP格式图像进行读取和写入方法。
[关键词]数字图像;位图图像 C++;BMP图像格式
中图分类号:G291 文献标识码:A 文章编号:1009-914X(2015)45-0270-01
位图图像的数据格式分为四个部分:文件头、信息头、颜色表和位图数据。我们平时看到的位图图像在文件内部都是以数据的形式进行存储的。图片的不同格式有不同的编码算法,位图文件是为经过压缩编码的原始的图片文件,位图文件的结构也更容易进行理解。位图文件更容易使用程序语言来进行操作。
1 文件头部分
位图的文件头包含存储了位图文件的基本信息。包括有文件类型(BMP格式)、以字节为单位的文件大小、保留字和数据的起始位置(记录位图数据开始存储的具体数据位置)这些信息。
用C++语言可以定义像下面的类:
class _BMPfheader
{
public:
unsigned short int fileType;//图片文件的类型
unsigned int fileSize;//图片文件的大小,单位是字节
unsigned short int fileRea;//图片数据的保留字
unsigned short int fileReb;//图片数据的保留字
unsigned int dataStart;//文件中开始存储像素点数据的位置
};
2 信息头部分
BMP格式文件的信息头包含了文件的其他基本属性信息。包括有信息头部分所占用的数据量(用字节数为单位表示)、图片的尺寸(包括宽度和高度,以像素为单位),存储每个像素点所需要的数据位数,图片的分辨率(包括水平分辨率和垂直分辨率)等信息,信息头部分还记录了文件是否经过压缩(BMP文件都是未经压缩的)。
用C++语言可以定义像下面的类:
class _BMPifheader
{
unsigned int bmpS; // BMP信息头部分的大小(以字节为单位)
unsigned int bmpW; // BMP图片的宽度
unsigned int bmpH; // BMP图片的高度
unsigned short int bmpPL;// BMP图像设备级别
unsigned short int bmpBC; //存储BMP图片每个数据点需要的数据位数
unsigned int bmpCOM; // 记录BMP图片是否经过压缩了,这个数据一般是0,代码没经过压缩
unsigned int bmpS1; // BMP图片数据的大小
unsigned int bmpHBPM; //BMP图片的水平方向的分辨率
unsigned int bmpVBPM; //BMP图片垂直方向的分辨率
unsigned int bmpCU; // BMP图像使用了的颜色数量
unsigned int bmpICU; // BMP图像使用了的重要颜色的数量
};
3 颜色表部分
颜色表根据BMP位图的数据点的存储位数不同,存储了BMP图像所用到的所有颜色。如果是1位的图片,那么图片中就包含两种颜色即黑白,这时候图片是二值图;如果是4位的图片,那么图片中就包含了16种颜色;如果是8位的图片,图片中就包含了256中颜色;如果是24位的图片,图片中就包含了256×256×256种颜色,这时候的图片叫做真彩色图片,它包含的颜色数非常多但也并不是包含了所有的颜色,图片毕竟是图片,跟现实中的色彩还是不能比的。
用C++语言可以定义如下的类:
class _COLOURTABLE
{
unsigned char B; // blue的亮度
unsigned char G; // greed的亮度
unsigned char R; //red的亮度
unsigned char R; // 这项一般为0,是保留字
};
4 数据部分
BMP图片的数据存储的是BMP图片中每个点的颜色值。如果是24位的图片,那么这里的数据存储的就是图片的RGB值,否则的话,数据部分存储的仅仅是颜色表的索引值,通过索引值得到图片真实的RGB值。
这一部分没有所谓的数据结构可言,就是在上述的结构下面根据数据的位数直接开始存储数据。
5 注意问题
在实际的编程过程中可能会出现各种个样的问题,需要注意的问题如下:
1) 为避免出错可在文件头、信息头、颜色表的结构体或类定义的前面加上#pragma pack(1),表示按照1字节对齐,在这部分结束后再改回按照4字节对齐。
2) BMP图像的尺寸使用长和宽两个变量存储的而不是一个
6 编程测试
编程部分UI界面设计如下
测试结果如下:
[关键词]数字图像;位图图像 C++;BMP图像格式
中图分类号:G291 文献标识码:A 文章编号:1009-914X(2015)45-0270-01
位图图像的数据格式分为四个部分:文件头、信息头、颜色表和位图数据。我们平时看到的位图图像在文件内部都是以数据的形式进行存储的。图片的不同格式有不同的编码算法,位图文件是为经过压缩编码的原始的图片文件,位图文件的结构也更容易进行理解。位图文件更容易使用程序语言来进行操作。
1 文件头部分
位图的文件头包含存储了位图文件的基本信息。包括有文件类型(BMP格式)、以字节为单位的文件大小、保留字和数据的起始位置(记录位图数据开始存储的具体数据位置)这些信息。
用C++语言可以定义像下面的类:
class _BMPfheader
{
public:
unsigned short int fileType;//图片文件的类型
unsigned int fileSize;//图片文件的大小,单位是字节
unsigned short int fileRea;//图片数据的保留字
unsigned short int fileReb;//图片数据的保留字
unsigned int dataStart;//文件中开始存储像素点数据的位置
};
2 信息头部分
BMP格式文件的信息头包含了文件的其他基本属性信息。包括有信息头部分所占用的数据量(用字节数为单位表示)、图片的尺寸(包括宽度和高度,以像素为单位),存储每个像素点所需要的数据位数,图片的分辨率(包括水平分辨率和垂直分辨率)等信息,信息头部分还记录了文件是否经过压缩(BMP文件都是未经压缩的)。
用C++语言可以定义像下面的类:
class _BMPifheader
{
unsigned int bmpS; // BMP信息头部分的大小(以字节为单位)
unsigned int bmpW; // BMP图片的宽度
unsigned int bmpH; // BMP图片的高度
unsigned short int bmpPL;// BMP图像设备级别
unsigned short int bmpBC; //存储BMP图片每个数据点需要的数据位数
unsigned int bmpCOM; // 记录BMP图片是否经过压缩了,这个数据一般是0,代码没经过压缩
unsigned int bmpS1; // BMP图片数据的大小
unsigned int bmpHBPM; //BMP图片的水平方向的分辨率
unsigned int bmpVBPM; //BMP图片垂直方向的分辨率
unsigned int bmpCU; // BMP图像使用了的颜色数量
unsigned int bmpICU; // BMP图像使用了的重要颜色的数量
};
3 颜色表部分
颜色表根据BMP位图的数据点的存储位数不同,存储了BMP图像所用到的所有颜色。如果是1位的图片,那么图片中就包含两种颜色即黑白,这时候图片是二值图;如果是4位的图片,那么图片中就包含了16种颜色;如果是8位的图片,图片中就包含了256中颜色;如果是24位的图片,图片中就包含了256×256×256种颜色,这时候的图片叫做真彩色图片,它包含的颜色数非常多但也并不是包含了所有的颜色,图片毕竟是图片,跟现实中的色彩还是不能比的。
用C++语言可以定义如下的类:
class _COLOURTABLE
{
unsigned char B; // blue的亮度
unsigned char G; // greed的亮度
unsigned char R; //red的亮度
unsigned char R; // 这项一般为0,是保留字
};
4 数据部分
BMP图片的数据存储的是BMP图片中每个点的颜色值。如果是24位的图片,那么这里的数据存储的就是图片的RGB值,否则的话,数据部分存储的仅仅是颜色表的索引值,通过索引值得到图片真实的RGB值。
这一部分没有所谓的数据结构可言,就是在上述的结构下面根据数据的位数直接开始存储数据。
5 注意问题
在实际的编程过程中可能会出现各种个样的问题,需要注意的问题如下:
1) 为避免出错可在文件头、信息头、颜色表的结构体或类定义的前面加上#pragma pack(1),表示按照1字节对齐,在这部分结束后再改回按照4字节对齐。
2) BMP图像的尺寸使用长和宽两个变量存储的而不是一个
6 编程测试
编程部分UI界面设计如下
测试结果如下: