TC下对BMP文件的操作

原创 2007年09月14日 00:14:00
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键进行截图:
 



 

相关文章推荐

用TC输出BMP文件

  • 2012年04月18日 18:22
  • 107KB
  • 下载

<MFC笔记>BMP位图文件的格式及其操作

表一:BMP文件的总体结构 -------------------------------------------------------- 偏移量() 长度(字节) -------------...

BMP文件格式读取与操作

  • 2009年02月27日 15:36
  • 792KB
  • 下载

OpenGL入门学习之十——BMP文件与像素操作

学过多媒体技术的朋友可能知道,计算机保存图象的方法通常有两种:一是“矢量图”,一是“像素图”。矢量图保存了图象中每一几何物体的位置、形状、大小等信息,在显示图象时,根据这些信息计算得到完整的图象。“像...

BMP文件与像素操作(glReadPixels,glDrawPixels和glCopyPixels应用举例)

转载自:http://bbs.pfan.cn/showtxt.asp?id=227694OpenGL入门学习[十]今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。...

BMP文件的相关操作

BMP生成与显示
  • lcalqf
  • lcalqf
  • 2014年12月31日 09:34
  • 663

C++操作BMP文件

BMP文件构成: 文件头+文件信息头+RGB数据 文件头正常为14字节; 文件信息头正常为40字节。 RGB数据与文件头偏移量正常为14+40=54 BMP图像操作: 1.      ...
  • popten
  • popten
  • 2015年11月27日 16:38
  • 302

OpenGL入门学习[十]OpenGL的像素操作、BMP文件

OpenGL入门学习[十] 今天我们先简单介绍Windows中常用的BMP文件格式,然后讲OpenGL的像素操作。虽然看起来内容可能有点多,但实际只有少量几个知识点,如果读者对诸如“显示BM...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TC下对BMP文件的操作
举报原因:
原因补充:

(最多只允许输入30个字)