在VC6中使用GDI的方法

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;    

}  

 

posted on 2013-03-12 11:57  AI_JJ  阅读(424)  评论(0)    收藏  举报

导航