1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

    <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
    <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
  2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
    現在位置:范文先生網>理工論文>計算機論文>在Windows中顯示多幅彩色圖像的技術

    在Windows中顯示多幅彩色圖像的技術

    時間:2023-02-20 22:49:55 計算機論文 我要投稿
    • 相關推薦

    在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]=T

    T[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.


    【在Windows中顯示多幅彩色圖像的技術】相關文章:

    靜態圖像的直接顯示08-06

    1394技術及其在圖像傳輸系統中的應用08-06

    Windows下多串口的配置與使用08-06

    利用DVI實現雙屏幕超寬圖像顯示08-06

    Windows的新安裝技術08-06

    基于混沌圖像的防偽技術08-06

    基于圖像的OMR技術的實現08-06

    履歷中如何顯示實力?08-15

    DMA在實時圖像處理中的應用08-06

    国产福利萌白酱精品tv一区_日韩亚洲中字无码一区二区三区_亚洲欧洲高清无码在线_全黄无码免费一级毛片
    1. <code id="ya7qu"><span id="ya7qu"><label id="ya7qu"></label></span></code>

      <b id="ya7qu"><bdo id="ya7qu"></bdo></b>
      <wbr id="ya7qu"><optgroup id="ya7qu"><strike id="ya7qu"></strike></optgroup></wbr>
    2. <u id="ya7qu"><bdo id="ya7qu"></bdo></u>
      日本亚洲欧洲色α在线播放 | 在线中文字幕第一页 | 亚洲一区二区师生制服 | 一区二区不卡AV | 日韩免费福利视频播放 | 日本欧美国产精品一区二区 |