大型圖幅顯示技術論文
大型圖幅顯示技術簡單點來說就是大型電子屏叫大型圖幅顯示技術。下面是小編精心推薦的一些,希望你能有所感觸!
篇一
在Windows中顯示多幅彩色影象的技術
摘 要 該文論述了在Windows同一視窗中顯示多幅彩色影象的技術和實現方法,並提供最優化程式壓縮原影象的顏色數量。
關鍵詞 調色盤 Windows 影象處理
在目前的大多數微機中都配置了高效能的TVGA或SVGA圖形卡,在這些圖形卡中,紅、綠、藍三元色各佔六位,顏色總數佔18位,故可以顯示262144種顏色,在更高階的圖形卡中,甚至可達24位的真彩色。使用調色盤技術,可以在一個視窗顯示256種顏色,每一副影象都具有獨立的256個調色盤,顯示時更換調色盤便可滿足各幅影象的顏色要求。
然而,在某些 應用中則要求同一視窗中顯示兩幅甚至更多的彩色影象,如果按照常規設計,視窗中只能正確地顯示其中一幅影象,而其它的影象則由於其調色盤被更換,顏色就會混亂。在我們開發多媒體查詢系統——山東省旅遊資源查詢子系統時,系統要求以一幅山東省彩色地圖為背景,然後在各個旅遊景點設定一個觸控按鈕,當用戶觸控該按鈕時,在視窗的右下部分顯示該景點的彩色影象。如果影象不經過特殊處理,則在顯示該景點的彩色影象的同時也更換了該視窗的調色盤,使背景影象的顏色失真。為了解決這個問題,我們對影象做了特殊處理,使背景影象和各個景點影象的調色盤不發生衝突。同時還要考慮到Windows佔用了前20個調色盤,在一般情況下不允許更改。根據系統的實際情況,我們對調色盤做了如下佈置:第0~19號調色盤為Windows系統保留;第20~148號調色盤為背景影象使用,一旦背景影象使用後,就不再更改;第149~255號調色盤為各景點影象使用,當顯示不同的景點影象時,隨時更改這些調色盤。定義一個PALETTEENTRY型別的陣列palette[256]用來儲存各顏色分量。該型別是Windows定義的一種結構:
typedef struct {
BYTE peRed;
/*調色盤項的紅色飽和度*/
BYTE peGreen;/*調色盤項的綠色飽和度*/
BYTE peBlue;
/*調色盤項的藍色飽和度*/
BYTE peFlags;/*NULL、PC-EXPLICIT、PC-NOCOLLAPSE一般取PC-EXPLICIT*/
} PALETTEENTRY;
這樣把背景影象的第20~148號調色盤和景點影象的第149~255號調色盤分別放入pal
ette[20]~palette[255]中,然後按下列步驟實現該調色盤。
1.定義HDC hdc; HPALETTE w-hp; LOGPALETTE *pal;
2.給pal賦值
pal=***NPLOGPALETTE***LocalAlloc***LMEM-FIXED,
sizeof***LOGPALETTE***+256*sizeof***PALETTEENTRY******;
pal->palVersion=0X300;/*
pal->palNumEntries=256;
memcpy***%pal->palPalEntry[0],&palette[0],
256*sizeof***PALETTEENTRY***;
3.實現該調色盤
hdc=GetDC***hWnd***;
w-hp=CreatePalette******LPLOGPALETTE***pal***;
w-hp=SelectPalette***hdc,w-hp,0***;
RealizePalette***hdc***;
LocalFree***HANDLE***pal***;
其中hWnd為要顯示影象的視窗控制代碼。按上述步驟實現該調色盤後,讀入要顯示的影象,然後對映到hdc中即可。
本文提供的程式cpcolor.c可以實現把一個BMP格式的影象從256色壓縮成***color2-color1+1***色,並把顏色號限制在color1到color2範圍內。程式執行格式為:
cpcolor影象檔名 顏色下限 顏色上限本程式使用最優化方法,使用效果良好。
/* 源程式cpcolor.c */
#include <stdio.h>
#include <math.h>
#include <alloc.h>
unsigned char palette[256][4];
long TAB[256];
unsigned char TT[256],BB[256];
int width,depth,bytes;
/* 該函式開啟影象檔案並讀影象的寬、高和各調色盤的顏色分量,並把檔案指標指向影象的開始處*/
FILE *get-bitmap-file***char*fname***
{
unsigned char ch;
int i,j,n;
FILE *fp;
fp=fopen***fname,"rb+"***;
if ***fp==NULL*** return NULL;
fseek***fp,18L,SEEK-SET***;
fread***&width,2,1,fp***;fseek***fp,2L,SEEK-CUR***;
fread***&depth,2,1,fp***;fseek***fp,2L,SEEK-CUR***;
n=width/4;
if ***width%4 !=0*** n++;
bytes=n*4;
fseek***fp,54L,SEEK-SET***;
fread***&palette[0][0],4,256,fp***;
return fp;
}
/*該函式實現顏色的壓縮*/
void zh_fan-tu***FILE *fp,int color1,int color2***
{
unsigned char *p,*q,cc,ch;
long len;
int max-no, i,j,m,n,r0,b0,g0,r1,b1,g1;
double dd,dmin;
char s[4];
max-no=color2-color1+1;
for ***i=0;i<256;i++*** TAB[i]=0;
p=***char ****malloc***bytes+1***;
for ***i=0;i<depth;i++*** {
fread***p,bytes,1,fp***;
q=p;
for ***j=0;j<bytes;j++,q++*** if***j>=width*** break;
else {
ch=***unsigned char****q;
TAB[ch]++;
}
}
for ***i=0;i<256;i++*** tt[i]=***unsigned char***i;
for ***i=0;i<255;i++*** for ***j=i+1;j<256;j++***
if ***TAB[i]<TAB[j]***{
len=TAB[i];TAB[i]=TAB[摘 要 該文論述了在Windows
同一視窗中顯示多幅彩色影象的技術和實現方法,並提供最優化程式壓縮原影象的顏色數量。
關鍵詞 調色盤 Windows 影象處理
在目前的大多數微機中都配置了高效能的TVGA或SVGA圖形卡,在這些圖形卡中,紅、綠、藍三元色各佔六位,顏色總數佔18位,故可以顯示262144種顏色,在更高階的圖形卡中,甚至可達24位的真彩色。使用調色盤技術,可以在一個視窗顯示256種顏色,每一副影象都具有獨立的256個調色盤,顯示時更換調色盤便可滿足各幅影象的顏色要求。
然而,在某些 應用中則要求同一視窗中顯示兩幅甚至更多的彩色影象,如果按照常規設計,視窗中只能正確地顯示其中一幅影象,而其它的影象則由於其調色盤被更換,顏色就會混亂。在我們開發多媒體查詢系統――山東省旅遊資源查詢子系統時,系統要求以一幅山東省彩色地圖為背景,然後在各個旅遊景點設定一個觸控按鈕,當用戶觸控該按鈕時,在視窗的右下部分顯示該景點的彩色影象。如果影象不經過特殊處理,則在顯示該景點的彩色影象的同時也更換了該視窗的調色盤,使背景影象的顏色失真。為了解決這個問題,我們對影象做了特殊處理,使背景影象和各個景點影象的調色盤不發生衝突。同時還要考慮到Windows佔用了前20個調色盤,在一般情況下不允許更改。根據系統的實際情況,我們對調色盤做了如下佈置:第0~19號調色盤為Windows系統保留;第20~148號調色盤為背景影象使用,一旦背景影象使用後,就不再更改;第149~255號調色盤為各景點影象使用,當顯示不同的景點影象時,隨時更改這些調色盤。定義一個PALETTEENTRY型別的陣列palette[256]用來儲存各顏色分量。該型別是Windows定義的一種結構:
typedef struct {
BYTE peRed;
/*調色盤項的紅色飽和度*/
BYTE peGreen;/*調色盤項的綠色飽和度*/
BYTE peBlue;
/*調色盤項的藍色飽和度*/
BYTE peFlags;/*NULL、PC-EXPLICIT、PC-NOCOLLAPSE一般取PC-EXPLICIT*/
} PALETTEENTRY;
這樣把背景影象的第20~148號調色盤和景點影象的第149~255號調色盤分別放入pal
ette[20]~palette[255]中,然後按下列步驟實現該調色盤。
1.定義HDC hdc; HPALETTE w-hp; LOGPALETTE *pal;
2.給pal賦值
pal=***NPLOGPALETTE***LocalAlloc***LMEM-FIXED,
sizeof***LOGPALETTE***+256*sizeof***PALETTEENTRY******;
pal->palVersion=0X300;/*
pal->palNumEntries=256;
memcpy***%pal->palPalEntry[0],&palette[0],
256*sizeof***PALETTEENTRY***;
3.實現該調色盤
hdc=GetDC***hWnd***;
w-hp=CreatePalette******LPLOGPALETTE***pal***;
w-hp=SelectPalette***hdc,w-hp,0***;
RealizePalette***hdc***;
LocalFree***HANDLE***pal***;
其中hWnd為要顯示影象的視窗控制代碼。按上述步驟實現該調色盤後,讀入要顯示的影象,然後對映到hdc中即可。
本文提供的程式cpcolor.c可以實現把一個BMP格式的影象從256色壓縮成***color2-color1+1***色,並把顏色號限制在color1到color2範圍內。程式執行格式為:
cpcolor影象檔名 顏色下限 顏色上限本程式使用最優化方法,使用效果良好。
/* 源程式cpcolor.c */
#include <stdio.h>
#include <math.h>
#include <alloc.h>
unsigned char palette[256][4];
long TAB[256];
unsigned char TT[256],BB[256];
int width,depth,bytes;
/* 該函式開啟影象檔案並讀影象的寬、高和各調色盤的顏色分量,並把檔案指標指向影象的開始處*/
FILE *get-bitmap-file***char*fname***
{
unsigned char ch;
int i,j,n;
FILE *fp;
fp=fopen***fname,"rb+"***;
if ***fp==NULL*** return NULL;
fseek***fp,18L,SEEK-SET***;
fread***&width,2,1,fp***;fseek***fp,2L,SEEK-CUR***;
fread***&depth,2,1,fp***;fseek***fp,2L,SEEK-CUR***;
n=width/4;
if ***width%4 !=0*** n++;
bytes=n*4;
fseek***fp,54L,SEEK-SET***;
fread***&palette[0][0],4,256,fp***;
return fp;
}
/*該函式實現顏色的壓縮*/
void zh_fan-tu***FILE *fp,int color1,int color2***
{
unsigned char *p,*q,cc,ch;
long len;
int max-no, i,j,m,n,r0,b0,g0,r1,b1,g1;
double dd,dmin;
char s[4];
max-no=color2-color1+1;
for ***i=0;i<256;i++*** TAB[i]=0;
p=***char ****malloc***bytes+1***;
for ***i=0;i<depth;i++*** {
fread***p,bytes,1,fp***;
q=p;
for ***j=0;j<bytes;j++,q++*** if***j>=width*** break;
else {
ch=***unsigned char****q;
TAB[ch]++;
}
}
for ***i=0;i<256;i++*** tt[i]=***unsigned char***i;
for ***i=0;i<255;i++*** for ***j=i+1;j<256;j++***
if ***TAB[i]<TAB[j]***{
len=TAB[i];TAB[i]=TAB[j];TAB[j]=len;
cc=TT[i];TT[i]=TT[j];TT[j]=cc;
memcpy***s,&palette[i][0],4***;
memcpy***&palette[i][0],&palette[j][0],4***;
memcpy***&palette[j][0],s,4***;
}
for ***i=color2;i>=color1;i--***
memcpy***&palette[i][0],&palette[i-color1][0],4***;
for ***i=0;i<max-no;i++*** BB[TT[i]]=***unsigned char***i;
for ***i=max-no;i<256;i++*** {
r0=palette[i][2];
g0=palette[i][1];
b0=palette[i][0];
dmin=256.0*256.0*256.0;
m=0;
for ***j=0;j<max-no;j++*** {
r1=palette[j][2];
g1=palette[j][1];
b1=palette[j][0];
dd=1.0****r0-r1*******r0-r1***+1.0****g0-g1*******g0-g1***+1.0****b0-b1*******b0-b1***;
dd=sqrt***dd***;
if ***dmin>dd*** {dmin=dd;m=j;}
}
BB[TT[i]]=***unsigned char***m;
}
for ***i=0;i<256;i++*** BB[i]+=color1;
}
void w-create-bitmap***FILE *fp***
{
int i,j,n,m,t;
long len;
unsigned char far *p,far *q,cc,ch;
unsigned nn;
fseek***fp,54L,SEEK-SET***;
len=ftell***fp***;
fwrite***&palette[0][0],4,256,fp***;
p=***unsigned char far ****farmalloc***bytes+1***;
len=ftell***fp***;
for ***i=0;i<depth;i++*** {
fseek***fp,len,SEEK-SET***;
fread***p,bytes,1,fp***;
fseek***fp,len,SEEK-SET***;
len+=bytes;
q=p;
for ***j=0;j<width;j++,q++*** {
cc=***unsigned char*******q***;
ch=BB[cc];
*q=ch;
}
fwrite***p,bytes,1,fp***;
}
farfree***p***;
}
main***int argc,char *args[]***
{
FILE *fp;
if ***argc<4*** {
printf***"引數:檔名 顏色下限 顏色上限\n"***;
return;
}
fp=get-bitmap-file***args[1]***;
if ***fp==NULL*** return;
zh-fan-tu***fp,atoi***args[2],atoi***args[3]******;
w-create-bitmap***fp***;
fclose***fp***;
}
參考文獻
王旭 張軍譯.Microsoft Windows 3.1程式設計師參考手冊.北京:清華大學出版社,1994.
點選下頁還有更多>>>