希望大家自己做哈,当作参考,不要抄袭= =(被查出来就不好了)
实验三:编写DIB图象读/写程序
信息科学与技术学院 计算机科学与技术 2292015220xxxx xxx
一、实验名称
编写DIB图象读/写程序
二、实验内容
用VC++实现DIB位图(. BMP)的显示、读文件、另存文件及相互转换格式。
实验使用的操作系统是Windows 10,使用的软件是VC6.0和VS2017。
三、算法分析
首先了解bmp位图的数据分块及每一数据块分别表示的内容。
BMP格式为
§ 位图文件头(14字节)
§ 位图信息头(40字节)
§ 调色板 (可变长)
§ 图像数据
程序需要从文件读入文件头,判断文件类型是否为bmp位图,若是,则接下来需要读取信息头,根据信息头中的biBitCount判断该位图的颜色数,为2色、16色、256色和真彩色的一种,1个字节分别表示8、2、1、1/3个像素,然后根据颜色数读入调色板信息,最后再读入图像数据。
读入后需要用OnDraw函数显示位图,针对2、16、256色位图,每次取出一个字节的信息,定义gethigh用于使用位运算取出高位的数据,定义shl为bit长度,根据取出的索引值到调色板中找出相应的颜色,输出在屏幕上(数据为从上到下,从左到右读入,但是填充颜色时从下到上,从左到右,左下角为原点)。若是真彩色图,则每次读入3个字节,每个字节分别为Blue、Green、Red的索引值。注意每一行的字节数必须为4的倍数,不足则要跳过补全的数据区,否则图像会错位。
另存为功能写出文件时,从已读入数据依次将文件头、信息头、调色板和图像数据输出至文件即可。
四、实验步骤
1、首先新建一个MFC工程,接着在类向导中加入消息映射-打开文件功能ID_FILE_OPEN COMMAND,加入消息映射-另存为功能ID_FILE_SAVE_AS COMMAND
2、新建一个位图类结构体DIB,一个文件头类BMPFileHeader,一个信息头类BMPInfoHeader,一个调色板类RGBQuad,与图像数据一起构成一个位图。使用#pragma pack(i) 定义最小读取字节长度,对DIB声明两个函数Read和Write分别用于读入位图信息和写出位图信息。
3、编写ID_FILE_OPEN函数,打开需要读取的文件之后,调用DIB的读取函数Read进行读取;编写ID_FILE_SAVE_AS函数,另存为时调用DIB的写出函数Write进行写出。
4、在DIB中编写Read和Write函数的具体实现。对于Read,读入文件头,判断是否文件为位图,是则读取信息头,根据信息头中的biBitCount判断该位图的颜色数,为2色、16色、256色和真彩色的一种,1个字节分别表示8、2、1、1/3个像素,然后根据颜色数读入调色板信息,最后再读入图像数据。否则报错终止运行。对于Write,依次往目标文件写入文件头、信息头、调色板和图像数据。
5、编写OnDraw函数,用于显示图像,针对2、16、256色位图,每次取出一个字节的信息,定义gethigh用于使用位运算取出高位的数据,定义shl为bit长度,根据取出的索引值到调色板中找出相应的颜色,输出在屏幕上(数据为从上到下,从左到右读入,但是填充颜色时从下到上,从左到右,左下角为原点)。针对真彩色图,则每次读入3个字节,每个字节分别为Blue、Green、Red的索引值。注意每一行的字节数必须为4的倍数,不足则要跳过补