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++图片类型的识别(附源码)

VC++中ANSIUNICODE与UTF-8字符编码之间的转换(附源码)

VC++几种加载图片方法的讨论(附源码)

VC++如何将rc资源中的图片加载到MFC的CImage对象中(附源码)

C++中图片类型的识别以及各图片类型之间的转换

VC++屏幕捕获并保存成图片(附源码)