=====================================================
ImageMagick的使用和開發的文章:
=====================================================
本文介紹使用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裏面有幾種接口的詳細開發說明。