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 }

猜你喜欢

转载自www.cnblogs.com/biaoge140/p/9170926.html