程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 如何把DIB轉換成DDB

如何把DIB轉換成DDB

編輯:關於C語言

 

 

    首先,你可以不必把DIB轉換成DDB就可以讓它顯示在設備上。但是那樣的話,你都會看見會程序運行得有多慢了,而且你也不能使用一些有關DDB操作的函數功能了,諸如BitBlt()....

 

    以下是從DIB創建一個DDB的基本步驟:

 

    1.從DIB顏色表信息中的信息可以創建一個邏輯調色板,如果設備支持的話,你只需要做這一步。為了創建一個調色板,就需要分配給邏輯調色板結構。初始化palversion和palnumentries,從DIB中的顏色表把顏色數拷貝過來。然後我們就可以使用createpalette()函數來使用我們初始化的邏輯調色板了。

 

    2.把邏輯調色板選到設備中,然後實現它。

 

    3.創建DDB,可以使用createdibbitmap()函數。

 

    4.最後不要忘記釋放掉分給邏輯調色板結構的內存。

 

    雖然這樣就可以創建一個邏輯調色板了,但它沒有返回信息給所調用的程序代碼。如果DIB描述的是一個256色的位圖的話,而且設備也只支持256色,那麼DDB可能就不能正確的顯示在設備上。那是因為系統使用的顏色數與位圖的顏色數不相同,因此,你要修改一下,在我們畫位圖之前,就讓它返回邏輯調色板,然後我們選擇和實現它到設備的上下文。

 

//以下是程序代碼

 

hbitmap dibtoddb( handle hdib )

{

    lpbitmapinfoheader    lpbi;

    hbitmap         hbm;

    cpalette        pal;

    cpalette*        poldpal;

    cclientdc        dc(null);

 

    if (hdib == null)

        return null;

 

    lpbi = (lpbitmapinfoheader)hdib;

 

    int ncolors = lpbi->biclrused ? lpbi->biclrused :

                        1 << lpbi->bibitcount;

 

    bitmapinfo &bminfo = *(lpbitmapinfo)hdib ;

    lpvoid lpdibbits;

    if( bminfo.bmiheader.bibitcount > 8 )

        lpdibbits = (lpvoid)((lpdword)(bminfo.bmicolors +

            bminfo.bmiheader.biclrused) +

            ((bminfo.bmiheader.bicompression == bi_bitfields) ? 3 : 0));

    else

        lpdibbits = (lpvoid)(bminfo.bmicolors + ncolors);

 

    // create and select a logical palette if needed

    if( ncolors <= 256 && dc.getdevicecaps(rastercaps) & rc_palette) { uint nsize="sizeof(logpalette)" + (sizeof(paletteentry) * ncolors); logpalette *plp="(logpalette" *) new byte[nsize]; plp->palversion = 0x300;

        plp->palnumentries = ncolors;

 

        for( int i=0; i palpalentry[i].pered = bminfo.bmicolors[i].rgbred;

            plp->palpalentry[i].pegreen = bminfo.bmicolors[i].rgbgreen;

            plp->palpalentry[i].peblue = bminfo.bmicolors[i].rgbblue;

            plp

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved