如何把DIB转换成DDB

发表于:2007-06-17来源:作者:点击数: 标签:
图象方面的一些缩写: RGB(redgreenblue):红绿蓝三基色 CMYK(Cyan-Magenta-Yellow-blackinK):青色-品红-黄色-黑色 HSI(Hue-Saturation-Intensity):色调-饱和度-强度 DDB(device-dependentbitmap):设备相关位图 DIB(device-independentbitmap):设备无关位图 C

          图象方面的一些缩写:
    RGB (red green blue): 红绿蓝三基色 
    CMYK (Cyan-Magenta-Yellow-black inK): 青色-品红-黄色-黑色 

    HSI (Hue-Saturation-Intensity): 色调-饱和度-强度 
    DDB (device-dependent bitmap): 设备相关位图 
    DIB (device-independent bitmap): 设备无关位图 
    CVBS (Composite Video Broadcast Signal): 复合电视广播信号 
    

 
    首先,你可以不必把设备无关位图DIB转换成设备相关位图DDB(Device-dependent bitmap:依赖于具体设备)就可以让它显示在设备上。但是那样的话,你都会看见会程序运行得有多慢了,而且你也不能使用一些有关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;
    clearcase/" target="_blank" >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->palpalentry[i].peflags = 0;
        }

        pal.createpalette( plp );

        delete[] plp;

        // select and realize the palette
        poldpal = dc.selectpalette( &pal, false );
        dc.realizepalette();
    }

    
    hbm = createdibitmap(dc.getsafehdc(), //设备上下文的句柄
            (lpbitmapinfoheader)lpbi,     //位图信息头指针 
            (long)cbm_init,               //初始化标志

            lpdibbits,                    //初始化数据指针
            (lpbitmapinfo)lpbi,           //位图信息指针
            dib_rgb_colors );             //颜色数据的使用方式 

    if (pal.getsafehandle())
        dc.selectpalette(poldpal,false);

    return hbm;
}

原文转自:http://www.ltesting.net