主要是我在設置壁紙時遇到的個小問題,因為設置壁紙只能是bmp格式的圖片,不可能我喜歡的壁紙就都是bmp格式的,就想怎么轉換一下圖片的格式,於是就在百度搜怎么弄,搜到了可行方法,卻沒有實現代碼,有些看起來很費勁(很煩做例子還要用MFC的,代碼看起來很費勁,直接C/C++多清爽簡潔啊),后來還是找到MSDN給出了官方的使用代碼加上自己的一些小改動實現了轉bmp格式的代碼,這里記錄一下,省的以后要用的時候再去搜。
實現代碼:
1 #include <iostream> 2 #include <Windows.h> 3 #include <gdiplus.h> 4 5 #pragma comment(lib,"Gdiplus.lib") 6 7 using namespace Gdiplus; 8 9 /* 10 通過字符串獲得對應的CLSID 11 format:圖像格式,如:image/bmp 12 pClsid:存放對應的CLSID 13 成功返回對應的編碼器位置,失敗返回-1. 14 */ 15 int GetEncoderClsid(const WCHAR* format, CLSID* pClsid); 16 17 int main(void) 18 { 19 GdiplusStartupInput gdiplusStartupInput; 20 ULONG_PTR gdiplusToken; 21 // GDI+的任何操作之前應該先初始化 22 GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); 23 24 CLSID encoderClsid; 25 Status stat; 26 // 載入圖片 27 Image* image = new Image(L"C:\\Users\\Administrator\\Desktop\\2.jpg"); 28 // 獲取要轉換格式的CLSID 29 GetEncoderClsid(L"image/bmp", &encoderClsid); 30 // 根據CLSID保存為對應格式的圖片 31 stat = image->Save(L"C:\\Users\\Administrator\\Desktop\\Bird.bmp", &encoderClsid, NULL); 32 33 if (stat == Ok) 34 printf("Bird.png was saved successfully\n"); 35 else 36 printf("Failure: stat = %d\n", stat); 37 38 delete image; 39 // 關閉GDI+ 40 GdiplusShutdown(gdiplusToken); 41 // 轉換后就可以設置壁紙啦 42 SystemParametersInfo(20, 0, "C:\\Users\\Administrator\\Desktop\\Bird.bmp", 1); 43 // 設置完成后可以刪除它,加個延時,不然可能還沒設置上就被刪除了 44 Sleep(100); 45 DeleteFile("C:\\Users\\Administrator\\Desktop\\Bird.bmp"); 46 return 0; 47 48 } 49 50 int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) 51 { 52 UINT num = 0; // 圖像編碼器數量 53 UINT size = 0; // 圖像編碼器數組大小 54 55 ImageCodecInfo* pImageCodecInfo = NULL; 56 57 GetImageEncodersSize(&num, &size); // 獲取編碼器數量 58 if (size == 0) 59 return -1; 60 61 pImageCodecInfo = (ImageCodecInfo*)(malloc(size)); 62 if (pImageCodecInfo == NULL) 63 return -1; 64 65 GetImageEncoders(num, size, pImageCodecInfo); // 獲取本機支持的編碼器 66 67 for (UINT j = 0; j < num; ++j) 68 { 69 if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0) // 找到該格式就將對應的CLSID給*pClsid 70 { 71 *pClsid = pImageCodecInfo[j].Clsid; 72 free(pImageCodecInfo); 73 return j; 74 } 75 } 76 77 free(pImageCodecInfo); 78 return -1; 79 }