出于兼容性的考量,大多数应用程序使用较旧版本的DIB头保存文件。在不考虑OS/2的情况下,目前通用的格式为BITMAPINFOHEADER版本,内容在图2.5中列出。除非有特殊说明,其中所有值均为无符号整数。
图2.5 BITMAPINFOHEADER版本DIB头
3)定义调色板
这部分定义了图像中所用的颜色。如上所述,位图图像一个像素接着一个像素储存,每个像素使用一个或者多个字节的值表示,所以调色板的目的就是要告诉应用程序这些值所对应的实际颜色。
典型的位图文件使用RGB彩色模型。在这种模型中,每种颜色都是由不同强度(从0到最大强度)的红色(R)、绿色(G)和蓝色(B)组成的,也就是说,每种颜色都可以使用红色、绿色和蓝色的值所定义。
在位图文件的实现中,调色板可以包含很多条目,条目个数就是图像中所使用的颜色的个数。每个条目用来描述一种颜色,包含4个字节,其中三个表示红色、绿色和蓝色,第四个字节没有使用(大多数应用程序将它设为0);对于每个字节,数值0表示该颜色分量在当前的颜色中没有使用,而数值255表示这种颜色分量使用最大的强度。
4)定义其他数据
X Window System使用类似的.XBM格式表示一位黑白图像以及.XPM(pixelmap)表示彩色图像。另外还有一种.RAW格式,它除了保存原始数据之外没有任何其他信息。其他还有Portable Pixmap file format(.PPM)和Truevision TGA(.TGA),但是它们用得很少或者只用于特殊目的。尽管其他格式也保存为“位图”(与矢量图不同),但是它们使用数据压缩或者颜色索引,所以它们不是严格意义上的位图。
由于包含有冗余信息,许多BMP文件使用类似于ZIP这样的无损数据压缩算法能够获取很好的压缩效果。
2.3.2 读入文件路径
定义两个大小为100的字符数组存储路径,输出提示,让用户输入绝对路径,并存储在字符数组中。判断字符数字内路径是否为空,为空则打开失败。注意源文件是rb+的打开方式,而目标文件是wb的打开方式。
2.3.3 功能函数彩色转灰度图像设计
1)读取位图头结构和信息头,
2)修改信息头,修改文件头,
3)创建调色板,
4)写入文件头、信息头、调色板
5)调用2.2.2的公式将位图信息转为灰度,
6)释放内存空间,关闭文件
2.3.4 功能函数彩色转二值图像设计
1)创建位图文件头,信息头,调色板
2)读入源位图文件头和信息头
3)修改文件头,信息头信息
4)将位图文件头,信息头和调色板写入文件
5)将彩色图转为二值图,这里选取阈值为90
6)释放内存空间,关闭文件
2.3.5 功能整合
1)输入文件路径
2)判断路径是否合法
3)输出功能选项
4)输入选择功能
5)根据选择功能调用函数
6)执行成功输出提示符
3 实现 3.2 开发环境
操作系统:使用Windows10专业版64位操作系统
开发语言:C语言
开发工具:Dev-C++
3.2 主要代码与说明 3.2.1 程序准备
根据2.3.1进行程序准备,代码及注释如下:
/* 定义位图文件头 */ typedef struct tagBITMAPFILEHEADER { unsigned short bfType;//文件格式 unsigned long bfSize;//文件大小 unsigned short bfReserved1;//保留 unsigned short bfReserved2;//保留 unsigned long bfOffBits; //DIB数据在文件中的偏移量 }fileHeader; /* 位图数据信息结构 */ typedef struct tagBITMAPINFOHEADER { unsigned long biSize;//该结构的大小,BITMAPINFOHEADER结构所需要的字数 long biWidth;//文件宽度,像素为单位 long biHeight;//文件高度,像素为单位,为正数,图像是倒序的,为负数,图像是正序的 unsigned short biPlanes;//平面数,为目标设备说明颜色平面数,总被置为1 unsigned short biBitCount;//颜色位数,说明比特数/像素 unsigned long biCompression;//压缩类型,说明数据压缩类型 unsigned long biSizeImage;//DIB数据区大小,说明图像大小,字节单位 long biXPixPerMeter;//水平分辨率,像素/米 long biYPixPerMeter;//垂直分辨率 unsigned long biClrUsed;//多少颜色索引表,颜色索引数 unsigned long biClrImporant;//多少重要颜色,重要颜色索引数,为0表示都重要 }fileInfo; /* 调色板结构 */ typedef struct tagRGBQUAD { unsigned char rgbBlue; //蓝色分量亮度 unsigned char rgbGreen;//绿色分量亮度 unsigned char rgbRed;//红色分量亮度 unsigned char rgbReserved; }rgbq; /* 其他数据 */ typedef struct OtherData { unsigned char extradata; struct OtherData *next; }OtherData;