主要是我在設定桌布時遇到的個小問題,因為設定桌布只能是bmp格式的圖片,不可能我喜歡的桌布就都是bmp格式的,就想怎麼轉換一下圖片的格式,於是就在百度搜怎麼弄,搜到了可行方法,卻沒有實現程式碼,有些看起來很費勁(很煩做例子還要用MFC的,程式碼看起來很費勁,直接C/C++多清爽簡潔啊),後來還是找到MSDN給出了官方的使用程式碼加上自己的一些小改動實現了轉bmp格式的程式碼,這裡記錄一下,省的以後要用的時候再去搜。.

實現程式碼:

#include <iostream>
#include <Windows.h>
#include <gdiplus.h>


#pragma comment(lib,"Gdiplus.lib")


using namespace Gdiplus;


/* 
    通過字串獲得對應的CLSID
    format:影象格式,如:image/bmp
    pClsid:存放對應的CLSID
    成功返回對應的編碼器位置,失敗返回-1.
*/
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);


int main(void)
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    // GDI+的任何操作之前應該先初始化
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);


    CLSID   encoderClsid;
    Status  stat;
    // 載入圖片
    Image*   image = new Image(L"C:\\Users\\Administrator\\Desktop\\2.jpg");
    // 獲取要轉換格式的CLSID
    GetEncoderClsid(L"image/bmp", &encoderClsid);
    // 根據CLSID儲存為對應格式的圖片
    stat = image->Save(L"C:\\Users\\Administrator\\Desktop\\Bird.bmp", &encoderClsid, NULL);


    if (stat == Ok)
        printf("Bird.png was saved successfully\n");
    else
        printf("Failure: stat = %d\n", stat);


    delete image;
    // 關閉GDI+
    GdiplusShutdown(gdiplusToken);
    // 轉換後就可以設定桌布啦
    SystemParametersInfo(20, 0, "C:\\Users\\Administrator\\Desktop\\Bird.bmp", 1);
    // 設定完成後可以刪除它,加個延時,不然可能還沒設定上就被刪除了
    Sleep(100);
    DeleteFile("C:\\Users\\Administrator\\Desktop\\Bird.bmp");
    return 0;


}


int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // 影象編碼器數量
    UINT  size = 0;         // 影象編碼器陣列大小


    ImageCodecInfo* pImageCodecInfo = NULL;


    GetImageEncodersSize(&num, &size);    // 獲取編碼器數量
    if (size == 0)
        return -1;  


    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if (pImageCodecInfo == NULL)
        return -1;


    GetImageEncoders(num, size, pImageCodecInfo);    // 獲取本機支援的編碼器


    for (UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)    // 找到該格式就將對應的CLSID給*pClsid
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;
        }
    }


    free(pImageCodecInfo);
    return -1;
}