//将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()方法中
其余的代码可以无视之