本文主要介绍如何使用GDI+对图片进行格式转换,可以转换的图片格式为bmp、jpg、png。

1.加载GDI+库

  GDI+是GDI图形库的一个增强版本,提供了一系列Visual C++ API。为了使用GDI+,需要在工程中包含“GdiPlus.h”头文件,并加载“gdiplus.lib”库文件。

  具体实现方法为,下载GDI+库,将下载得到的Gdiplus文件夹放到工程中。Gdiplus文件夹中应当包含有“GdiPlus.h”等一系列头文件、Gdiplus.lib库文件和Gdiplus.dll动态链接库。

  在工程中的“StdAfx.h”头文件中加入如下代码:

  1. #define UNICODE
  2. #ifndef ULONG_PTR
  3. #define ULONG_PTR unsigned long*
  4. #endif
  5. #include "Gdiplus/GdiPlus.h"
  6. using namespace Gdiplus;
  7. #pragma comment(lib, ".\\Gdiplus\\gdiplus.lib")

2.初始化GDI+库以及卸载GDI+库

  在工程的初始化启动函数InitInstance()中加入如下代码,实现对GDI+库的初始化。

  1. GdiplusStartupInput gdiplusStartupInput;
  2. GdiplusStartup(&m_GdiPlusToken, &gdiplusStartupInput, NULL);

  其中,m_GdiPlusToken是ULONG_PTR类型的成员变量。

  在应用程序退出时,即ExitInstance()函数中,实现对GDI+库的卸载,具体实现代码如下。

  1. GdiplusShutdown(m_GdiPlusToken);

3.编程示例

  如下的编程示例,实现了bmp、jpg、png三种图片格式之间的互相转换。程序运行界面如图1所示。

图1 主界面

3.1Bitmap.Save()方法

  进行图片格式转换主要利用了GDI+位图对象Bitmap的Save()方法。该函数能够将位图对象按指定的转码方式写入到磁盘文件或数据流中,其中一个函数原型为:

  1. inline Status
  2. Image::Save(
  3. IN const WCHAR* filename,
  4. IN const CLSID* clsidEncoder,
  5. IN const EncoderParameters *encoderParams
  6. )
  7. {
  8. return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
  9. filename,
  10. clsidEncoder,
  11. encoderParams));
  12. }

  其中,参数filename表示转码后的磁盘文件名(全路径);参数clsidEncoder表示转码方式; 参数encoderParams表示转码参数。

3.2具体实现

  如下的代码示例了点击“格式转换”按钮后,如何设置转码方式、转码参数,以及调用Bitmap的Save()方法完成图片格式转换。

  1. /*
  2. * 函数功能 : 点击"格式转换"按钮时,该函数被调用
  3. * 备 注 :
  4. * 作 者 : 博客园 依旧淡然
  5. */
  6. void CImageConvertDlg::OnButtonImageConvert()
  7. {
  8. UpdateData(TRUE);
  9.  
  10. //检测源图片文件是否选择
  11. if(m_EditImagePath.IsEmpty())
  12. {
  13. MessageBox("请选择图片!", "提示", MB_OK|MB_ICONWARNING);
  14. return;
  15. }
  16.  
  17. //检测转换前后的格式是否相同
  18. if(m_SourceImageType == m_DestinationImageType)
  19. {
  20. MessageBox("格式相同,不需要转换!", "提示", MB_OK|MB_ICONWARNING);
  21. return;
  22. }
  23.  
  24. //设置编码方式
  25. CLSID clsid;
  26. if(m_DestinationImageType == _T("bmp"))
  27. GetEnCoderClsid(L"image/bmp", &clsid);
  28. else if(m_DestinationImageType == _T("jpg"))
  29. GetEnCoderClsid(L"image/jpeg", &clsid);
  30. else if(m_DestinationImageType == _T("png"))
  31. GetEnCoderClsid(L"image/png", &clsid);
  32.  
  33. //设置编码参数
  34. ULONG encoderQuality = ; //压缩比例
  35. EncoderParameters encoderParameters;
  36. encoderParameters.Count = ;
  37. encoderParameters.Parameter[].Guid = EncoderQuality;
  38. encoderParameters.Parameter[].Type = EncoderParameterValueTypeLong;
  39. encoderParameters.Parameter[].NumberOfValues = ;
  40. encoderParameters.Parameter[].Value = &encoderQuality;
  41.  
  42. //进行图片格式转换
  43. Bitmap bmBitmap(m_EditImagePath.AllocSysString()); //根据源图片文件构建一个GDI+位图对象
  44. CString strSaveSaveFilePath = m_EditImagePath.Left(m_EditImagePath.GetLength() - );
  45. strSaveSaveFilePath += m_DestinationImageType;
  46. Status status = bmBitmap.Save(strSaveSaveFilePath.AllocSysString(), &clsid, &encoderParameters);
  47. if(status != Ok)
  48. {
  49. MessageBox("图片转换失败!", "提示", MB_OK|MB_ICONWARNING);
  50. return;
  51. }
  52. }

  其中,成员变量m_SourceImageType和m_DestinationImageType分别表示源图片格式和目的图片格式。

【VC++技术杂谈007】使用GDI+进行图片格式转换的更多相关文章

  1. C++使用GDI+实现图片格式转换

    主要是我在设置壁纸时遇到的个小问题,因为设置壁纸只能是bmp格式的图片,不可能我喜欢的壁纸就都是bmp格式的,就想怎么转换一下图片的格式,于是就在百度搜怎么弄,搜到了可行方法,却没有实现代码,有些看起 ...

  2. bmp,jpg,png,tif,wmf,emf与eps图片格式转换

    wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上 ...

  3. python 将png图片格式转换生成gif动画

    先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...

  4. 利用PBFunc在Powerbuilder中进行图片格式转换

    利用PBFunc的n_pbfunc_image对象可以方便的进行图片格式的转换与大小转换 支持相互转换的格式有以下几种: FORMAT_BMP //bmp格式FORMAT_GIF  //gif格式FO ...

  5. php 图片格式转换-亲测ok

    代码如下 /** * 图片格式转换 * @param string $image_path 文件路径或url * @param string $to_ext 待转格式,支持png,gif,jpeg,w ...

  6. 图片格式转换之ImageMagick

    项目中需要实现一些图片文件到TIFF文件的转换,去网上下载了一些第三方软件. 好的软件需要收费,免费的存在各种问题. 自己动手,丰衣足食! 众里寻他千百度,蓦然回首,那人就是ImageMagick. ...

  7. MAC图片格式转换

    OS X下有一个sips的程序可以用来处理图片. sips的名称功能非常强大,参考 帮助文档 . 这里我们只用到其中的一个功能,转换图片格式. 命令参考: sips  - s format jpeg  ...

  8. 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样

    最近要把项目中的图片全部生成webp格式, 过程整理一下,    (直接存在本地,或者图片链接存在数据库都可以看看) 首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用aja ...

  9. PIL图片格式转换

    PIL格式转换 原图: #!/usr/local/bin/python # -*- coding: utf8 -*- from PIL import Image, ImageFilter import ...

随机推荐

  1. DNS枚举工具DNSenum

    DNS枚举工具DNSenum   DNSenum是一款非常强大的域名信息收集工具.它能够通过谷歌或者字典文件猜测可能存在的域名,并对一个网段进行反向查询.它不仅可以查询网站的主机地址信息.域名服务器. ...

  2. OSG消息机制之事件处理概述

    OSG的消息机制包括好多个头文件预定义及多个类. 首先,消息接收相关的类当属osgGA::GUIEventHandler和osgGA::GUIEventAdapter这两个类了.前者处理OSG程序与用 ...

  3. 北京电子科技学院(BESTI)实验报告4

    北京电子科技学院(BESTI)实验报告4 课程: 信息安全系统设计基础 班级:1452.1453 姓名:(按贡献大小排名)周恩德 .郑凯杰 学号:(按贡献大小排名)20145217 .201453 指 ...

  4. 分享一个discuz touch端的jQuery下拉刷新组件

    在线Demo 最近装了个discuz论坛, 趣股VIP吧,发现里面内置的jQuery上拉刷新组件写得还行,STATICURL可以用'http://o9gzet7tk.bkt.clouddn.com/i ...

  5. Coffeescript实现canvas时钟

    前言 参照Mozilla 官方教程,要在Canvas上画动画时钟,思路非常有意思. 把动画看作是多个帧组成,定时每个时间点在Canvas上画一帧来实现动画.而Mozilla 官方教程画图实现的思路有意 ...

  6. Eclipse 执行成功的 Hadoop-1.2.1 WordCount 源码

    万事开头难.最近在学习Hadoop,先是搭建各种版本环境,从2.2.0到2.3.0,再到1.2.1,终于都搭起来了,折腾了1周时间,之后开始尝试使用Eclipse编写小demo.仅复制一个现成的Wor ...

  7. what do i get for?

    有时候经常反思,做事究竟为了什么? 有时候,又无法解释,过去做的一些事情,是为了什么? 就像上小学时候明明挺到讨厌学习的,但上了初中后就开始玩命学习了 上高中时候认为自己真的是喜欢上学习了,上大学尼玛 ...

  8. 弱省互测#1 t3

    题意 给出一棵n个点的树,求包含1号点的第k小的连通块权值和.(\(n<=10^5\)) 分析 k小一般考虑堆... 题解 堆中关键字为\(s(x)+min(a)\),其中\(s(x)\)表示\ ...

  9. C#调用WebService

    1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求, ...

  10. db2基础

    DB2知识文档 一.db2 基础 基本语法 注释:"--"(两个减号) 字符串连接:"||" 如set msg='aaaa'||'bbbb',则msg为'aaa ...