教育资源为主的文档平台

当前位置: 查字典文档网> 所有文档分类> 论文> 其他论文> Turbo C位图和BMP位图格式分极及应用

Turbo C位图和BMP位图格式分极及应用

上传者:网友
|
翻新时间:2013-12-18

Turbo C位图和BMP位图格式分极及应用

Turbo C位图和BMP位图格式分极及应用 Turbo C位图和BMP位图格式分极及应用 Turbo C位图和BMP位图格式分极及应用 近来,图像功能在计算机上的应用十分广泛,一种方便快捷而实用的方法是首先利用图像扫描仪将图像数据自动生成并存入计算机,再利用Windows的PAINTBRUH功能进行加工修改,成为独立的图像文件。但是,仍然有一个问题:PAINTBRUH软件只能在Windows环境下运行。因此要显示一幅图像(.MSP位图、.BMP位图、PCX位图),也要运行庞大的Windows,显然不方便。为此,笔者编写了一个BMP位图文件直接显示在屏幕上的程序。利用Turbo C位图格式,将BMP格式进行转换,实现了这一功能。

一、Turbo C位图格式

Borlond公司的Turbo C是目前在微机上最为流行的C语言版本。它为软件开发者提供了丰富的屏幕操作与图形功能函数。其中getimage( )函数用于将屏幕内的某矩形区域复制到内存缓冲区,putimage( )函数将内存缓冲区中的内容再复制到屏幕上。但由于图像事先还没有出现在屏幕上,所以,不能使用getimage( )函数填写供putimage( )函数显示的内存图像数据。不过可以把图像数据按getimage( )函数产生的格式填于内存缓冲区中,然后调用putimage( )函数,显示内存缓冲区图像,下面分析getimage( )函数产生的格式:

getimage (int letf, int top, int night, int bottm, *buf)

其中,left, top——矩形区域左上角坐标(x,y)。

right, bottom——矩形区域右上角坐标(x,y)。

* buf——指向存储屏幕数据的内存指针。

在内存中,图像数据是按行存放的。头两个字节为图像的宽度,接下去两个字节为图像的高度(均为低字节在前,高字节在后)。后面是真正的图像数据,它以图像的宽度为单位,先是图像的第一行第三位面的内容,然后是第一行第二位面的内容;第一行第一位面的内容;第一行第零位面的内容。第一行完后,接第二行的四个位面,第三行的四个位面等等。当屏幕状态为16色时,则需4个彩色页面。这时,如果图像的宽度为8的整数倍时,则每

行所需的字节数为:

number=(right-left+

8) 18*4

如果图像的宽度不为8的倍数据时,则

number=(ceil ((right-left)/

8)*

4)

其中,ceil (righ-left)8为取大于(right-left)/8的最小整数

则图像数据所需字节总数为:

number * (bottom-top+

1)

则所需内存缓冲区字节总数为:

6+number * (bottom -top+

1)

这是因为头四个字节存放图像的宽和高,而缓冲区最后2个字节无意义,可以填零。

@@T5S04700.GIF;图 1@@

这样,每行每页面的字节数为:

p=number/4

如图1所示(设宽、高为16×

1

6)

其中,图像的真正数据在每个页面的前m列,即:

当宽度为8的倍数据时,m=P-1,此时每页面的最后一列可为零。而当宽度不为8的倍

数时,m=P。

二、BMP位图格式

MS Windows的.BMP图像文件可以表示单色或直至24位的彩色图像,.BMP文件是与设备无关的。.BMP文件分为文件首部和文件体两部分。文件首部描述文件和图像的有关参数和彩色表,主体是图像的位图数据。.BMP文件的格式如表1所示。

@@T5S04701.GIF;表1 BMP文件的格式@@

@@T5S04702.GIF;表2 BMP与VGA彩色编码对照@@但.BMP位图的彩色编码与VGA彩色编码不同,必须经过转换才能用C语言在屏幕上显示。表2给出了.BMP位图彩色编码与VGA彩色编码的对照。

三、.BMP位图向Turbo C位图的转换

当VGA视频内存在选择640×480模式时占用4个位面。每个位面上的一位对应一个点。而.BMP位图则采用压缩法的组织形式,两者显然不同。因此,也需要一个变换过程,见图2。

根据这一原理,首先进行彩色编码转换,然后将.BMP位图数转换成C位图格式,写入内存缓冲区的适当位置。

@@T5S04703.GIF;图2 从BMP位图到VGA视频内存的变换过程@@

为了便于参考,笔者编制了一个程序。本程序只要给出.BMP文件的名字,程序会自行在屏幕上显示出来。需说明的是,本程序只能用于小于64K的图像。但也可以将一幅大的.BMP图像分成若干小图像即可。对图像文件格式转换感兴趣的读者,也不难将本程序拓展到自己的应用领域。程序附后。

# include <stdio.h>

# include <graphics.h>

# include <alloc.h>

# include <math.h>

unsigned char convert ();

main()

{

int 1, i, j, k, q, h;

int driver=VGA, mode=VGAHI;

int lenth, high, number, p, m;

unsigned size;

unsigned char ch, a[8], b[4], e[4][8];

FILE *fp; char *s;

fp=fopen (“party. bmp” , “rb”);

fseek (fp, 18, 0); lenth=getw (fp);

/* graphics width */

fseek (fp, 22, 0); high=getw (fp);

#/* graphics high */

#if ((lenth%

8)==0) number= (lenth+

8)/8*4

#/* bytes of each line */

# else number=4*(ceil ((double)1enth/

8));

up=number/4;

mif ((lenth%

8)!=0) m=p;

{/* bytes of each line/4 */

else m=p-1;

size=6+number*(high+

1)

/* need memory bytes of graphics */

if ((s=char *) malloc (size))==NULL)

{ printf (“malloc error !\n”); exit (0);}

s[0]=lenth & 0x00ff; s[1]=(lenth& 0xff00)>>8;

s[2]=high & 0x00ff; s[3]=(high & 0xff00)>>8;

for (i=4; i<size; i++) s[i]=0;

fseek (fp, 118,0);

#for (l=high-1; 1>=0; 1--)

#for (q=0; q<m; q++) {

# for (k=0; k<4; k++) {

#ch=getc (fp);

uch=convert (ch);{a[2]=(ch&0x

4)>>2;a[3]=(ch&0x

8)>>3;a[6]=(ch&0x

40)>>6;a[7]=(ch&0x

80)>>7;

h=7;

for (j=0; j<2; i++)

for (j=0; j<4; i++) {

e[j][i+2*k]=a[h];

h--;

}

}

#for (i=0; i<4; i++) {#(e[i][3]<<

4)+(e[i][4]<<

3)+(e[i][5]<<

2)+

#(e[i][6]<<

1)+(e[i][7]);

u s[4+number *1+q]=b[0]; s[4+number *1+q+p]=b[1];{ }

fclose (fp); initgraph (&driver, &mode, “d:\\tc”);

putimage (0, 0, s, 0); getch();

free(s): closegraph();

}

unsigned char convert (unsigned char ch)

/* bmp color convert vga color */

{

unsigned char c[2];

int i;

#c[0]=(ch&0xf0)>>4;

#c[1]=ch&0x0f;

#for (i=0; i<2; i++) {

#if (c[i]==0x0

1) {c[i]=0x04; continue;}

uif (c[i]==0x0

3) {c[i]=0x6; continue;}

mif (c[i]==0x0

4) {c[i]=0x01; continue;}

{if (c[i]==0x0

6) {c[i]=0x03; continue;}

if (c[i]==0x0

7) {c[i]=0x8; continue;}

if (c[i]==0x0

8) {c[i]=0x07; continue;}

if (c[i]==0x0

9) {c[i]=0xc; continue;}

if (c[i]==0x0b) {c[i]=0xe; continue;}

if (c[i]==0x0c) {c[i]=0x9; continue;}

if (c[i]==0x0e) c[i]=0x0b;

}

ch=(c[0]<<

4)+c[1];

return ch;

#}

#

下载文档

版权声明:此文档由查字典文档网用户提供,如用于商业用途请与作者联系,查字典文档网保持最终解释权!

网友最新关注

小木船
小木船(2)
珍惜资源崇尚节约
珍惜资源 造福子孙
珍惜资源爱护环境
风波
一艘小木船
小木船
读《少年闰土》有感
友谊的见证
我和陈明续写
友谊之船
养鸟
我最喜欢的一首诗9
我和陈明续写
开车犯错的检讨书范文
不假外出的检讨书范文
公司开会迟到检讨书范文
列车乘务员工作失误检讨书范文
违反交通安全法的检讨书范文
学生违反校纪校规检讨书范文
行为恶劣的检讨书范文
工作态度检讨书
考试不好检讨书
工作服务态度差的检讨书范文
学生党员给党组织的检讨书范文
擅自做主请求原谅的检讨书范文
工作管理失职的检讨书范文
深刻的交通违章检讨书范文
大学宿舍安全检讨书
嘉兴市农信系统加强内部审计人员后续教育
股权出质在公司经营过程中的运用
丈夫死于车祸,妻子告赢交警队
试论建筑工程合同管理的重要性
关于发展和谐旅游的路径选择(1)论文
解决家庭教育短视问题的途径及探讨
解析溶液浓度的有关计算
医疗负压在口腔医学上的应用
案件追踪
脉冲末修迫弹弹道特性教育统计安装包分析与控制方案设计
从个人理性到集体理性——对管理核心问题的分析
中医耳穴压丸法的护理
计算机网络技术分析
浅述农村小学校本教研应注意的问题
缝合眼睑裂伤的临床疗效与护理
《卡罗尔和她的小猫》老师语录
《我不是最弱小的》随堂练习-----提高篇
《雷锋叔叔,你在哪里》教案四
《我不是最弱小的》写作指导
《卡罗尔和她的小猫》教案一
《卡罗尔和她的小猫》写作指导
《我不是最弱小的》之老师语录
《雷锋叔叔,你在哪里》考点练习
《卡罗尔和她的小猫》重难点分析
《我不是最弱小的》同步写作范文 关爱我的王老师
《雷锋叔叔,你在哪里》 雷锋精神的意义
《卡罗尔和她的小猫》教案二
《我不是最弱小的》教案(二)
《我不是最弱小的》教案一
《我不是最弱小的》训练素材