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 }