大型圖幅顯示技術論文

  大型圖幅顯示技術簡單點來說就是大型電子屏叫大型圖幅顯示技術。下面是小編精心推薦的一些,希望你能有所感觸!

  篇一

  在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.

點選下頁還有更多>>>