亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 圖像處理.txt

?? 用數字圖像處理主要是為了修改圖形,改善圖像質量,或是從圖像中提起有效信息,還有利用數字圖像處理可以對圖像進行體積.
?? TXT
?? 第 1 頁 / 共 4 頁
字號:

            pPal->palPalEntry[i].peBlue=Gray;

            pPal->palPalEntry[i].peFlags=0;

            *(lpTempPtr++)=(unsigned char)Gray;

            *(lpTempPtr++)=(unsigned char)Gray;

            *(lpTempPtr++)=(unsigned char)Gray;

            *(lpTempPtr++)=0;

        }

 

    if(hPalette!=NULL)                     

        DeleteObject(hPalette);

//生成新的邏輯調色板

    hPalette=CreatePalette(pPal);

    LocalUnlock(hPal);

    LocalFree(hPal);

    hDc=GetDC(hWnd);

    if(hPalette){

        hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

        RealizePalette(hDc);

    }

    if(NumColors==0) //真彩色圖才需要處理位圖數據

        for(y=0;y<bi.biHeight;y++){

            lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-

y*LineBytes);

            lpTempPtr=(char *)lpTempImgData+(DstBufSize-

DstLineBytes-y*DstLineBytes);

            for(x=0;x<bi.biWidth;x++){

                Blue=(unsigned char )(*lpPtr++);

                Green=(unsigned char )(*lpPtr++);

                Red=(unsigned char )(*lpPtr++);

            

    Y=(float)(Red*0.299+Green*0.587+Blue*0.114);

            //從位圖數據計算得到Y值,寫入新圖中

                Gray=(BYTE)Y; 

                *(lpTempPtr++)=(unsigned char)Gray;

            }

        }

    if(hBitmap!=NULL)

        DeleteObject(hBitmap);

    //產生新的位圖

hBitmap=CreateDIBitmap(hDc,

    (LPBITMAPINFOHEADER)lpTempImgData, (LONG)CBM_INIT,

    (LPSTR)lpTempImgData+sizeof(BITMAPINFOHEADER) +

NewNumColors*sizeof(RGBQUAD),(LPBITMAPINFO)lpTempImgData, 

DIB_RGB_COLORS);

    if(hPalette && hPrevPalette){

        SelectPalette(hDc,hPrevPalette,FALSE);

        RealizePalette(hDc);

    }

    hf=_lcreat("c:\\gray.bmp",0);

    _lwrite(hf,(LPSTR)&DstBf,sizeof(BITMAPFILEHEADER)); 

    _lwrite(hf,(LPSTR)lpTempImgData,DstBufSize);

    _lclose(hf);

    //釋放內存和資源

    ReleaseDC(hWnd,hDc);

    LocalUnlock(hTempImgData);

    LocalFree(hTempImgData);

    GlobalUnlock(hImgData);

    return TRUE;

}

 

3. 真彩圖轉256色圖(true color to 256 indexed color) 

    我們知道,真彩圖中包含最多達2的24次方種顏色,怎樣從中選出256種顏色,又要使顏色的失真比較小,這是一個比較復雜的問題。一種簡單的做法是將R:G:B以3:3:2表示,即取R,G的高3位,B的高兩位,組成一個字節,這樣就可以表示256種顏色了,但不難想象,這種方法的失真肯定很嚴重。我們下面介紹的算法能夠比較好的實現真彩到256色的轉換。

它的思想是:準備一個長度為4096的數組,代表4096種顏色。對圖中的每一個像素,取R,G,B的最高四位,拼成一個12位的整數,對應的數組元素加1。全部統計完后,就得到了這4096種顏色的使用頻率。這其中,可能有一些顏色一次也沒用到,即對應的數組元素為零(假設不為零的數組元素共有PalCounts個)。將這些為零的數組元素清除出去,使得前PalCounts個元素都不為零。將這PalCounts個數按從大到小的順序排列(這里我們使用起泡排序),這樣,前256種顏色就是用的最多的顏色,它們將作為調色板上的256種顏色。對于剩下的PalCounts-256種顏色并不是簡單的丟棄,而是用前256種顏色中的一種來代替,代替的原則是找有最小平方誤差的那個。再次對圖中的每一個像素,取R,G,B的最高四位,拼成一個12位的整數,如果對應值在前256種顏色中,則直接將該索引值填入位圖數據中,如果是在后PalCounts-256種顏色中,則用代替色的索引值填入位圖數據中。

下面的兩幅圖,圖3是原真彩圖,圖4是用上面的算法轉成的256色圖,可以看出,效果還不錯。

                               圖3. 原真彩圖                               圖4. 轉換后的256色圖

 

下面是上述算法的源程序。

BOOL Trueto256(HWND hWnd)

{

    DWORD                

SrcBufSize,OffBits,DstBufSize,DstLineBytes;

    LPBITMAPINFOHEADER  lpImgData;

    LPSTR                  lpPtr;

    HLOCAL                hTempImgData;

    LPBITMAPINFOHEADER  lpTempImgData;

    LPSTR                  lpTempPtr;

    HDC                    hDc;

    HFILE                  hf;

    LONG                  x,y;

    BITMAPFILEHEADER    DstBf;

    BITMAPINFOHEADER    DstBi;

    LOGPALETTE           *pPal;

    HPALETTE             hPrevPalette; 

    HLOCAL               hPal;

    WORD                 i,j;

    int                    Red,Green,Blue,ClrIndex;

    DWORD               ColorHits[4096];

    WORD                ColorIndex[4096];

    DWORD               PalCounts,temp;

    long                      ColorError1,ColorError2;

 

    if(NumColors!=0){ //NumColors不為零,所以不是真彩圖

        MessageBox(hWnd,"Must be a true color bitmap!","Error 

Message",MB_OK|

MB_ICONEXCLAMATION);

        return FALSE;

}

//由于顏色位數有可能發生了改變,所以要重新計算每行占用的字節數以及新圖

//的緩沖區大小

    DstLineBytes=(DWORD)WIDTHBYTES(bi.biWidth*8);

    DstBufSize=(DWORD)(sizeof(BITMAPINFOHEADER)+256

*sizeof(RGBQUAD)+

(DWORD)DstLineBytes*bi.biHeight

);

    //DstBf和DstBi為新的BITMAPFILEHEADER和

BITMAPINFOHEADER

    //拷貝原來的頭信息

    memcpy((char *)&DstBf,(char 

*)&bf,sizeof(BITMAPFILEHEADER));

    memcpy((char *)&DstBi,(char 

*)&bi,sizeof(BITMAPINFOHEADER));

//做必要的改變

    DstBf.bfSize=DstBufSize+sizeof(BITMAPFILEHEADER);

    DstBf.bfOffBits=(DWORD)(256*sizeof(RGBQUAD)+sizeof(

BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));

    DstBi.biClrUsed=0;

    DstBi.biBitCount=8;

    //OffBits為到實際位圖數據的偏移值

    OffBits=bf.bfOffBits-sizeof(BITMAPFILEHEADER);

    //SrcBufSize為原圖緩沖區的大小

    SrcBufSize=bf.bfSize-sizeof(BITMAPFILEHEADER);

    if((hTempImgData=LocalAlloc(LHND,DstBufSize))==NULL)

    {

            MessageBox(hWnd,"Error alloc memory!","Error 

Message",MB_OK|MB_ICONEXCLAMATION);

        return FALSE;

    }

    lpImgData=(LPBITMAPINFOHEADER)GlobalLock(hImgData);    

    lpTempImgData=(LPBITMAPINFOHEADER)LocalLock(hTempImgData);

    //拷貝位圖數據

    memcpy(lpTempImgData,lpImgData,OffBits);

//用新的頭信息取代舊的頭信息

    memcpy(lpTempImgData,(char*)&DstBi,sizeof(BITMAPINFOHEADER));

//ColorHits為記錄顏色使用頻率的數組,ColorIndex為記錄顏色索引值的數組

//先全部清零

    memset(ColorHits,0,4096*sizeof(DWORD));

    memset(ColorIndex,0,4096*sizeof(WORD));

    for(y=0;y<bi.biHeight;y++){

        lpPtr=(unsigned char *)lpImgData+(SrcBufSize-LineBytes-y*LineBytes);

        for(x=0;x<bi.biWidth;x++){

            //R,G,B各取4位

            Blue=(int)(*(lpPtr++) & 0xf0);

            Green=(int)(*(lpPtr++) & 0xf0);

            Red=(int)(*(lpPtr++) & 0xf0);

            //拼成一個12位整數

            ClrIndex=(Blue<<4) + Green +(Red >>4);

            //相應的數組元素加1

            ColorHits[ClrIndex]++;

        }

    }

    PalCounts=0;

//將為零的元素清除出去

    for (ClrIndex = 0; ClrIndex < 4096; ClrIndex++)

    {

        if(ColorHits[ClrIndex]!=0){

            ColorHits[PalCounts]=ColorHits[ClrIndex];

            //注意調整相應的索引值

            ColorIndex[PalCounts]=ClrIndex;

            PalCounts++; //顏色數加1

        }

    }

//用起泡排序將PalCounts種顏色按從大到小的順序排列

    for (i = 0; i < PalCounts-1; i++)

        for (j = i + 1; j < PalCounts; j++){

            if (ColorHits[j] > ColorHits[i]){

                temp = ColorHits[i];

                ColorHits[i] = ColorHits[j];

                ColorHits[j] = temp;  

            //注意調整相應的索引值

            temp = ColorIndex[i];

                ColorIndex[i] = ColorIndex[j];

                ColorIndex[j] = (WORD)temp;

            }

        }

    //為新的調色板分配內存

    hPal=LocalAlloc(LHND,sizeof(LOGPALETTE) + 256* sizeof(PALETTEENTRY));

    pPal =(LOGPALETTE *)LocalLock(hPal);

    pPal->palNumEntries =(WORD) 256;

    pPal->palVersion    = 0x300;

    lpTempPtr=(char *)lpTempImgData+sizeof(BITMAPINFOHEADER);

    for (i = 0; i < 256; i++) {

//由12位索引值得到R,G,B的最高4位值

        pPal->palPalEntry[i].peRed=(BYTE)((ColorIndex[i] & 0x00f) << 4);

        pPal->palPalEntry[i].peGreen=(BYTE)((ColorIndex[i] & 0x0f0));

        pPal->palPalEntry[i].peBlue=(BYTE)((ColorIndex[i] & 0xf00) >> 4);

        pPal->palPalEntry[i].peFlags=(BYTE)0;

        *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0xf00) >> 4);

        *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x0f0));

        *(lpTempPtr++)=(unsigned char)((ColorIndex[i] & 0x00f) << 4);

        *(lpTempPtr++)=0;

//ColorHits作為顏色記數的作用已經完成了,下面的作用是記錄12位索引值對應

//的調色板中的索引值

        ColorHits[i]=i;

    }

    //其余的顏色依據最小平方誤差近似為前256中最接近的一種

    if (PalCounts > 256){

        for (i = 256; i < PalCounts; i++){

            //ColorError1記錄最小平方誤差,一開始賦一個很大的值

            ColorError1=1000000000;

//由12位索引值得到R,G,B的最高4位值

            Blue = (long)((ColorIndex[i] & 0xf00) >> 4);

            Green = (long)((ColorIndex[i] & 0x0f0));

            Red = (long)((ColorIndex[i] & 0x00f) << 4);

            ClrIndex = 0;

            for (j = 0; j < 256; j++){

                //ColorError2計算當前的平方誤差

                ColorError2=(long)(Blue-pPal->palPalEntry[j].peBlue)*

(Blue-pPal->palPalEntry[j].peBlue)+(long)(Green-pPal->palPalEntry[j].peGreen)*

(Green-pPal->palPalEntry[j].peGreen)+(long)(Red-pPal->palPalEntry[j].peRed)*

(Red-pPal->palPalEntry[j].peRed); 

                if (ColorError2 < ColorError1){ //找到更小的了

                    ColorError1 = ColorError2;

                    ClrIndex = j; //記錄對應的調色板的索引值

                }

            }

//ColorHits記錄12位索引值對應的調色板中的索引值

            ColorHits[i] = ClrIndex;

        }

    }                

    if(hPalette!=NULL)                     

        DeleteObject(hPalette);

//產生新的邏輯調色板

    hPalette=CreatePalette(pPal);

    LocalUnlock(hPal);

    LocalFree(hPal);

    hDc=GetDC(hWnd);

    if(hPalette){

        hPrevPalette=SelectPalette(hDc,hPalette,FALSE);

        RealizePalette(hDc);

    }

    for(y=0;y<bi.biHeight;y++){

        lpPtr=(char *)lpImgData+(SrcBufSize-LineBytes-

y*LineBytes);

        lpTempPtr=(char *)lpTempImgData+(DstBufSize-

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品免费在线| 国产欧美精品国产国产专区| 精品久久一区二区三区| 1024国产精品| 狠狠色狠狠色综合系列| 99国产精品久| 久久综合久久鬼色中文字| 一区二区三区免费在线观看| 国产一区在线精品| 欧美日韩国产免费| 亚洲视频一二三| 国产在线不卡一卡二卡三卡四卡| 欧美色区777第一页| 国产精品你懂的| 国模少妇一区二区三区| 91精品欧美久久久久久动漫 | 国产suv一区二区三区88区| 91久久线看在观草草青青| 国产三级三级三级精品8ⅰ区| 日欧美一区二区| 91在线porny国产在线看| 国产色综合一区| 精品一区中文字幕| 日韩天堂在线观看| 日韩精品视频网| 欧美三级在线视频| 一区二区三区高清| 在线视频国产一区| 亚洲男同性恋视频| 色综合夜色一区| 亚洲三级免费观看| 成a人片国产精品| 亚洲国产成人在线| 风间由美一区二区三区在线观看| 久久亚区不卡日本| 国产精品综合网| 久久九九久精品国产免费直播| 国产麻豆午夜三级精品| 国产午夜精品美女毛片视频| 国产一区二区三区四区五区美女 | 欧美日韩精品免费观看视频| 亚洲黄色性网站| 在线看一区二区| 免费的成人av| 亚洲激情综合网| 成人午夜精品一区二区三区| 欧美国产视频在线| 成人福利视频在线看| 国产精品乱码人人做人人爱| 99re成人在线| 亚洲一区在线观看免费| 欧美乱妇20p| 日本不卡视频一二三区| 26uuu精品一区二区在线观看| 国产麻豆精品久久一二三| 国产精品水嫩水嫩| 一本大道久久a久久综合| 亚洲成人一区在线| 日韩精品中文字幕一区| 国产美女av一区二区三区| 亚洲欧美在线另类| 精品视频一区二区三区免费| 美女脱光内衣内裤视频久久网站| 久久久99精品久久| 欧美影院一区二区三区| 美女在线视频一区| 中文字幕精品综合| 精品视频一区三区九区| 国产一区二区三区四区在线观看| 日韩毛片视频在线看| 欧美一区二区三区在线视频| 国产成人午夜精品影院观看视频 | 欧美三级在线视频| 国产一区二区三区在线观看免费 | 国产欧美日产一区| 99国产精品久久久久久久久久久| 日韩va欧美va亚洲va久久| 久久精品在线免费观看| 欧美丰满一区二区免费视频| 粉嫩av一区二区三区在线播放| 亚洲国产日韩av| 国产日韩精品久久久| 欧美三级乱人伦电影| 国产精品久久久久久久久晋中| 亚洲精品自拍动漫在线| 制服丝袜亚洲精品中文字幕| 国产成人三级在线观看| 亚州成人在线电影| 亚洲欧美日韩综合aⅴ视频| 欧美本精品男人aⅴ天堂| 色系网站成人免费| 懂色av一区二区三区免费观看 | 久久精品一区蜜桃臀影院| 欧美精品国产精品| 色婷婷综合久久久中文一区二区| 九九精品一区二区| 丝袜诱惑亚洲看片| 亚洲自拍偷拍麻豆| 国产精品久久久久久久久动漫| 日韩视频一区二区| 欧美日韩国产小视频| 91久久一区二区| 91首页免费视频| 成人不卡免费av| 国产剧情一区二区三区| 狠狠色丁香九九婷婷综合五月| 三级欧美韩日大片在线看| 亚洲欧美另类图片小说| 国产精品网站在线观看| 久久精品综合网| 国产人伦精品一区二区| 久久色中文字幕| 久久蜜桃av一区精品变态类天堂| 日韩一区二区三区高清免费看看| 在线观看亚洲精品视频| 欧美在线观看18| 色综合久久中文字幕综合网 | 自拍偷拍国产精品| 国产精品久久久久aaaa| 中文字幕乱码一区二区免费| 国产精品视频yy9299一区| 日本一区免费视频| 国产精品私房写真福利视频| 日韩理论在线观看| 亚洲日本免费电影| 夜夜嗨av一区二区三区四季av| 亚洲欧美一区二区久久| 亚洲五码中文字幕| 亚洲国产精品尤物yw在线观看| 亚洲成人av电影在线| 亚洲国产精品久久人人爱 | 欧美人动与zoxxxx乱| 制服丝袜一区二区三区| 欧美videossexotv100| 精品国产91亚洲一区二区三区婷婷| 日韩欧美一二三| 久久久久一区二区三区四区| 国产精品欧美一区喷水| 亚洲免费av高清| 视频一区欧美日韩| 国模少妇一区二区三区| 成人av网站免费| 欧美色中文字幕| 欧美一区二区观看视频| 国产日韩三级在线| 亚洲国产日韩一级| 韩国毛片一区二区三区| a4yy欧美一区二区三区| 欧美乱熟臀69xxxxxx| 国产欧美久久久精品影院| 亚洲女女做受ⅹxx高潮| 日本女人一区二区三区| 大白屁股一区二区视频| 色综合网色综合| 欧美成人乱码一区二区三区| 中文成人综合网| 日韩av不卡在线观看| 成人精品在线视频观看| 欧美日本国产视频| 国产精品乱码一区二三区小蝌蚪| 亚洲第一福利视频在线| 国产成人免费视| 欧美浪妇xxxx高跟鞋交| 国产喷白浆一区二区三区| 亚洲成人动漫在线观看| 成人自拍视频在线观看| 91精品欧美福利在线观看| 亚洲日本成人在线观看| 激情综合网av| 欧美日韩激情一区二区| 国产精品―色哟哟| 久久精品国产一区二区三区免费看| 成人h动漫精品| 精品国产乱码久久久久久老虎 | 国产精品白丝在线| 精品午夜久久福利影院| 欧美三级日本三级少妇99| 最新欧美精品一区二区三区| 国产在线精品一区二区夜色| 欧美日韩精品综合在线| 日韩理论片网站| 成人伦理片在线| 久久久不卡网国产精品二区| 青青草国产精品亚洲专区无| 在线精品国精品国产尤物884a| 国产精品日韩成人| 国产91富婆露脸刺激对白| 精品88久久久久88久久久| 婷婷亚洲久悠悠色悠在线播放| 91污片在线观看| 亚洲欧洲精品天堂一级| 成人网在线播放| 国产婷婷色一区二区三区在线| 国产一区欧美二区| 精品欧美一区二区久久| 美女看a上一区| 日韩一区二区三区在线| 麻豆一区二区三区| 日韩一区二区在线看片| 欧美96一区二区免费视频|