VC++图片类型之间的相互转换(附源码)
Posted dvlinker
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++图片类型之间的相互转换(附源码)相关的知识,希望对你有一定的参考价值。
上一篇文章我们说到了如何识别图片文件的真实类型,那本篇我们将讲述如何实现不同图片类型的相互转换。
1、为什么要进行图片类型的转换?
那为什么需要对图片类型进行转换呢?比如我们在IM软件中收到图片,我们可以将图片保存到本地磁盘上,我们在保存时可以选择我们要保存的图片格式,比如jpg、bmp、png等格式。其实程序收到的图片文件是某一类型的,如果要保存成其他类型的,就需要对图片进行类型转换了。
再比如bmp类型的图片比较大,我们要通过网络将图片发出去,为了减轻网络传输的压力,我们会将bmp图片转换成jpg或者png图片后再发出去。因为jpg和png图片的压缩比比较高,转换成jpg和png类型后,图片文件会明显变小很多。
2、如何实现图片类型的转换?
实现图片类型转换的方法很多,此处我们只讲解一下使用GDI+实现转换的方法。具体的思路是,先通过图片的绝对路径将图片加载到GDI+对象中,然后再调用GDI+对象的Save方法将图片保存为另一种类型的文件。
我们可以直接使用GDI+库中的Bitmap或Image对象,也可以使用MFC库中封装的CImage类(该类的内部使用的就是GDI+对象)去实现。有人可能会说,我的程序中不用MFC库,也不想引入MFC的库,如何使用CImage类呢?其实很简单,直接将MFC库中的CImage类的.h头文件和.cpp源文件单独拷贝出来,添加到你的工程中就可以使用了。可能头文件和源文件中会调用MFC库中的接口,我们只要稍微改动一下,将调用MFC库接口替换掉或者删除掉就可以了。
3、初始GDI+库
在使用GDI+库之前,先包含GDI+库的头文件:
#include "Gdiplus/GdiPlus.h"
using namespace Gdiplus;
引入GDI+库文件:
#pragma comment(lib, "gdiplus.lib")
然后再初始化GDI+库:
ULONG_PTR m_gdiplusToken;
Gdiplus::GdiplusStartupInput gdiplusStartupInput;
Gdiplus::GdiplusStartup( &m_gdiplusToken, &gdiplusStartupInput, NULL );
在退出程序时,要关闭GDI+库:
Gdiplus::GdiplusShutdown( m_gdiplusToken );
4、实现图片类型转换的代码
我们可以通过要保存的目标类型的后缀名去判断要转换到图片类型,相关代码如下:(本例中我们是使用MFC库中的CImage来实现的)
BOOL SaveImageToAnotherType( const CString& strSrcFile, const CString& strDstFile )
// 使用CImage实现不同格式图片文件的转换
if ( strDstFile.IsEmpty() )
return FALSE;
CImage img;
HRESULT hResult = img.Load( strSrcFile ); // 加载源图片文件
if ( hResult != S_OK )
return FALSE;
GUID guidFileType = Gdiplus::ImageFormatPNG; // 默认保存为png图片
CString strExt;
s32 nIndex = strDstFile.ReverseFind( _T('.') );
if ( nIndex != -1 )
strExt = strDstFile.Right( strDstFile.GetLength() - nIndex - 1 );
if ( strExt == _T("png") )
guidFileType = Gdiplus::ImageFormatPNG;
else if ( strExt == _T("jpg"))
guidFileType = Gdiplus::ImageFormatJPEG;
else if ( strExt == _T("bmp") )
guidFileType = Gdiplus::ImageFormatBMP;
else if ( strExt == _T("gif") )
guidFileType = Gdiplus::ImageFormatGIF;
else
guidFileType = Gdiplus::ImageFormatPNG;
hResult = img.Save( strDstFile, guidFileType ); // 保存为目标文件
if ( hResult != S_OK )
return FALSE;
return TRUE;
以上是关于VC++图片类型之间的相互转换(附源码)的主要内容,如果未能解决你的问题,请参考以下文章
VC++中ANSIUNICODE与UTF-8字符编码之间的转换(附源码)