【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”头文件中加入如下代码:
#define UNICODE
#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include "Gdiplus/GdiPlus.h"
using namespace Gdiplus;
#pragma comment(lib, ".\\Gdiplus\\gdiplus.lib")
2.初始化GDI+库以及卸载GDI+库
在工程的初始化启动函数InitInstance()中加入如下代码,实现对GDI+库的初始化。
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_GdiPlusToken, &gdiplusStartupInput, NULL);
其中,m_GdiPlusToken是ULONG_PTR类型的成员变量。
在应用程序退出时,即ExitInstance()函数中,实现对GDI+库的卸载,具体实现代码如下。
GdiplusShutdown(m_GdiPlusToken);
3.编程示例
如下的编程示例,实现了bmp、jpg、png三种图片格式之间的互相转换。程序运行界面如图1所示。

图1 主界面
3.1Bitmap.Save()方法
进行图片格式转换主要利用了GDI+位图对象Bitmap的Save()方法。该函数能够将位图对象按指定的转码方式写入到磁盘文件或数据流中,其中一个函数原型为:
inline Status
Image::Save(
IN const WCHAR* filename,
IN const CLSID* clsidEncoder,
IN const EncoderParameters *encoderParams
)
{
return SetStatus(DllExports::GdipSaveImageToFile(nativeImage,
filename,
clsidEncoder,
encoderParams));
}
其中,参数filename表示转码后的磁盘文件名(全路径);参数clsidEncoder表示转码方式; 参数encoderParams表示转码参数。
3.2具体实现
如下的代码示例了点击“格式转换”按钮后,如何设置转码方式、转码参数,以及调用Bitmap的Save()方法完成图片格式转换。
/*
* 函数功能 : 点击"格式转换"按钮时,该函数被调用
* 备 注 :
* 作 者 : 博客园 依旧淡然
*/
void CImageConvertDlg::OnButtonImageConvert()
{
UpdateData(TRUE); //检测源图片文件是否选择
if(m_EditImagePath.IsEmpty())
{
MessageBox("请选择图片!", "提示", MB_OK|MB_ICONWARNING);
return;
} //检测转换前后的格式是否相同
if(m_SourceImageType == m_DestinationImageType)
{
MessageBox("格式相同,不需要转换!", "提示", MB_OK|MB_ICONWARNING);
return;
} //设置编码方式
CLSID clsid;
if(m_DestinationImageType == _T("bmp"))
GetEnCoderClsid(L"image/bmp", &clsid);
else if(m_DestinationImageType == _T("jpg"))
GetEnCoderClsid(L"image/jpeg", &clsid);
else if(m_DestinationImageType == _T("png"))
GetEnCoderClsid(L"image/png", &clsid); //设置编码参数
ULONG encoderQuality = ; //压缩比例
EncoderParameters encoderParameters;
encoderParameters.Count = ;
encoderParameters.Parameter[].Guid = EncoderQuality;
encoderParameters.Parameter[].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[].NumberOfValues = ;
encoderParameters.Parameter[].Value = &encoderQuality; //进行图片格式转换
Bitmap bmBitmap(m_EditImagePath.AllocSysString()); //根据源图片文件构建一个GDI+位图对象
CString strSaveSaveFilePath = m_EditImagePath.Left(m_EditImagePath.GetLength() - );
strSaveSaveFilePath += m_DestinationImageType;
Status status = bmBitmap.Save(strSaveSaveFilePath.AllocSysString(), &clsid, &encoderParameters);
if(status != Ok)
{
MessageBox("图片转换失败!", "提示", MB_OK|MB_ICONWARNING);
return;
}
}
其中,成员变量m_SourceImageType和m_DestinationImageType分别表示源图片格式和目的图片格式。
【VC++技术杂谈007】使用GDI+进行图片格式转换的更多相关文章
- C++使用GDI+实现图片格式转换
主要是我在设置壁纸时遇到的个小问题,因为设置壁纸只能是bmp格式的图片,不可能我喜欢的壁纸就都是bmp格式的,就想怎么转换一下图片的格式,于是就在百度搜怎么弄,搜到了可行方法,却没有实现代码,有些看起 ...
- bmp,jpg,png,tif,wmf,emf与eps图片格式转换
wmf/emf是两种Microsoft Windows的图形文件格式.它是一个矢量图格式,但是也允许包含位图.本质上,一个WMF文件保存一系列可以用来重建图片的Windows GDI命令.在某种程度上 ...
- python 将png图片格式转换生成gif动画
先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...
- 利用PBFunc在Powerbuilder中进行图片格式转换
利用PBFunc的n_pbfunc_image对象可以方便的进行图片格式的转换与大小转换 支持相互转换的格式有以下几种: FORMAT_BMP //bmp格式FORMAT_GIF //gif格式FO ...
- php 图片格式转换-亲测ok
代码如下 /** * 图片格式转换 * @param string $image_path 文件路径或url * @param string $to_ext 待转格式,支持png,gif,jpeg,w ...
- 图片格式转换之ImageMagick
项目中需要实现一些图片文件到TIFF文件的转换,去网上下载了一些第三方软件. 好的软件需要收费,免费的存在各种问题. 自己动手,丰衣足食! 众里寻他千百度,蓦然回首,那人就是ImageMagick. ...
- MAC图片格式转换
OS X下有一个sips的程序可以用来处理图片. sips的名称功能非常强大,参考 帮助文档 . 这里我们只用到其中的一个功能,转换图片格式. 命令参考: sips - s format jpeg ...
- 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样
最近要把项目中的图片全部生成webp格式, 过程整理一下, (直接存在本地,或者图片链接存在数据库都可以看看) 首先,肯定是批量处理, 一个php处理不了这么多, 会爆内存的, 个人建议用aja ...
- PIL图片格式转换
PIL格式转换 原图: #!/usr/local/bin/python # -*- coding: utf8 -*- from PIL import Image, ImageFilter import ...
随机推荐
- 自定义RatingBar的一个问题(只显示显示一个星星)
问题一: 在自定义RatingBar时在设置了numStars属性后只显示一张图(一个星星) 解答: 注意准备的替换图片千万不要使用.9PNG格式的图片,要不之后显示一张图(一个星星)! 问题二: 设 ...
- Java EE之搭建论坛系统(使用JForum)
1.下载JForum开源压缩包: 网址:http://jforum.net/ (或者直接使用百度云中的压缩包) 解压,修改解压后文件下的\WEB-INF\config\database\mysql目 ...
- PHP 汉字拼音互转
<?PHP function Pinyin($_String, $_Code='gb2312'){ $_DataKey = "a|ai|an|ang|ao|ba|bai|ban|ban ...
- C#对象序列化与反序列化zz
C#对象序列化与反序列化(转载自:http://www.cnblogs.com/LiZhiW/p/3622365.html) 1. 对象序列化的介绍........................ ...
- ECF R9(632E) & DP
Description: 给你$n$个数可以任取$k$个(可重复取),输出所有可能的和. $n \leq 1000,a_i \leq 1000$ Solution: 好神的DP,我们排序后把每个数都减 ...
- js cookie的封装和调用
<script> function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(e ...
- compass reset和layout [Sass和compass学习笔记]
reset 可以重置浏览器的的html的默认样式,因为各个浏览器对有些元素解析差别很大 通过重置样式可以让样式的浏览器兼容 更简单 使用方法简单 @import "compass/reset ...
- linu for循环
用途说明 在shell中用于循环.类似于其他编程语言中的for,但又有些不同.for循环是Bash中最常用的语法结构. 常用格式 格式一 for 变量 do 语句 done 格式二 for 变量 in ...
- VS调式显示问题
调式时,发现与以前的显示不太一样,虽然也能看到结果,但不是很方便,后来网上查找到与VS中的一个文件被修改有关. 找个别人安装过的VS2005,替换Common7\Packages\Debugger\a ...
- java分享第十八天-02( java结合testng,利用XML做数据源的数据驱动)
testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本.在这以XML为例:备注:@DataProvider的返回值类 ...