现在的位置: 首页 > 综合 > 正文

TC下对BMP文件的操作

2013年12月01日 ⁄ 综合 ⁄ 共 12381字 ⁄ 字号 评论关闭
TC下对BMP文件的操作

  如果你想用TC对BMP文件进行操作,首先应该清楚BMP的文件格式。

  <TC读取BMP文件>

  在TC的graphic模式下是可以对BMP文件进行读入的,但是因为我们使用的模式是EGAVGA,只能显示16种颜色,所以也就要求BMP文件的属性为16色(位深度4),对BMP文件格式熟悉的朋友都应该知道,除了真彩色中“位图数据区”中存储的就是它的RGB值之外,其他的颜色模式,比如256色,16色 2色,在它们的“位图数据区”中存储的只是“颜色表”的索引值,而颜色表中才是存储着某像素的RGB值。这就给我们在TC的graphic模式下读取BMP文件信息造成了很大障碍,首先,我们不能简单的只读取“位图数据区”中的数据直接当成“颜色值”,因为那只是“颜色表”的“索引值”,比如属性为16色的BMP文件,“位图数据区”中的一个字节为0x00ff,在16色模式中,它并不代表黑色和白色,而是代表在“颜色表”的第0个表和第15个表中的颜色。再者,你通过“索引值”取得的“颜色表”中的是一个RGB值,这个值如何转换成EGAVGA所能表示的16色呢?我曾想过使用近似值的方法,也就是将RGB值归类成EGAVGA所能表示的16种颜色,但这是不可能办到的,因为RGB的取值是256×256×256种颜色(3Byte)。所以最后也只能将“索引值”当成“颜色值”在屏幕上显示了,所幸的是用WINDOWS自带的绘图软件所转换的16色BMP图片的“索引值”基本都等于“颜色值”,当然也有部分的“颜色值”需要我们手动转换,但这样的转换就简单多了(这里我要感谢我的朋友阿华在这方面做的测试,我用的“调色板”是他颜色转换实验的成果),还有,WINDOWS自带的绘图软件所转换后的BMP16色图片中使用的颜色是最接近EGAVGA所能表示的16种颜色(所以看起来失真度也就非常大,当然,我们也可以使用photoshop等等工具来制作16色的BMP图片,但因为这类软件想保证图片的最大真实度,所以它们所转换的16色BMP图片对“颜色表”做了修改,它所表示的16色是RGB中最接近图片本色的16色,所以用photoshop等等工具所转换的16色BMP图片看起来都和原图区别不是很大,但通过这类工具转换的16色BMP图片在我的程序中显示的颜色都是错乱的)。

  <TC写入BMP文件>

  有时候,我们很想将TC在graphic模式下所显示的图像“截取”下来,但因为TC是DOS程序,所以我们无法使用WINDOWS的“截图”功能来办到(这里只以XP系统做说明,因为似乎WIN98和WIN2000可以通过按ALT+TAB 将TC的graphic模式窗口化来达到“截图”的目的),但我们可以通过将TC的graphic模式下的图像保存成一份BMP文件以达到“截图”的目的。具体的做法就是编写你的“颜色表”,在这里,我使用的是EGAVGA的颜色常量值作为“颜色表”的索引值,这样就可以将屏幕上像素的“颜色值”直接保存到BMP文件的中“位图数据区”而无需再做转换,而“颜色表”中的RGB值我将尽可能找到最接近EGAVGA所能表示的16色值的颜色。这样保存的BMP图片无法再用我的BMP读取代码读取出来,因为这个“颜色表”是我自定的,性质如同photoshop对颜色表的优化处理,所以,再用我的BMP读取代码显示在屏幕上的图片颜色将是错乱的。

void screen_save_bmp16(char *savefile,unsigned x1,unsigned y1,unsigned x2,unsigned y2)为BMP文件的写入函数,你可以将它放入你的程序中看效果。
void display_bmp16(char *bmpfile,unsigned x,unsigned y)为BMP文件的读入函数,你可以用WINDOWS自带的绘图软件处理一张16色的BMP图片看效果。

以下是代码,按F1键进行截图:
 

 

抱歉!评论已关闭.