C++使用GDI+實現圖片格式轉換


主要是我在設置壁紙時遇到的個小問題,因為設置壁紙只能是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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM