本文说明如何在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
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
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
(point.x>Bmp.left) &&
(point.x
(point.x>Jpg.left) &&
(point.x
(point.x>Gif.left) &&
(point.x
(point.x>Png.left) &&
(point.x
{
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;
}
核心的部分就是这些了.第一次写技术文章,各位见笑了.
说的不清楚,还是看源码吧.
也可以联系我,给我留言吧.
没有评论:
发表评论