国产在线导航,欧美日本中文,黄色在线观看网站永久免费乱码,chinese国产在线视频,亚洲欧洲第一视频,天天做人人爱夜夜爽2020毛片,亚洲欧美中文字幕在线网站

現(xiàn)在位置:范文先生網(wǎng)>理工論文>計(jì)算機(jī)論文>Turbo C位圖和BMP位圖格式分極及應(yīng)用

Turbo C位圖和BMP位圖格式分極及應(yīng)用

時(shí)間:2023-02-20 22:51:42 計(jì)算機(jī)論文 我要投稿
  • 相關(guān)推薦

Turbo C位圖和BMP位圖格式分極及應(yīng)用

   近來(lái),圖像功能在計(jì)算機(jī)上的應(yīng)用十分廣泛,一種方便快捷而實(shí)用的方法是首先利用圖像掃描儀將圖像數(shù)據(jù)自動(dòng)生成并存入計(jì)算機(jī),再利用Windows的PAINTBRUH功能進(jìn)行加工修改,成為獨(dú)立的圖像文件。但是,仍然有一個(gè)問(wèn)題:PAINTBRUH軟件只能在Windows環(huán)境下運(yùn)行。因此要顯示一幅圖像(.MSP位圖、.BMP位圖、PCX位圖),也要運(yùn)行龐大的Windows,顯然不方便。為此,筆者編寫(xiě)了一個(gè)BMP位圖文件直接顯示在屏幕上的程序。利用Turbo C位圖格式,將BMP格式進(jìn)行轉(zhuǎn)換,實(shí)現(xiàn)了這一功能。
一、Turbo C位圖格式
Borlond公司的Turbo C是目前在微機(jī)上最為流行的C語(yǔ)言版本。它為軟件開(kāi)發(fā)者提供了豐富的屏幕操作與圖形功能函數(shù)。其中g(shù)etimage( )函數(shù)用于將屏幕內(nèi)的某矩形區(qū)域復(fù)制到內(nèi)存緩沖區(qū),putimage( )函數(shù)將內(nèi)存緩沖區(qū)中的內(nèi)容再?gòu)?fù)制到屏幕上。但由于圖像事先還沒(méi)有出現(xiàn)在屏幕上,所以,不能使用getimage( )函數(shù)填寫(xiě)供putimage( )函數(shù)顯示的內(nèi)存圖像數(shù)據(jù)。不過(guò)可以把圖像數(shù)據(jù)按getimage( )函數(shù)產(chǎn)生的格式填于內(nèi)存緩沖區(qū)中,然后調(diào)用putimage( )函數(shù),顯示內(nèi)存緩沖區(qū)圖像,下面分析getimage( )函數(shù)產(chǎn)生的格式:
getimage (int letf, int top, int night, int bottm, *buf)
其中,left, top——矩形區(qū)域左上角坐標(biāo)(x,y)。
right, bottom——矩形區(qū)域右上角坐標(biāo)(x,y)。
* buf——指向存儲(chǔ)屏幕數(shù)據(jù)的內(nèi)存指針。
在內(nèi)存中,圖像數(shù)據(jù)是按行存放的。頭兩個(gè)字節(jié)為圖像的寬度,接下去兩個(gè)字節(jié)為圖像的高度(均為低字節(jié)在前,高字節(jié)在后)。后面是真正的圖像數(shù)據(jù),它以圖像的寬度為單位,先是圖像的第一行第三位面的內(nèi)容,然后是第一行第二位面的內(nèi)容;第一行第一位面的內(nèi)容;第一行第零位面的內(nèi)容。第一行完后,接第二行的四個(gè)位面,第三行的四個(gè)位面等等。當(dāng)屏幕狀態(tài)為16色時(shí),則需4個(gè)彩色頁(yè)面。這時(shí),如果圖像的寬度為8的整數(shù)倍時(shí),則每
行所需的字節(jié)數(shù)為:
number=(right-left+8) 18*4
如果圖像的寬度不為8的倍數(shù)據(jù)時(shí),則
number=(ceil ((right-left)/8)*4)
其中,ceil (righ-left)8為取大于(right-left)/8的最小整數(shù)
則圖像數(shù)據(jù)所需字節(jié)總數(shù)為:
number * (bottom-top+1)
則所需內(nèi)存緩沖區(qū)字節(jié)總數(shù)為:
6+number * (bottom -top+1)
這是因?yàn)轭^四個(gè)字節(jié)存放圖像的寬和高,而緩沖區(qū)最后2個(gè)字節(jié)無(wú)意義,可以填零。
@@T5S04700.GIF;圖 1@@
這樣,每行每頁(yè)面的字節(jié)數(shù)為:
p=number/4
如圖1所示(設(shè)寬、高為16×16)
其中,圖像的真正數(shù)據(jù)在每個(gè)頁(yè)面的前m列,即:
當(dāng)寬度為8的倍數(shù)據(jù)時(shí),m=P-1,此時(shí)每頁(yè)面的最后一列可為零。而當(dāng)寬度不為8的倍
數(shù)時(shí),m=P。
結(jié)合圖1 m=2,即數(shù)據(jù)在每頁(yè)面的前2列。
二、BMP位圖格式
MS Windows的.BMP圖像文件可以表示單色或直至24位的彩色圖像,.BMP文件是與設(shè)備無(wú)關(guān)的。.BMP文件分為文件首部和文件體兩部分。文件首部描述文件和圖像的有關(guān)參數(shù)和彩色表,主體是圖像的位圖數(shù)據(jù)。.BMP文件的格式如表1所示。
@@T5S04701.GIF;表1 BMP文件的格式@@
@@T5S04702.GIF;表2 BMP與VGA彩色編碼對(duì)照@@
.BMP文件的文件體記錄圖像的位圖數(shù)據(jù)。從圖像的左下角開(kāi)始依次掃描每根掃描線。對(duì)于單色,每個(gè)象素用1位表示;16色用4位表示一個(gè)象素,256色用一個(gè)字節(jié),而24位彩色用3個(gè)字節(jié)。
但.BMP位圖的彩色編碼與VGA彩色編碼不同,必須經(jīng)過(guò)轉(zhuǎn)換才能用C語(yǔ)言在屏幕上顯示。表2給出了.BMP位圖彩色編碼與VGA彩色編碼的對(duì)照。
三、.BMP位圖向Turbo C位圖的轉(zhuǎn)換
當(dāng)VGA視頻內(nèi)存在選擇640×480模式時(shí)占用4個(gè)位面。每個(gè)位面上的一位對(duì)應(yīng)一個(gè)點(diǎn)。而.BMP位圖則采用壓縮法的組織形式,兩者顯然不同。因此,也需要一個(gè)變換過(guò)程,見(jiàn)圖2。
根據(jù)這一原理,首先進(jìn)行彩色編碼轉(zhuǎn)換,然后將.BMP位圖數(shù)轉(zhuǎn)換成C位圖格式,寫(xiě)入內(nèi)存緩沖區(qū)的適當(dāng)位置。
@@T5S04703.GIF;圖2 從BMP位圖到VGA視頻內(nèi)存的變換過(guò)程@@
為了便于參考,筆者編制了一個(gè)程序。本程序只要給出.BMP文件的名字,程序會(huì)自行在屏幕上顯示出來(lái)。需說(shuō)明的是,本程序只能用于小于64K的圖像。但也可以將一幅大的.BMP圖像分成若干小圖像即可。對(duì)圖像文件格式轉(zhuǎn)換感興趣的讀者,也不難將本程序拓展到自己的應(yīng)用領(lǐng)域。程序附后。
# 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& 0xf

f00)>>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);
ma[0]=ch&0x1; a[1]=(ch&0x2)>>1;
{a[2]=(ch&0x4)>>2;a[3]=(ch&0x8)>>3;
a[4]=(ch&0x10)>>4;a[5]=(ch&x20)>>5;
a[6]=(ch&0x40)>>6;a[7]=(ch&0x80)>>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++) {
# b[i]=(e[i][0]<<7)+(e[i][1]<<6)+(e[i][2]<<5)+
#(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];
m s[4+number *1+q+2*p]=b[2]; s[4+number *1+q+3*p]=b[3];
{ }
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]==0x01) {c[i]=0x04; continue;}
uif (c[i]==0x03) {c[i]=0x6; continue;}
mif (c[i]==0x04) {c[i]=0x01; continue;}
{if (c[i]==0x06) {c[i]=0x03; continue;}
if (c[i]==0x07) {c[i]=0x8; continue;}
if (c[i]==0x08) {c[i]=0x07; continue;}
if (c[i]==0x09) {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;
#}


【Turbo C位圖和BMP位圖格式分極及應(yīng)用】相關(guān)文章:

SDH專(zhuān)用電路套片DTT1C08A和DTT1C20A及其應(yīng)用08-06

比和比的應(yīng)用08-16

二極管和發(fā)光二極管教案示例08-17

分·和作文04-02

C8051F020中的ADC應(yīng)用要素08-06

Sigmatek C-IPC在螺栓緊固機(jī)械上的應(yīng)用08-06

簡(jiǎn)歷的內(nèi)容和格式08-15

百分率的應(yīng)用08-16

TMS320C54x系列DSP中的應(yīng)用08-06