GDI+如何将多张PNG图片合成一张并且保存网上找了很多。都是在onpaint里面去做,好奇怪啊。还一定需要上下文设备搞不懂GDI+的代码怎么都写的那么依赖上下文设备也不太复杂个功能。思路都明白。就是不会写。哎,厚着脸要现成的代码了。惭愧!!!

解决方案 »

  1.   

    首先 GDI+ 是 GDI 的升级版
    它也是需要场景设备才能进行绘图,只不过它对 HDC 进行了内部封装,就像你使用 CDC 一样,调用函数不用再带一个 HDC 的参数。要不然你会说,一个简单的 CDC 类为什么那么依赖上下文设备了第二,你所需要的代码是图片合并再保存
    人家的代码是需要加载图片(可能合并)然后直接绘图呈现给用户看的,跟你的需求不一样,所以你不能怪别人在哪里进行处理
    要怪只能怪你自己看不懂函数体里面的代码而如果你看懂了里面的代码,那么你管它是在哪处理的,你只要把方法搬过来,然后你自己写个函数不就行了
    而如果你看不懂,那么就算人家给你代码了,你也会说人家的方法不对啊,为什么那么依赖上下文设备目前我还没发现哪个类或者哪个函数能不用场景设备来进行图片的处理
      

  2.   

    拼接.可以考虑多个png绘制到临时dc上,然后保存.就是多个绘制的合成图.
      

  3.   

    可以不依赖任何上下文设备
    //创建一个位图,用来保存合成后的图像
    Gdiplus::Bitmap* pBitmap=new Bitmap(合成后宽度,合成后高度,PixelFormat32bppARGB);
    Gdiplus::Graphics g(pBitmap);Gdiplus::Bitmap tmp1(L"c:\\001.png");//载入你要合并的PNG
    g.DrawImage(&tmp1,.....);Gdiplus::Bitmap tmp2(L"c:\\002.png");//载入你要合并的PNG
    g.DrawImage(&tmp2,.....);pBitmap->Save(....);//保存合并后的图像,完工!
      

  4.   

    保存的图像打开了之后显示没有预览。引用的CLSID值是CCCCCCC-CCC这样的。请问是为什么啊
      

  5.   


    CLSID encoderClsid;     
    EncoderParameters encoderParameters; 
    int quality = 100;   // jpeg图象质量 
    encoderParameters.Count     =     1;     
    encoderParameters.Parameter[0].Guid     =     EncoderQuality;     
    encoderParameters.Parameter[0].Type     =     EncoderParameterValueTypeLong;     
    encoderParameters.Parameter[0].NumberOfValues     =     1;     
    encoderParameters.Parameter[0].Value     =     &quality;     
    if(strExt==_T("jpg")){
        GetEncoderClsid(L"image/jpeg", &encoderClsid); 
    }else if(strExt==_T("gif")){
        GetEncoderClsid(L"image/gif", &encoderClsid); 
    }else if(strExt==_T("png")){
        GetEncoderClsid(L"image/png", &encoderClsid); 
    }else if(strExt==_T("bmp")){
        GetEncoderClsid(L"image/bmp", &encoderClsid); 
    }pBitmap->Save(strFileName, &encoderClsid, &encoderParameters); int GetEncoderClsid(LPCWSTR format, CLSID*     pClsid)     
    {   
    UINT num = 0;   // number of image encoders   
    UINT size = 0;  // size of the image encoder array in bytes   
    ImageCodecInfo* pImageCodecInfo = NULL;   
    GetImageEncodersSize(&num, &size);   
    if(size == 0)   
    return -1;     //   Failure    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));   
    if(pImageCodecInfo == NULL)   
    return -1;     //   Failure    GetImageEncoders(num, size, pImageCodecInfo);   
    for(UINT j = 0; j < num; ++j)   
    {   
    if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )   
    {   
    *pClsid = pImageCodecInfo[j].Clsid;   
    free(pImageCodecInfo);   
    return j;     //   Success   
    }           
    }   
    free(pImageCodecInfo);   
    return -1;     //   Failure   
    }