设为首页   加入最爱           最新更新:全方位英文文章资料库
 
资料坊搜索: 标题 全文     
在16色模式下显示256色及全彩色
   首页>>YesizeCOM>>论文坊>>农医学类>>正文       
 
广告招租,e-mail:yesize@hotmail.com

广告招租,e-mail:yesize@hotmail.com

摘 要 该文描述了在VGA16色图形模式下显示256色及全彩色图像的抖动算法,并给出了显示BitMap图像的C语言程序。 
在编写有关图像显示的软件时,有时为了软件的兼容性和通用性,不得不采用VGA标准的图形模式,这就涉及到如何在16色图形模式下显示256色及全彩色图像的问题。解决这一问题有两种方法。一种是采用色彩近似的方法,即根据需要显示的全部颜色,经过寻优来选择16种最具代表性的颜色,每一种颜色都用这16种颜色中最接近的一种来代替。《计算机世界月刊》1994年第1期的《用集群方法进行颜色选择》一文详细描述了该方法。但事实上,该方法仅对于某些理想的情况适用,而对于更普遍的情况,该方法无论从运算速度还是从处理效果来讲,都不可能令人感到满意,因而不宜在实际中运用。另一种方法是被众多商品化软件所广泛采用的抖动技术,其原理是利用多种可见颜色的组合来模拟一种不可见的颜色。目前,关于彩色图像抖动算法的资料不多。笔者通过对灰度图像处理算法及Windows环境下一些图像处理软件的剖析,得出了抖动算法的一般原理和实现方法。 
一、抖动算法原理 
我们知道,在256色及全彩色图像中,每一种颜色均由R、G、B三个颜色分量组成,而每一个分量又一般由一个字节表示。这样,每一个颜色分量可有256级亮度变化。 
本算法的关键在于引入亮度矩阵的概念,即采用一个16×16的矩阵来表示每一个颜色分量的亮度值,不同亮度值对应着矩阵的不同排列。矩阵全为0时对应亮度0,全为255时对应亮度255。 
当亮度值为L时,亮度矩阵中将有[L255×256]个255及[(1-L255)×256]个0,此时,矩阵的平均亮度值为L’={[L/255×256]×255+[(1-L/255)×256]×0}/256=L这就是说,矩阵的平均亮度正好为颜色分量的实际亮度。 
假设某一颜色C的R、G、B三个颜色分量的亮度矩阵分别为: 
@@01A04600.GIF;公式一@@其中rmn、gmn、bmn(0≤m, n≤15)取值为0或15。 
将上述三个矩阵作叠加运算,得@@01A04601.GIF;公式二@@其中的Cmn为表1中由rmn、gmn、bmn所确定的颜色值。表1为VGA16色图形模式下的标准调色板(并非设置模式后的缺省调色板)。显然,Cmn只可能为0及9~15之中的一个。由此方法得到的矩阵Mc即可视为颜色C的模拟矩阵。由于颜色C的R、G、B三个颜色分量与亮度矩阵 
MR、MG、MB有着相等的亮度值,所以矩阵MC从视觉效果上来讲能很好地模拟颜色C。但在显示时,不可能用整个这样的矩阵来替代一个像素点,那将导致整幅图像长宽均变成原图的16倍。实际的做法是:若该像素点距离图像原点的座标为(X,Y),则令: 
m=Y mod 16 
n=X mod 16 (1) 
此时,可用MC中的颜色Cmn来显示该像素。 
@@01A04602.GIF;表1 16色图形模式标准调色板@@ 
二、算法实现 
1.亮度矩阵的表示 
算法中要用到257个16×16的亮度矩阵,如果对每一个都分别表示的话,将占用很大的内存空间(大于64K)。由于亮度矩阵的排列及增长均有一定的规律性,我们只需要采用一个16×16的矩阵即可。该矩阵中256个元素的取值分别为0~255,按一定规律排列。令其为: 
@@01A04603.GIF;公式三@@亮度为L时的矩阵可由H变化而来,其中@@01A04604.GIF;公式四@@2.颜色查找表算法中只用到了颜色0及9~15,我们可以忽略其他项并将有用部分表示为一个三维数组形式的颜色查找表,如表2所示。此时,r, g, b值作为数组下标,取值为0或1。 
与之相应,我们将(2)式变为@@01A04605.GIF;公式三@@ 
3.每一像素的显示步骤 
①对256色图像,由颜色索引值查颜色映射表获取R、G、B值;对全彩色图像,直接读取R、G、B值; 
②根据像素座标(X,Y),由(1)式求得m, n; 
③根据R、G、B值,由(3)式求得rmn、gmn、bmn; 
④由rmn、gmn、bmn查表2得颜色值C;  ;
⑤将像素以颜色C显示于(X,Y)处。 
本文所附程序用于在16色图形模式下显示256色及全彩色BitMap图像。 
关于BitMap图像的格式及读取方法,许多资料均有介绍,这里不再赘述。 
该程序由Turbo C 2.0及Borland C 3.1编译,在386兼容机上运行通过。运行方法为: 
show文件名.BMP 
@@01A04606.GIF;公式三表2 颜色查找表@@事实证明,采用本文所描述的算法,可以得到与许多商品化软件相似的处理速度和处理效果。 
源程序: 
#include<stdio.h> 
#include<dos.h> 
#include<stdio.h> 
#include<conio.h> 
#define NoError 0 
#define ErrorFileOpen1 
#define ErrorFileType 2 
#define ErrorImageColor 3 
typedef struct tagBITMAPFILEHEADER { 
unsigned int bfType; 
unsigned longbfSize; 
unsigned intbfReserved1; unsigned intbfReserved2; 
unsigned longbfoffBits; 
} BITMAPFILEHEADER; 
typedef struct tagBITMAPINFOHEADER { 
unsigned longbiSize; 
unsigned long biWidth; 
unsigned longbiHeight; 
unsigned intbiPlanes; 
unsigned intbiBitCount; 
unsigned long biCompression; 
unsigned long biSizeImage; 
unsigned long biXPelsPerMeter; 
unsigned long biYPelsPerMeter; 
unsigned long biClrUsed; 
unsigned long biClrImportant; 
} BITMAPINFOHEADER; 
typedef struct tagRGBQUAD { 
unsigned char rgbBlue; 
unsigned char rgbGreen; 
unsigned charrgbRed; 
unsigned char rgbReserved; 
} RGBQUAD; 
void main(int argc,char *argv[])
R>int ShowBmp(char *FileName); 
int GetColor(unsigned char R,unsigned char G, unsigned char  ;B,int X,int Y) 

void SetVideoMode(unsigned char Mode); 
void SetPalReg(unsigned char *palReg); 
void SetDacReg(unsigned char *DacReg, int Color, int Count); 
void PutPixel(int X, int Y,unsigned char Color); 
unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0}; 
unsigned char StandardPal[48]= { 
0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 
32, 48,48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,6 
3,63,}; 
unsigned char LightnessMatrix [16][16]= { 
{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213}, 
{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116}, 
{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244}, 
{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92}, 
{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220}, 
{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124}, 
{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252}, 
{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86}, 
{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214}, 
{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118}, 
{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246}, 
{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94}, 
{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222}, 
{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126}, 
{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,25 4}, 
{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85}, 
}; 
unsigned char ColorTable[2][2][2]= { 
{{0,12},{10,14}},{{9,13},{11,15}}}; 
unsigned char ColorMap[256][3]; 
void main (int argc, char *argv[]) 

if(argc!=2) { 
printf("Usage:\n\tSHOW Filename.BMP\n"); 
exit(1); 

ShowBmp(argv[1]); 

int ShowBmp(char *FileName) 

FILE *Fp; 
BITMAPFILEHEADER FileHead; 
BITMAPINFOHEADER InfoHead; 
RGBQUAD RGB; 
int N, W,Y,X,C,Color; 
unsigned char Buffer[4096]; 
if (!(Fp=fopen(FileName,"rb"))) 
return(ErrorFileOpen); 
fread(&FileHead,siazeof(BITMAPFILEHEADER),1,Fp); 
if(FileHead.bfType!=’BM’) 
return(ErrorFileType); 
fread(&InfoHead,sizeof(BITMAPFILEHEADER),1,Fp); 
if(InfoHead.biBitcount!=8 && InfoHead.biBitCount!=24) { 
fclose(Fp); 
return(ErrorImageColor); 

SetVideoMode(0x12); 
SetPalReg(PalReg); 
SetDacReg(StandardPa1,0,16); 
if(InfoHead.biBitcount==8) { 
for (N=0;N<256;N++) { 
fread(&RGB, sizeof(RGBQUAD),1,Fp); 
ColorMap[N][0]=RGB.rgbRed; 
ColorMap[N][1]=RGB.rgbGreen; 
ColorMap[N][2]=RGB.rgbBlue; 

W=(InfoHead.biwidth+3)/4*4; 
for(Y=InfoHead.biHeight-1;Y>=480;Y--) 
fread(Buffer,sizeof(unsigned char),W,Fp); 
for(;Y>0;Y--) { 
fread(Buffer, sizeof(unsigned char),w,FP); 
for (X=0;X<InfoHead.biWidth && X<640;X++) { 
C=Buffer[X];  ;
Color=GetColor(Color 

Map[C][0],ColorMap[C][1],C 
olorMap[C][2],X,Y); 
PutPixel (X,Y,color); 



else { 
W=(infoHead.biWidth*3+3)/4*4; 
for(Y=InfoHead.biHeight-1;Y>639;Y--) 
fread(Buffer,sizeof(unsigned char),W,Fp); 
for(;Y>=0;Y--) { 
fread(Buffer,sizeof(unsigned char),W,Fp); 
for (X=0;X<InfoHead.biWidth && X<640;X++) { 
C=X*3; 
Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[ 
C],X,Y); 
PutPixel(X,Y,color); 



getch(); 
fclose(Fp); 
SetVideoMode(0x03); 
return(NoError); 

int GetColor(unsigned char R, unsigned char G,unsigned char B, int X, 
int Y){ 
unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F]; 
return(colorTable[( 
unsigned int)R*256/255>L][( 
unsigned int)G*256/255>L][( 
unsigned int)B*256/255>L]);} 
void SetVideoMode(unsigned char Mode){ 
-H=0x00; 
-AL=Mode; 
geninterrupt(0x10); 

voidSetPalReg(unsigned char *PalReg){ 
-ES=FP-SEG((unsigned char far*)PalReg); 
-DX=FP-OFF((unsigned char far*)PalReg; 
-AX=0x1002; 
geninterrupt(0x10); 

void SetDacReg(unsigned char *DacReg,int Color,int Count){ 
-ES=FP-SEG((unsigned char far*)DacReg); 
-DX=FP-OFF((unsigned char far*)DacReg); 
-AX=0x1012; 
-BX=Color; 
-CX=Count; 
geninterrupt(0x10); 

void PutPixe l(int X, int Y, unsigned charColor){ 
-AH=0x0C; 
-AL=Color; 
-CX=X; 
-DX=Y; 
geninterrupt(0x10); 
上一篇:用Word97编辑高等数学公式 下一篇:多重透明无闪烁微机动画设计

版权说明:作品来源于网上,版权归作者所有,如果无意中侵犯了您的版权,请来信告知,本站将在3个工作日内删除。yesize@hotmail.com
  热门小游戏分类 
射击小游戏 连连看小游戏
台球小游戏 成人小游戏
CS小游戏 化妆小游戏
赛车小游戏 休闲小游戏
篮球小游戏 换装小游戏
儿童小游戏 牛牛小游戏
麻将小游戏 冒险小游戏
美媚小游戏 益智小游戏
体育小游戏  
Society Recreation & Sports
Travel & Leisure Communications
Vehicles Computers
Fashion Arts & Entertainment
Reference & Education Disease & Illness
Writing & Speaking Politics
Product Reviews Food & Beverage
Finance Internet Business
Self Improvement Home & Family
Health & Fitness Business
最新更新内容
警惕“公务员报考热”背
公务员考试不是丈母娘考
一名新公务员的自白:我
公务员考脑筋急转弯与挂
北努斗:2006行政能力测
大讨论:06行测BT题目大
过来人回忆:当年,我也
一家之言:公务员热折射
公务员考试申论要是有正
数十万大学生走进公务员
      粤ICP备05005424         Copyright ©2000 - 2004 Yesize.COM