四、BMP图片显示功能扩展
能够对图片进行缩小显示,比如前面那个480x384的图片,能够缩小比例显示在液晶屏上。
3、图片的缩小
(1)分析
这里主要是实现整数倍的缩小,比如缩小为原来的 1/2 1/3等等。当显示图像的时候,跳过一些像素。比如缩小3倍,则每3个像素里取一个显示。
(2)实现的思路
假象显示窗口后面有一个缩小了3倍(宽和高同时缩小)的位图文件。通过显示窗口与该位图文件的关系,得到要显示的位图文件的行列值。比如要显示第Y行,第X个像素,实际在文件数据区是 取得第3Y行、第3X列的颜色数据,显示在液晶上。
(3)程序代码设计
Bmp_ShowWidth = PicInfo.BmpWidth/size;
Bmp_ShowHeight = PicInfo.BmpHeight/size;
以上两行代码取得缩小后位图文件的显示宽度和高度。
PixelOffset = PicInfo.DataOffset + size* ( Bmp_ShowHeight-1 - BmpRow )\
*PicInfo.BytePerRow+ ( PicInfo.BitPerPixel * BmpCol*size )/8;
以上代码的含义是当显示BmpCol行、BmpCol列的时候,实际是取得3 BmpCol行、3 BmpCol列处的颜色数据。
由于代码较长,这里就不例举了。
以下是缩小的显示效果。
![](http://image54.360doc.cn/DownloadImg/2012/08/1211/26113786_1.jpg)
![](http://image54.360doc.cn/DownloadImg/2012/08/1211/26113786_2.jpg)
![](http://image54.360doc.cn/DownloadImg/2012/08/1211/26113786_3.jpg)
![](http://image54.360doc.cn/DownloadImg/2012/08/1211/26113786_4.jpg)
4、单色、16色、256色图片的显示。
这三类图形都具有彩色表。像素数据实质是在彩色表里的索引,每个颜色占据四个字节。以256色图片为例:
res = f_read (&BmpFile, (void *)UserBuf, 1, &ByteRead); //这句话是读出像素数据,8位。
ColorTableOffset = PicInfo.ColorOffset + UserBuf[0]*4; //这个语句是根据像素索引定位相应颜色在颜色表中的位置。
res = f_lseek ( &BmpFile, ColorTableOffset );//文件定位到相应颜色项
res = f_read (&BmpFile, (void *)UserBuf, 3, &ByteRead); //取出索引对应的颜色,可以在液晶上画出该像素。
经测试,256色图片的读取速度比24位真彩色要慢的多,显示一副图片需要一分多钟,因为取得一个像素需要读两次文件。