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中打开文件和写入文件

四年前在大学的时候学过这个,没有想到,在现在看来这个东西还是这么的流行.这正验证了那句话,越是简单的东西,功能越是强大,生命力越是顽强!你可别小看这简单的TC.听说很多高手都在用,很多骨灰级的高手也用...
  • fengmm521
  • fengmm521
  • 2017年11月03日 18:46
  • 332

用C++语言写bmp文件的程序完整版

#include #include /* 定义WORD为两个字节的类型 */ typedef unsigned short WORD; /* 定义DWORD为四个字节的类型 */ typedef...
  • weiaipan1314
  • weiaipan1314
  • 2016年06月24日 16:42
  • 665

介绍一下MFC对话框工程读取BMP文件并显示的例子

介绍一下MFC对话框工程读取BMP文件并显示的例子
  • yangfm315
  • yangfm315
  • 2011年05月10日 16:56
  • 3511

Qt 写bmp文件

将8bit位图数据写入bmp#include #include #include #include #include using namespace std; int main(int arg...
  • u010945073
  • u010945073
  • 2016年03月29日 15:45
  • 1352

[ahk]如何将XP系统的资源管理器替换成TC

在DO中有接管WindowsExplorer对计算机中的文件进行管理的选项。TC(TOTALCMD)在启动方面(双击桌面启动、alt tab切换)有些弱,也未提供替换系统Explorer选项。 ...
  • liuyukuan
  • liuyukuan
  • 2013年01月11日 15:57
  • 4854

linu下C语言之BMP图片操作编程(上)

BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备。    微软已经定义了一个特定...
  • morixinguan
  • morixinguan
  • 2016年02月22日 22:50
  • 2167

Linux 下 TC 命令详解与事例

tc - 显示/维护流量控制设置 摘要 tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ]...
  • eydwyz
  • eydwyz
  • 2016年09月08日 08:59
  • 1854

TC设置详解

对于初学程序设计的人来说Turbo C 2.0无疑是最简单最理想的入门语言环境之一,但也常由于环境变量设置的不正确导致程序无法编译运行,严重打击了初学者来之不易的自信心。为了迅速解决此类问题,使大家能...
  • tykw163
  • tykw163
  • 2008年07月21日 16:22
  • 4880

oracle11g 将某个用户下的数据导出成.bmp格式的文件,并将该文件导入到另一个库中

1、数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production 2、导出方式  window命...
  • wanglikui_521
  • wanglikui_521
  • 2017年09月17日 11:51
  • 248

可跨平台的写BMP文件方法(linux 和windows)

方法一:        void SaveImage(char *file,unsigned char* bmp,int w ,int h,int position) { int i = 0...
  • yumulinxiang
  • yumulinxiang
  • 2016年11月15日 00:02
  • 574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TC下对BMP文件的操作
举报原因:
原因补充:

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