GDI+实现图片格式转换(bmp、jpeg、gif、tiff、png)

 

转自:http://blog.csdn.net/yuzl32/article/details/5389919

引言:通过GDI+我们可以很方便的对bmp、jpeg、gif、tiff、png格式的图片进行转换。

步骤:

1)    通过GdiplusStartup初始化GDI+,以便后续的GDI+函数可以成功调用。

2)    通过GetImageEncodersSize获取GDI+支持的图像格式编码器种类数numEncoders以及ImageCodecInfo数组的存放大小size

3)    通过malloc为ImageCodecInfo数组分配足额空间。

4)    通过GetImageDecoders获取所有的图像编码器信息。

5)    查看ImageCodecInfo.MimeType,查找符合的图像编码器的Clsid。

6)    释放步骤3)分配的内存。

7)    创建Image对象并加载图片。

8)    调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它。

9)    释放Image对象。

10)  通过GdiplusShutdown清理所有GDI+资源。

示例:

#include <windows.h>   
#include <gdiplus.h>   
#include <stdio.h>   
using namespace Gdiplus;  
  
#pragma comment(lib,"gdiplus")   
  
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)  
{  
   UINT  num = 0;          // number of image encoders   
   UINT  size = 0;         // size of the image encoder array in bytes   
  
   ImageCodecInfo* pImageCodecInfo = NULL;  
     
   //2.获取GDI+支持的图像格式编码器种类数以及ImageCodecInfo数组的存放大小   
   GetImageEncodersSize(&num, &size);  
   if(size == 0)  
      return -1;  // Failure   
  
   //3.为ImageCodecInfo数组分配足额空间   
   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));  
   if(pImageCodecInfo == NULL)  
      return -1;  // Failure   
  
   //4.获取所有的图像编码器信息   
   GetImageEncoders(num, size, pImageCodecInfo);  
  
   //5.查找符合的图像编码器的Clsid   
   for(UINT j = 0; j < num; ++j)  
   {  
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )  
      {  
         *pClsid = pImageCodecInfo[j].Clsid;  
         free(pImageCodecInfo);  
         return j;  // Success   
      }      
   }  
  
   //6.释放步骤3分配的内存   
   free(pImageCodecInfo);  
   return -1;  // Failure   
}  
  
INT main()  
{  
   GdiplusStartupInput gdiplusStartupInput;  
   ULONG_PTR gdiplusToken;  
     
   //1.初始化GDI+,以便后续的GDI+函数可以成功调用   
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);  
  
   CLSID   encoderClsid;  
   Status  stat;  
     
   //7.创建Image对象并加载图片   
   Image*   image = new Image(L"f://11.bmp");  
  
   // Get the CLSID of the PNG encoder.   
   GetEncoderClsid(L"image/png", &encoderClsid);  
  
   //8.调用Image.Save方法进行图片格式转换,并把步骤3)得到的图像编码器Clsid传递给它   
   stat = image->Save(L"11.png", &encoderClsid, NULL);  
  
   if(stat == Ok)  
      printf("Bird.png was saved successfully/n");  
   else  
      printf("Failure: stat = %d/n", stat);   
  
   //9.释放Image对象   
   delete image;  
   //10.清理所有GDI+资源   
   GdiplusShutdown(gdiplusToken);  
   return 0;  
}  


 

学习资源:

MSDN -> Win32  和 COM开发 -> Graghics and Multimedia  ->  GDI+ -> Using GDI+ ->  Using Image Encoders and Decoders。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C++中使用GDI+先组合两张BMP图片再进行绘制,你可以按照以下步骤进行操作: 1. 首先,确保你已经在项目中添加了所需的GDI+头文件和库文件,并初始化GDI+库。在程序的入口函数中添加以下代码: ```cpp #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") ULONG_PTR gdiplusToken; Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); ``` 2. 在窗口类中添加以下成员变量: ```cpp Gdiplus::Bitmap* bitmap1; Gdiplus::Bitmap* bitmap2; ``` 3. 在窗口的创建函数中,加载两张BMP图片文件并创建对应的位图对象: ```cpp bitmap1 = new Gdiplus::Bitmap(L"image1.bmp"); bitmap2 = new Gdiplus::Bitmap(L"image2.bmp"); ``` 这里,"image1.bmp"和"image2.bmp"是你要加载的两张BMP图片文件名。 4. 在窗口的绘制函数中,组合两张图片并绘制到窗口: ```cpp PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); Gdiplus::Graphics graphics(hdc); graphics.DrawImage(bitmap1, 0, 0); // 绘制第一张图片 int width = bitmap1->GetWidth(); int height = bitmap1->GetHeight(); graphics.DrawImage(bitmap2, width, 0); // 绘制第二张图片 EndPaint(hWnd, &ps); ``` 这里,我们假设第一张图片位于窗口的左上角,第二张图片位于第一张图片的右边。你可以根据需要调整这些坐标。 5. 在窗口销毁时,释放相关资源: ```cpp delete bitmap1; delete bitmap2; Gdiplus::GdiplusShutdown(gdiplusToken); ``` 通过这些步骤,你可以在C++中使用GDI+先组合两张BMP图片再进行绘制。希望对你有帮助!如果你有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值