zoukankan      html  css  js  c++  java
  • 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
    ");
    35     else
    36         printf("Failure: stat = %d
    ", 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 }
  • 相关阅读:
    javascript 日期月份加减
    ActiveRecord 的类型初始值设定项引发异常
    angularjs $q、$http 处理多个异步请求
    angular.foreach 格式
    PHP基础知识2
    第一个月的学习总结
    JavaScript的学习5
    JavaScript的学习4
    JavaScript的学习3
    JavaScript的学习2
  • 原文地址:https://www.cnblogs.com/biaoge140/p/9170926.html
Copyright © 2011-2022 走看看