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

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语言接口。较复杂,但是可以修改很多参数,只适合高端用户使用)

功能:读取文件,创建缩略图,并保存成文件。

/*
 * 雷霄骅
 * leixiaohua1020@126.com
 * 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接口,简单很多。适合普通用户使用)

功能: 读取文件,创建缩略图,并保存成文件。

/*
 * 雷霄骅
 * leixiaohua1020@126.com
 * 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++接口)

/*
 * 雷霄骅
 * leixiaohua1020@126.com
 * 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%

/*
 * 雷霄骅
 * leixiaohua1020@126.com
 * 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();
}

功能:在图像的周围加上边框

/*
 * 雷霄骅
 * leixiaohua1020@126.com
 * 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里面有几种接口的详细开发说明。

小试ImageMagik——开发篇的更多相关文章

  1. 小试ImageMagik——使用篇

    ===================================================== ImageMagick的使用和开发的文章: 小试ImageMagik--使用篇 小试Imag ...

  2. 华清远见金牌讲师名家大讲堂Android开发篇成功举办

    2014年3月5日.12日华清远见金牌讲师名家大讲堂(以下简称名家大讲堂)在线讲座全新升级开讲,至此拉开了新一年名家大讲堂的序幕! 华清远见名家大讲堂作为业内颇具影响力的公益免 费线上课程,自2009 ...

  3. 开年钜献:华清远见金牌讲师名家大讲堂(Android开发篇)

        华清远见作为嵌入式培训领导品牌,嵌入式就业课程已成为业内公认的专业人才培养体系!华清远见致力于让更多嵌入式技术爱好者及在校大学生获得一线嵌入式系统开发关键技术应用的经验,于2009年始开办名家 ...

  4. E8.Net工作流平台开发篇

    E8.Net开发篇(一)   E8.Net开发框架有哪些源程序模型? E8.Net开发框架为开发企业流程应用系统提供了最佳实践的开发架构.范例及源代码,包括待办事项的组织.流程启动模型.处理模型.母版 ...

  5. linux一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书)

    一句话问答(网络无关篇+网络相关篇+程序开发篇+经典图书) --------------------------目录-网络无关篇-目录-------------------------- 0001 修 ...

  6. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

    上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...

  7. Mac 配置教程-开发篇

    将 Mac 日常使用的软件和开发软件区分开,将之前写的 Mac 配置的文章分成了两篇: Mac 配置教程-日常篇 Mac 配置教程-开发篇 图床 iPic 设置快捷键 Command+Shift+u ...

  8. Hyperledger fabric-SDK-GO客户端开发篇(六)

    Hyperledger fabric-SDK-GO客户端开发篇(六) Fabric-SDK-GO是提供的Go语言开发包,应用程序可以利用Fabric-SDK-GO与fabric网络进行交互并访问链码. ...

  9. nginx模块开发篇 (阿里著作)

    背景介绍 nginx历史 使用简介 nginx特点介绍 nginx平台初探(100%) 初探nginx架构(100%) nginx基础概念(100%) connection request 基本数据结 ...

随机推荐

  1. java中JSON转换

    1.JSON介绍 JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度. JSON就是一串字符串 只不过元素会使用特定的符 ...

  2. 解决scroll在ios上卡顿问题和兼容ios不支持:active伪类情况

    //有时候因为滚动层级元素过多会产生卡顿,特别在ios上十分明显,如果不想更换其他实现方式,可以加:-webkit-overflow-scrolling: touch; 开启硬件加速: 兼容ios不支 ...

  3. sea.js及三种加载方式的异同

      一.前言     浏览器本身并不提供模块管理的机制,过去网页开发中,为了使用各种模块,不得不在加入一大堆script标签.这样就使得网页体积臃肿,难以维护,还产生大量的HTTP请求,拖慢显示速度, ...

  4. Linux 管理软件

    公司的openfire先前运行在windows上的,但由于在windows上openfire内存机制问题,最多只能占用2GB内存,且时间稍微长久一些就会自动挂掉,用户无法登陆和连接,因此迁移到了Cen ...

  5. RTMPdump(libRTMP)源代码分析 4: 连接第一步——握手(Hand Shake)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  6. 自定义View总结2

    自定义控件: 1.组合控件:将系统原生控件组合起来,加上动画效果,形成一种特殊的UI效果 2.纯粹自定义控件:继承自系统的View,自己去实现view效果 优酷菜单: 1.系统原生的旋转和位置动画并没 ...

  7. Android输入控件详解

    输入控件 输入控件是您的应用用户界面中的交互式组件.Android 提供了多种可在 UI 中使用的控件,如按钮.文本字段.定位栏.复选框.缩放按钮.切换按钮等. 向 UI 中添加输入控件与向 XML ...

  8. 一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。 高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)。

    //点数 #define N 10 //点间距 int D[N]; //A1到每个Ai的距离 int A1ToX[N]; void preprocess() { srand(time(0)); //随 ...

  9. Windows 为右键菜单瘦身

    当你想删除右键菜单中某些选项时,一种比较合适的思路是: 1.如果软件本身提供了控制选项,那么直接在该软件设置即可.没必要在注册表操作.比如360安全卫士和360杀毒都提供了这种机制. 值得一提的是,3 ...

  10. Android实现多条Toast快速显示(强制中止上一条Toast的显示)

    Android实现多条Toast快速显示 Toast多用于我们开发人员调试使用,有时候也作为给用户的弱提示使用,我们常用的方法是 Toast.makeText(this, "弹出Toast& ...