在VC6中使用GDI的方法(附一个使用GDI+的批量图片格式转换程序)

原文来自 : http://blog.sina.com.cn/s/blog_5d7883db0100bkys.html


GDI+是MS官方的图像处理包,好处自不多说,很多高手都强烈推荐它.
本文说明如何在VC6的平台上配置和使用GDI+.并用一个很实用的小程序说明如何使用GDI+转换硬盘上的图片的格式.

下载GDI+的相关文件.网上给的很多连接都失效了.我就传了一个到我的网络硬盘上.请点击后面连接直接下载.点击此处下载GDI+包
下载完成后,就可以进行配置了.网上给出的例子,要对VC进行设置,那样有些烦麻.我的办法是把包中的文件直接放到VC的系统目录下去.这样就不用对VC进行设置了,以后用起来也方便.
打开刚刚下载的压缩包,里面有include头文件,一个LIB,和一个DLL.进入你的D:\Program Files\Microsoft Visual Studio\VC98目录下,把lib文件放到Lib文件夹里面.把那些头文件全部放进Include里面.就样就可以了.
现在,配置已经基本完成了.可以在工程中使用GDI+了.
在工程中使用GDI+,要在你的文件前包含它的头文件,引进它的库.


#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include <GdiPlus.h>
using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
做完以上工作,你就可以使用GDI+了!!!


也许以上说的太空洞了.下面就用一个实例来说明GDI+的用法.注意,本例子只是给出GDI+的一些基本概念,远没有用到GDI+的强大功能.GDI+的功能,还要读者自己慢慢去研究.
这个例子实现的是批量图片格式的转换.操作简单,功能也简单.
这个工程是基于VC6的,源文件请点击后面连接下载.使用GDI+转换图片格式的例子的下载.
编写的过程是:
1.建立一个基于对话框的应用程序.
2.在stdafx.h中加入:

#ifndef ULONG_PTR
#define ULONG_PTR unsigned long*
#endif
#include <GdiPlus.h>
using namespace Gdiplus;


3.编辑对话框:
主要是调整大小,加入四个图片.具体看工程源文件.
4.在OnInitDialog()里加入如下代码.
DragAcceptFiles(TRUE);
上面这一句很重要,它使得这个窗口可以接受拖曳操作.
m_bmp.GetWindowRect(&Bmp);
m_jpg.GetWindowRect(&Jpg);
m_gif.GetWindowRect(&Gif);
m_png.GetWindowRect(&Png);
CRect   rect;  
GetClientRect(&rect);
ClientToScreen(&rect);
Bmp.top-=rect.top;
Bmp.left-=rect.left;
Bmp.bottom-=rect.top;
Bmp.right-=rect.left;
Jpg.top-=rect.top;
Jpg.left-=rect.left;
Jpg.bottom-=rect.top;
Jpg.right-=rect.left;
Gif.top-=rect.top;
Gif.left-=rect.left;
Gif.bottom-=rect.top;
Gif.right-=rect.left;
Png.top-=rect.top;
Png.left-=rect.left;
Png.bottom-=rect.top;
Png.right-=rect.left;


这一段代码主要是得到四个图标在窗口中的坐标.以便一会判断用户是要转成什么格式.
4.最关键的函数是OnDropFiles(HDROP   hDropInfo)    
它是一个系统的回调函数.当有鼠标把文件拖进来的时候,调用此函数.具体的不讲了,今天讲的是GDI+,关于拖曳的,以后再说.
下面给出这个函数的实现.还是,具体的看源码:
void   CCBabyImageDlg::OnDropFiles(HDROP   hDropInfo)    
{ 
	CPoint point;
	::DragQueryPoint(hDropInfo,&point);
	if (
		(point.y<Bmp.bottom) &&
		(point.y>Bmp.top) &&
		(point.x>Bmp.left) &&
		(point.x<Bmp.right)
		)
	{
		char szFilePathName[_MAX_PATH+1] = {0};
		UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //得到文件个数
		for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex)
		{
			DragQueryFile(hDropInfo, nIndex, szFilePathName, _MAX_PATH);  //得到文件名
			Image im(ToWChar(szFilePathName));
			int i,Temp;
			for(i=0;i<_MAX_PATH;i++)
			{
				if (szFilePathName[i]=='.')
				{
					Temp = i;
				}
				if (szFilePathName[i]==0)
				{
					break;
				}
			}
			szFilePathName[Temp+1] = 'b';
			szFilePathName[Temp+2] = 'm';
			szFilePathName[Temp+3] = 'p';
			CLSID pngClsid;
			GetEncoderClsid(L"image/bmp",&pngClsid);  
			im.Save(ToWChar(szFilePathName), &pngClsid, NULL);
		}
	}
	if (
		(point.y<Jpg.bottom) &&
		(point.y>Jpg.top) &&
		(point.x>Jpg.left) &&
		(point.x<Jpg.right)
		)
	{
		char szFilePathName[_MAX_PATH+1] = {0};
		UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //得到文件个数
		for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex)
		{
			DragQueryFile(hDropInfo, nIndex, szFilePathName, _MAX_PATH);  //得到文件名
			Image im(ToWChar(szFilePathName));
			int i,Temp;
			for(i=0;i<_MAX_PATH;i++)
			{
				if (szFilePathName[i]=='.')
				{
					Temp = i;
				}
				if (szFilePathName[i]==0)
				{
					break;
				}
			}
			szFilePathName[Temp+1] = 'j';
			szFilePathName[Temp+2] = 'p';
			szFilePathName[Temp+3] = 'g';
			CLSID pngClsid;
			GetEncoderClsid(L"image/jpeg",&pngClsid);  
			im.Save(ToWChar(szFilePathName), &pngClsid, NULL);
		}
	}
	if (
		(point.y<Gif.bottom) &&
		(point.y>Gif.top) &&
		(point.x>Gif.left) &&
		(point.x<Gif.right)
		)
	{
		char szFilePathName[_MAX_PATH+1] = {0};
		UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //得到文件个数
		for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex)
		{
			DragQueryFile(hDropInfo, nIndex, szFilePathName, _MAX_PATH);  //得到文件名
			Image im(ToWChar(szFilePathName));
			int i,Temp;
			for(i=0;i<_MAX_PATH;i++)
			{
				if (szFilePathName[i]=='.')
				{
					Temp = i;
				}
				if (szFilePathName[i]==0)
				{
					break;
				}
			}
			szFilePathName[Temp+1] = 'g';
			szFilePathName[Temp+2] = 'i';
			szFilePathName[Temp+3] = 'f';
			CLSID pngClsid;
			GetEncoderClsid(L"image/gif",&pngClsid);  
			im.Save(ToWChar(szFilePathName), &pngClsid, NULL);
		}
	}
	if (
		(point.y<Png.bottom) &&
		(point.y>Png.top) &&
		(point.x>Png.left) &&
		(point.x<Png.right)
		)
	{
		char szFilePathName[_MAX_PATH+1] = {0};
		UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0); //得到文件个数
		for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex)
		{
			DragQueryFile(hDropInfo, nIndex, szFilePathName, _MAX_PATH);  //得到文件名
			Image im(ToWChar(szFilePathName));
			int i,Temp;
			for(i=0;i<_MAX_PATH;i++)
			{
				if (szFilePathName[i]=='.')
				{
					Temp = i;
				}
				if (szFilePathName[i]==0)
				{
					break;
				}
			}
			szFilePathName[Temp+1] = 'p';
			szFilePathName[Temp+2] = 'n';
			szFilePathName[Temp+3] = 'g';
			CLSID pngClsid;
			GetEncoderClsid(L"image/png",&pngClsid);  
			im.Save(ToWChar(szFilePathName), &pngClsid, NULL);
		}
	}
	DragFinish(hDropInfo);
}


到此,这个程序的核心功能已经完成了,还有一些具体的工作,比如程序框架什么的,读者自己看源码吧.
另外,还要说明,还有两个非常重要的函数,是别人的,现在也给出来.这些函数都是在使用GDI+的时候经常用到的.
(1).注意到上面代码中GetEncoderClsid(L"image/png",&pngClsid);   这句了.
这个函数的实现在下面:
BOOL   CCBabyImageDlg::GetEncoderClsid(const   WCHAR*   format,   CLSID*   pCLSID)  
{  
	UINT   num   =   0;  
	UINT   size   =   0;  


	ImageCodecInfo*   pImageCodecInfo   =   NULL;  
	GetImageEncodersSize(&num,   &size);  
	if(size   ==   0)
	{  
		return   FALSE;  
	}  
	pImageCodecInfo   =   (ImageCodecInfo   *)(malloc(size));  
	if(pImageCodecInfo   ==   NULL)  
		return   FALSE;  
	GetImageEncoders(num,   size,   pImageCodecInfo);    


	//   Find   for   the   support   of   format   for   image   in   the   windows  
	for(UINT   i   =   0;   i   <   num;   ++i)  
	{    
		//MimeType:   Depiction   for   the   program   image      
		if(   wcscmp(pImageCodecInfo[i].MimeType,   format)   ==   0)  
		{      
			*pCLSID   =   pImageCodecInfo[i].Clsid;    
			free(pImageCodecInfo);    
			return   TRUE;      
		}      
	}      
	free(pImageCodecInfo);      
	return   FALSE;    
}




这很有用,留着.


2.Image的Save函数的参数要WCHAR型的是UNICODE编码.而现在一般程序里用的是char,ASCII编码.下面这个函数是CSDN上看来的,它把char转到WCHAR.
WCHAR* CCBabyImageDlg::ToWChar(char * str)    
{    
	static   WCHAR   buffer[1024];    
	wcsset(buffer,0);    
	MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);    
	return   buffer;    
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值