【VC++技术杂谈007】使用GDI+进行图片格式转换

  本文主要介绍如何使用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 = 50;                                //压缩比例
35     EncoderParameters encoderParameters;
36     encoderParameters.Count = 1;
37     encoderParameters.Parameter[0].Guid = EncoderQuality;
38     encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
39     encoderParameters.Parameter[0].NumberOfValues = 1;
40     encoderParameters.Parameter[0].Value = &encoderQuality;
41
42     //进行图片格式转换
43     Bitmap bmBitmap(m_EditImagePath.AllocSysString());        //根据源图片文件构建一个GDI+位图对象
44     CString strSaveSaveFilePath = m_EditImagePath.Left(m_EditImagePath.GetLength() - 3);
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分别表示源图片格式和目的图片格式。

时间: 2024-10-24 12:19:10

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

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

wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上,它类似于印刷业广泛使用的PostScript格式. 关于wmf2eps安装使用的问题可参考如下两个网页. http://www.kellogg.northwestern.edu/rc/miktex-install.htm http://www.wolf-s.homepage.t-online.de

.NET图片操作类,包含图片格式转换、图片缩放、 文字水印、图片水印、路径转换

using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Drawing.Imaging;using System.Drawing;using System.Web;namespace ZC.Utils{  public  static class ImageHelper  { #region 图片格式转换      /// <summary>      /// 图片

php 图片格式转换-亲测ok

代码如下 /** * 图片格式转换 * @param string $image_path 文件路径或url * @param string $to_ext 待转格式,支持png,gif,jpeg,wbmp,webp,xbm * @param null|string $save_path 存储路径,null则返回二进制内容,string则返回true|false * @return boolean|string $save_path是null则返回二进制内容,是string则返回true|fal

怎样将图片格式转换成PDF格式?

电脑中保存的图片转换成PDF格式该如何进行操作呢?下面就这个问题小编就将自己所知道的转换方法告诉大家!1.首先可以将转换成PDF格式的图片保存在一份新建的新文件夹中.2.接下来就可以借助电脑端的PDF转换软件进行操作了.不过前提是电脑中要有PDF转换器,没有的话大家自行去下载.这个就不用小编教大家了吧!3.电脑中打开转换软件,之后就进入到操作的页面了.我们可以移动鼠标选择到左侧的其它文件转换PDF这个栏目,它里面就一个功能叫图片转换PDF的功能,点击选中它.4.接着可以将开始准备的文件夹中的图片

【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片

本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp图像文件的类型.文件大小等信息. (2)位图信息数据结构,包含Bmp图像的宽.高.压缩类型等信息. (3)颜色表,该部分可选,有些位图需要,有些位图(如24位真彩色位图)不需要. (4)位图数据. 1.1位图头文件数据结构 位图头文件数据结构包含Bmp图像文件的类型.文件大小等信息,占用14个字节.

【VC++技术杂谈003】打印技术之打印机状态监控

在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机状态进行实时监控之前,我们有必要先了解一下打印机虚脱机技术. 独占设备是指在一个程序(作业.用户)的整个运行期间独占设备,直到该程序(作业.用户)完成.系统的独占设备是有限的(比如,一台计算机只能够连接一台打印机),往往不能够满足多进程的要求,会引起大量进程由于等待某些独占设备而阻塞.另一方面,申请

【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语音输出. 微软TTS语音引擎提供了Windows Speech SDK开发包供编程者使用.Windows Speech SDK包含语音合成SS引擎和语音识别SR引擎两种,语音合成引擎用于将文字转换成语音输出,语音识别引擎用于识别语音命令. Windows Speech SDK可以在微软的官网上免费下

【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信

在工控测试系统中,经常需要使用到各类程控仪器,这些程控仪器通常具有GPIB.LAN.USB等硬件接口,计算机通过这些接口能够与其通信,从而实现自动测量.数据采集.数据分析和数据处理等操作.本文主要介绍如何与程控仪器通过GPIB接口进行通信. 1.GPIB简介 GPIB是通用总线(General Purpose Interface Bus)的简称. GPIB一共由24根线组成,其中8根数据线DB0-DB7,3根握手线(NRFD.DAV.NDAC),5根总线控制线(ATN.SRQ.IFC.REN.E

【VC++技术杂谈001】音频技术之调节音量及设置静音

本文主要介绍如何使用混音器Mixer API函数实现系统音量调节,以及设置静音. 1.混音器的作用及结构 1.1混音器的作用 声卡(音频卡)是计算机进行声音处理的适配器,具有三个基本功能: (1)音乐合成发音功能 (2)混音器(Mixer)功能和数字声音效果处理器(DSP)功能 (3)模拟声音信号的输入和输出功能 混音器的作用是将来自音乐合成器.CD-ROM.话筒输入(MIC)等不同来源的声音组合在一起再输出. 1.2混音器的结构 混音器由多个目的单元(Destination)组成,如回放(Pl