在VGA上實現灰度顯示的程序實例

 

顯卡所處理的信息最終都要輸出到顯示器上,顯卡的輸出接口就是電腦與顯示器之間的橋樑,它負責向顯示器輸出相應的圖像信號。CRT顯示器因爲設計製造上的原因,只能接受模擬信號輸入,這就需要顯卡能輸入模擬信號。VGA接口就是顯卡上輸出模擬信號的接口,VGAVideo Graphics Array)接口,也叫D-Sub接口。雖然液晶顯示器可以直接接收數字信號,但很多低端產品爲了與VGA接口顯卡相匹配,因而採用VGA接口。VGA接口是一種D型接口,上面共有15針空,分成三排,每排五個。VGA接口是顯卡上應用最爲廣泛的接口類型,絕大多數的顯卡都帶有此種接口。 


  目前大多數計算機與外部顯示設備之間都是通過模擬VGA接口連接,計算機內部以數字方式生成的顯示圖像信息,被顯卡中的數字/模擬轉換器轉變爲RG、B三原色信號和行、場同步信號,信號通過電纜傳輸到顯示設備中。對於模擬顯示設備,如模擬CRT顯示器,信號被直接送到相應的處理電路,驅動控制顯像管生成圖像。而對於LCDDLP等數字顯示設備,顯示設備中需配置相應的A/D(模擬/數字)轉換器,將模擬信號轉變爲數字信號。在經過D/A和A/2次轉換後,不可避免地造成了一些圖像細節的損失。VGA接口應用於CRT顯示器無可厚非,但用於連接液晶之類的顯示設備,則轉換過程的圖像損失會使顯示效果略微下降。

  

#include"stdio.h"
#include"dos.h"
#include<conio.h>
#include<math.h>
#include<math.h>
#include<graphics.h>
unsigned long pre_cale_y2[480];
typedef unsigned char byte;
union REGS reg;
struct SREGS inreg;
typedef struct
{
byte red;
byte grn;
byte blu;
}
rgb;

typedef rgb palette_Register[256];

void set_palette(palette_Register hue)
{
reg.x.ax=0x1012;
segread(&inreg);
inreg.es=inreg.ds;
reg.x.bx=0;
reg.x.cx=256;
reg.x.dx=(int)&hue[0];
int86x(0x10,&reg,&reg,&inreg);
}
void init_palette_2(palette_Register color)
{
int i;
for(i=0;i<36;i++)
{
color[i].red=0;
color[i].grn=0;
color[i].blu=(int)(1.8*i+0.5);
}
for(i=36;i<72;i++)
{
color[i].red=0;
color[i].grn=(int)(1.8*(i-36)+0.5);
color[i].blu=0;
}
for(i=72;i<108;i++)
{
color[i].red=0;
color[i].grn=(int)(1.8*(i-72)+0.5);
color[i].blu=(int)(1.8*(i-72)+0.5);
}
for(i=108;i<144;i++)
{
color[i].red=(int)(1.8*(i-108)+0.5);
color[i].grn=0;
color[i].blu=0;
}
for(i=144;i<180;i++)
{
color[i].red=(int)(1.8*(i-144)+0.5);
color[i].grn=0;
color[i].blu=(int)(1.8*(i-144)+0.5);
}
for(i=180;i<216;i++)
{
color[i].red=(int)(1.8*(i-180)+0.5);
color[i].grn=(int)(1.8*(i-180)+0.5);
color[i].blu=0;
}
for(i=216;i<252;i++)
{
color[i].red=(int)(1.8*(i-216)+0.5);
color[i].grn=(int)(1.8*(i-216)+0.5);
color[i].blu=(int)(1.8*(i-216)+0.5);
}
}
void precale()
{
unsigned int j;
for(j=0;j<480;j++)
{
pre_cale_y2[j]=640*j;
}
}
void plot(int x,int y,char color)
{
long L_offset;
int offset,page;
char far *address;
precale();
if((x<640)&&(y<480))
{
L_offset=pre_cale_y2[y]+x;
page=(L_offset>>16);
offset=L_offset&65535;
outportb(0x3c4,0xe);
outportb(0x3c5,(page&0xf)^0x2);
address=(char far *)(0xa0000000L+offset);
*address=color;
}
}
void put_pix(int x,int y,char color,char inten)
{
char col;
col=((35+1)*(color-1)+inten)&255;
plot(x,y,col);
}
main()
{
int i,j;
palette_Register color;
precale();
reg.h.ah=0;
reg.h.al=0x13;
int86(0x10,&reg,&reg);
init_palette_2(color);
set_palette(color);
for(i=0;i<300;i++)
for(j=0;j<35;j++)
put_pix(i,j,3,j);
getchar();
closegraph();
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章