ITEEDU

ImageMagick项目模块的实现

站长原创,版权所有ITEEDU,2011-07-22

在进行测试的过程中,由于处于摸索和学习的阶段,所以在实现图片格式转换过程中,曾经历了好几个版本,下边简单地做以讲解。

第一阶段:通过命令端测试。

在终端输入
Conver picture1.jpg  picture2.bmp 
之后,就可将picture1.jpg,转换成picture2.jpg。

第二阶段:通过程序读取图片

有了tesseract-ocr的成功案例,我又借鉴了其中的convert.cpp函数,进行修改为自己,其参考代码如下:

测试1

#include <MagickWand.h> 
#include <MagickCore.h>
#include "convert.h"
int main(int argc,char **argv)
{   ExceptionInfo *exception;   ImageInfo  *image_info;   MagickBooleanType status;   MagickCoreGenesis(*argv,MagickTrue);   exception=AcquireExceptionInfo();   image_info=AcquireImageInfo();   status=MagickCommandGenesis(image_info,ConvertImageCommand,argc,argv, (char **) NULL,exception);
  image_info=DestroyImageInfo(image_info);   exception=DestroyExceptionInfo(exception);   MagickCoreTerminus();   return(status); }
只是进行了简单的测试,工程名字为imagick,可执行文件为imagick,运行时:
./imagick picture1.jpg picture2.bmp 

测试2

    #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,  *thumbnails=NULL; 
      ImageInfo *image_info; 
   
      /* 
        Initialize the image info structure and read an image. 
      */ 
      char *input = "/home/administrator/test.jpg"; 
      MagickCoreGenesis("test",MagickTrue); 
      exception=AcquireExceptionInfo(); 
      image_info=CloneImageInfo((ImageInfo *) NULL); 
      (void) strcpy(image_info->filename,input); 
      //如果合成了image,那么就可以从这里开始 
      images=ReadImage(image_info,exception); 
      if (exception->severity != UndefinedException) 
        CatchException(exception); 
      printf("exception\n"); 
      if (images == (Image *) NULL) 
        exit(1); 
      printf("images\n"); 
      /* 
        Convert the image to a thumbnail. 
      */ 
     thumbnails=NewImageList(); 
      while ((image=RemoveFirstImageFromList(&images)) != (Image *) NULL) 
      { 
       //resize_image=ResizeImage(image,1024,800,LanczosFilter,1.0,exception); 
      	thumbnails = ThumbnailImage(image,image->columns, image->rows, exception); 
      	printf("thumbnails\n"); 
       //if (resize_image == (Image *) NULL) 
       //   MagickError(exception->severity,exception->reason,exception->description); 
       //  (void) AppendImageToList(&thumbnails,resize_image); 
        DestroyImage(image); 
      } 
      /*      Write the image thumbnail.    */ 
       thumbnails->depth=1; 
       thumbnails->colors=2; 
       thumbnails->compression=NoCompression; 
      char *output = "/home/administrator/tmp.bmp"; 
     (void) strcpy(thumbnails->filename,output); 
     WriteImage(image_info,thumbnails); 
      /* 
        Destroy the image thumbnail and exit. 
      */ 
      thumbnails=DestroyImageList(thumbnails); 
      image_info=DestroyImageInfo(image_info); 
      exception=DestroyExceptionInfo(exception); 
      MagickCoreTerminus(); 
      printf("picture convert successfully!"); 
      return(0); 
    } 
该程序运行完毕后,直接将 test.jpg转换成了tmp.bmp图片,成功。

第三阶段:通过参数传递过来的参数

char *imagick(char *input_info) 
  { 	     char *output_info = NULL; 
  	     ExceptionInfo  *exception; 
  		 Image *image,*images,  *thumbnails=NULL; 
  		 ImageInfo *image_info; 
  		 /* 
  		      Initialize the image info structure and read an image. 
  		 */ 
   
  		 MagickCoreGenesis("test",MagickTrue); 
  		 exception=AcquireExceptionInfo(); 
  		 image_info=CloneImageInfo((ImageInfo *) NULL); 
  		 (void) strcpy(image_info->filename,input_info); 
   
  		 //如果合成了image,那么就可以从这里开始 
  		  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,1024,800,LanczosFilter,1.0,exception); 
  			   thumbnails = ThumbnailImage(image,image->columns, image->rows, exception); 
  			   DestroyImage(image); 
  		   } 
  		    /* 
  		      Write the image thumbnail. 
  		    */ 
  		    thumbnails->depth=1; 
  		    thumbnails->colors=2; 
  		    thumbnails->compression=NoCompression; 
   
  		    output_info = "/tmp/image.bmp"; 
  		   (void) strcpy(thumbnails->filename,output_info); 
  		    WriteImage(image_info,thumbnails); 
  		    /*    Destroy the image thumbnail and exit.   */ 
  		    thumbnails=DestroyImageList(thumbnails); 
  		    image_info=DestroyImageInfo(image_info); 
  		    exception=DestroyExceptionInfo(exception); 
  		    MagickCoreTerminus(); 
   
  	          return output_info; 
  }//return the tmp.bmp's path 

测试完毕了,呵呵,所需要的功能又达到了,呵呵……