VS2010 用CxImage读入各种图片格式后在内存中转换为HBITMAP位图

//将CxImage转为位图
HBITMAP Draw::ChangeCxImageToBMP(HDC hDC,CxImage* cximage)
{
    //创建HBITMAP
    HBITMAP BMP=CreateCompatibleBitmap(hDC,cximage->GetWidth(),cximage->GetHeight());
    BITMAP bm;    
    GetObject(BMP,sizeof(BITMAP),&bm);
    int pb=bm.bmBitsPixel/8;    //获取位图位数
    int BytesPerLineOut = (bm.bmWidth*pb + 3) / 4 * 4;    //计算每行像素的数据长度
    BYTE *pxd = new unsigned char[bm.bmHeight*BytesPerLineOut]; //声明暂存数组

    if(cximage->GetBpp()>=16)
    {
        //直接获取像素数据
        int pbx=cximage->GetBpp()/8;    //获取CxImage图片的位数
        int BytesPerLine = (bm.bmWidth*pbx + 3) / 4 * 4;    //计算CxImage每行像素的数据长度
        BYTE *pDib = cximage->GetBits();    //获取CxImage图片的像素数据

        for (int i = 0; i < bm.bmHeight; i++) 
        { 
            for (int j = 0; j < bm.bmWidth; j++) 
            { 
                int srcRGB_B=(bm.bmHeight-1-i)*BytesPerLine+j*pbx;
                int desRGB_B=i*bm.bmWidthBytes+j*pb;

                pxd[desRGB_B] = pDib[srcRGB_B];
                pxd[desRGB_B+1] = pDib[srcRGB_B+1];
                pxd[desRGB_B+2] = pDib[srcRGB_B+2];
            } 
        }
    }
    else
    {
        //通过调色板获取像素数据
        for (int i = 0; i < bm.bmHeight; i++) 
        { 
            for (int j = 0; j < bm.bmWidth; j++) 
            { 
                RGBQUAD srcRGB_B=cximage->GetPixelColor(j,bm.bmHeight-1-i);
                int desRGB_B=i*bm.bmWidthBytes+j*pb;

                pxd[desRGB_B] = srcRGB_B.rgbBlue;
                pxd[desRGB_B+1] = srcRGB_B.rgbGreen;
                pxd[desRGB_B+2] = srcRGB_B.rgbRed;
            } 
        }
    }

    SetBitmapBits(BMP,bm.bmHeight*bm.bmWidthBytes,pxd);
    delete[] pxd;

    return BMP;
}

示例代码下载:

 

http://download.csdn.net/detail/daeba/8388505

 

示例代码只测试了JPG、PNG、8位位图、GIF动态图片四种,其余CxImage支持的图片格式尚未测试

代码中包含CxImage(6.00full)的Debug与Release版静态库,默认工程中使用的是Debug版,想运行Release版的话,请替换掉项目中的cximage.lib文件

关键代码在Draw.cpp文件中

初始化代码在GameStart.cpp文件的GameStart()方法中

测试绘图代码在GameStart.cpp文件的GamePaint()方法中

其余的代码可以无视之

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值