小試ImageMagik——開發篇

=====================================================

ImageMagick的使用和開發的文章:

小試ImageMagik——使用篇

小試ImageMagik——開發篇

=====================================================


本文介紹使用ImageMagick開發程序的方法。ImageMagick安裝之後就可以支持C/C++程序的開發,提供了3種接口。在這裏首先介紹一下ImageMagick的3種接口。

MagickCore:

底層的C語言接口。較複雜,但是可以修改很多參數,只適合高端用戶使用。

MagickWand:

推薦的C語言接口。相比於MagickCore接口,簡單很多。適合普通用戶使用。

Magick++:

提供面向對象的C++接口。

 

下面回顧一下ImageMagick安裝後目錄:


其中幾個和開發有關的文件:

Lib文件夾:開發需要使用的靜態庫文件。包含4個庫,前3個對應ImageMagick的3個接口:

CORE_RL_magick_.lib; CORE_RL_Magick++_.lib; CORE_RL_wand_.lib; X11.lib;

 

Include文件夾:開發需要使用的頭文件。包含3個文件夾,對應ImageMagick的3個接口:

magick; Magick++; wand;

 

*.dll:開發和使用過程中需要使用的動態鏈接庫文件。

 

在開發中我們需要3種文件:頭文件(*.h),靜態庫文件(*.lib),動態庫文件(*.dll)。因此我們在VC中新建一個工程,然後將Lib文件夾,Include文件夾,以及dll拷貝到工程目錄下,並且配置一下頭文件和靜態庫的路徑,就可以了。

 

下面分別給出ImageMagick的3種接口對應的例子。

MagickCore(底層的C語言接口。較複雜,但是可以修改很多參數,只適合高端用戶使用)

功能:讀取文件,創建縮略圖,並保存成文件。

/*
 * 雷霄驊
 * [email protected]
 * http://blog.csdn.net/leixiaohua1020
 * 中國傳媒大學/數字電視技術
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <magick/MagickCore.h>
 
int main(int argc,char **argv)
{
  ExceptionInfo
    *exception;
 
  Image
    *image,
    *images,
    *resize_image,
    *thumbnails;
 
  ImageInfo
    *image_info;
 
  if (argc != 3)
    {
      (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
      exit(0);
    }
  /*
    Initialize the image info structure and read an image.
  */
  MagickCoreGenesis(*argv,MagickTrue);
  exception=AcquireExceptionInfo();
  image_info=CloneImageInfo((ImageInfo *) NULL);
  (void) strcpy(image_info->filename,argv[1]);
  images=ReadImage(image_info,exception);
  if (exception->severity != UndefinedException)
    CatchException(exception);
  if (images == (Image *) NULL)
    exit(1);
  /*
    Convert the image to a thumbnail.
  */
  thumbnails=NewImageList();
  while ((image=RemoveFirstImageFromList(&images)) != (Image *) NULL)
  {
    resize_image=ResizeImage(image,106,80,LanczosFilter,1.0,exception);
    if (resize_image == (Image *) NULL)
      MagickError(exception->severity,exception->reason,exception->description);
    (void) AppendImageToList(&thumbnails,resize_image);
    DestroyImage(image);
  }
  /*
    Write the image thumbnail.
  */
  (void) strcpy(thumbnails->filename,argv[2]);
  WriteImage(image_info,thumbnails);
  /*
    Destroy the image thumbnail and exit.
  */
  thumbnails=DestroyImageList(thumbnails);
  image_info=DestroyImageInfo(image_info);
  exception=DestroyExceptionInfo(exception);
  MagickCoreTerminus();
  return(0);
}

MagickWand(推薦的C語言接口。相比於MagickCore接口,簡單很多。適合普通用戶使用)

功能: 讀取文件,創建縮略圖,並保存成文件。

/*
 * 雷霄驊
 * [email protected]
 * http://blog.csdn.net/leixiaohua1020
 * 中國傳媒大學/數字電視技術
 */
#include <stdio.h>
#include <stdlib.h>
#include <wand/MagickWand.h>
 
int main(int argc,char **argv)
{
 
  MagickBooleanType status;
 
  MagickWand *magick_wand;
 
  if (argc != 3)
    {
      (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
      exit(0);
    }
  /*
    Read an image.
  */
  MagickWandGenesis();
  magick_wand=NewMagickWand();
  status=MagickReadImage(magick_wand,argv[1]);
  /*
    Turn the images into a thumbnail sequence.
  */
  MagickResetIterator(magick_wand);
  while (MagickNextImage(magick_wand) != MagickFalse)
    MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
  /*
    Write the image then destroy it.
  */
  status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
 
  magick_wand=DestroyMagickWand(magick_wand);
  MagickWandTerminus();
  return(0);
}
Magick++(提供面向對象的C++接口)

/*
 * 雷霄驊
 * [email protected]
 * http://blog.csdn.net/leixiaohua1020
 * 中國傳媒大學/數字電視技術
 */
//創建Image對象,
// create a blank image canvas with 640x480 size and 'white' color as background:
 Image blank_image( Geometry(640, 480), Color(MaxRGB, MaxRGB, MaxRGB, 0));
 // or also, by using the automatic C++ type conversions for the arguments:
 Image blank_image("640x480", "white");
 
 // create an image from URL
 Image url_image("http://www.serverName.com/image.gif");
 Image local_file_image("my_image.gif");   // here the URL points to the local filesystem
//獲取/設置屬性
// Canvas geometry
// returns an unsigned int representing the my_image width
unsigned int Image::columns();
// returns an unsigned int representing the my_image heigth
unsigned int Image::rows();
// sets the my_image format; the format string can be "GIF", etc
void Image::magick("png");
// returns a string value representing the image format (e.g. “GIF”, “JPEG”, etc)
string Image::magick();
//讀取/保存圖像文件
// Reading the contents of a disk file into an image object can be performed
Image my_image();  // create an *empty* image using the default Image constructor
// read a GIF image file from disk; the image format is automatically set to GIF
my_image.read("aGIFImageFile.gif");
// Writing an Image object to a disk file. set the "format" attribute of my_image to PNG
my_image.magick("png");
// write to disk an image file
my_image.write("file_name_explicit_extension.gif");

MagickWand一般情況下屬於使用比較普遍的,下面記錄兩個MagickWand開發的例子。

更多的例子可以參考:http://members.shaw.ca/el.supremo/MagickWand/

功能:將圖像的寬高變成源圖像的50%

/*
 * 雷霄驊
 * [email protected]
 * http://blog.csdn.net/leixiaohua1020
 * 中國傳媒大學/數字電視技術
 */
#include <windows.h>
#include <wand/magick_wand.h>
 
void test_wand(void)
{
         MagickWand *m_wand = NULL;
        
         int width,height;
        
         MagickWandGenesis();
        
         m_wand = NewMagickWand();
         // Read the image - all you need to do is change "logo:" to some other
         // filename to have this resize and, if necessary, convert a different file
         MagickReadImage(m_wand,"logo:");
        
         // Get the image's width and height
         width = MagickGetImageWidth(m_wand);
         height = MagickGetImageHeight(m_wand);
        
         // Cut them in half but make sure they don't underflow
         if((width /= 2) < 1)width = 1;
         if((height /= 2) < 1)height = 1;
        
         // Resize the image using the Lanczos filter
         // The blur factor is a "double", where > 1 is blurry, < 1 is sharp
         // I haven't figured out how you would change the blur parameter of MagickResizeImage
         // on the command line so I have set it to its default of one.
         MagickResizeImage(m_wand,width,height,LanczosFilter,1);
        
         // Set the compression quality to 95 (high quality = low compression)
         MagickSetImageCompressionQuality(m_wand,95);
        
         /* Write the new image */
         MagickWriteImage(m_wand,"logo_resize.jpg");
        
         /* Clean up */
         if(m_wand)m_wand = DestroyMagickWand(m_wand);
        
         MagickWandTerminus();
}
功能:在圖像的周圍加上邊框

/*
 * 雷霄驊
 * [email protected]
 * http://blog.csdn.net/leixiaohua1020
 * 中國傳媒大學/數字電視技術
 */
#include <windows.h>
#include <wand/magick_wand.h>
 
void test_wand(void)
{
         MagickWand *m_wand = NULL;
         PixelWand *p_wand;
         int w,h;
 
         MagickWandGenesis();
 
         /* Create a wand */
         m_wand = NewMagickWand();
         p_wand = NewPixelWand();
 
         // Change this to whatever colour you like - e.g. "none"
         PixelSetColor(p_wand, "blue");
         /* Read the input image */
         MagickReadImage(m_wand,"logo:");
         w = MagickGetImageWidth(m_wand);
         h = MagickGetImageHeight(m_wand);
         MagickSetImageBackgroundColor(m_wand,p_wand);
         // This centres the original image on the new canvas.
         // Note that the extent's offset is relative to the
         // top left corner of the *original* image, so adding an extent
         // around it means that the offset will be negative
         MagickExtentImage(m_wand,1024,768,-(1024-w)/2,-(768-h)/2);
         MagickWriteImage(m_wand,"logo_extent.jpg");
 
         /* Tidy up */
         m_wand = DestroyMagickWand(m_wand);
         p_wand = DestroyPixelWand(p_wand);
         MagickWandTerminus();
}
補充:詳細的教程可以從ImageMagick的官網(http://www.imagemagick.org/)左側的目錄中查看。在Program Interfaces裏面有幾種接口的詳細開發說明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章