1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="-//W3C//DTD XHTML 1.1//EN" xml:lang="en" xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
4 <meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
5 <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4"></meta>
6 <title>ImageMagick: MagickWand, C API for ImageMagick</title>
7 <meta http-equiv="content-language" content="en-US"></meta>
8 <meta http-equiv="content-type" content="text/html; charset=utf-8"></meta>
9 <meta http-equiv="reply-to" content="magick-users@imagemagick.org"></meta>
10 <meta name="application-name" content="ImageMagick"></meta>
11 <meta name="description" content="Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats. In addition, resize, rotate, shear, distort or transform images automagically."></meta>
12 <meta name="application-url" content="http://www.imagemagick.org"></meta>
13 <meta name="generator" content="PHP"></meta>
14 <meta name="keywords" content="magickwc, api, for, imagemagick, ImageMagick, PerlMagick, image processing, OpenMP, software development library, image, photo, software, Magick++, MagickWand"></meta>
15 <meta name="rating" content="GENERAL"></meta>
16 <meta name="robots" content="INDEX, FOLLOW"></meta>
17 <meta name="generator" content="ImageMagick Studio LLC"></meta>
18 <meta name="author" content="ImageMagick Studio LLC"></meta>
19 <meta name="revisit-after" content="2 DAYS"></meta>
20 <meta name="resource-type" content="document"></meta>
21 <meta name="copyright" content="Copyright (c) 1999-2012 ImageMagick Studio LLC"></meta>
22 <meta name="distribution" content="Global"></meta>
23 <link rel="icon" href="../images/wand.png"></link>
24 <link rel="shortcut icon" href="../images/wand.ico" type="images/x-icon"></link>
25 <link rel="canonical" href="http://www.imagemagick.org"></link>
26 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"></link>
28 <!-- Add jQuery library -->
29 <script type="text/javascript" src="http://localhost/ajax/libs/jquery/1.7/jquery.min.js"></script>
31 <!-- Add mousewheel plugin (this is optional) -->
32 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/lib/jquery.mousewheel-3.0.6.pack.js"></script>
35 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/source/jquery.fancybox.css?v=2.0.6" type="text/css" media="screen"></link>
36 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/source/jquery.fancybox.pack.js?v=2.0.6"></script>
38 <!-- Optionally add helpers - button, thumbnail and/or media -->
39 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/source/helpers/jquery.fancybox-buttons.css?v=1.0.2" type="text/css" media="screen"></link>
40 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/source/helpers/jquery.fancybox-buttons.js?v=1.0.2"></script>
41 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/source/helpers/jquery.fancybox-media.js?v=1.0.0"></script>
43 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/source/helpers/jquery.fancybox-thumbs.css?v=2.0.6" type="text/css" media="screen"></link>
44 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/source/helpers/jquery.fancybox-thumbs.js?v=2.0.6"></script>
46 <script type="text/javascript">
47 $(document).ready(function() {
48 $(".fancybox").fancybox();
52 <!-- ImageMagick style -->
53 <style type="text/css" media="all">
54 @import url("../www/magick.css");
58 <body id="www-imagemagick-org">
62 <div class="titlebar">
63 <div style="margin: 17px auto; float: left;">
64 <script type="text/javascript">
66 google_ad_client = "pub-3129977114552745";
67 google_ad_slot = "5439289906";
68 google_ad_width = 728;
69 google_ad_height = 90;
74 <a href="http://www.imagemagick.org/discourse-server/">
75 <img src="../images/logo.jpg" alt="ImageMagick Logo" style="width: 123px; height: 118px; border: 0px; float: right;"></img></a>
76 <a href="../index.html">
77 <img src="../images/sprite.jpg" alt="ImageMagick Sprite" style="width: 114px; height: 118px; border: 0px; float: right;"></img></a>
83 <a title="About ImageMagick" href="../index.html">About ImageMagick</a>
86 <a title="Binary Releases" href="binary-releases.html">Binary Releases</a>
89 <a title="Binary Release: Unix" href="binary-releases.html#unix">Unix</a>
92 <a title="Binary Release: MacOS X" href="binary-releases.html#macosx">Mac OS X</a>
95 <a title="Binary Release: iOS" href="binary-releases.html#iOS">iOS</a>
98 <a title="Binary Release: Windows" href="binary-releases.html#windows">Windows</a>
100 <div class="sep"></div>
102 <a title="Command-line Tools" href="command-line-tools.html">Command-line Tools</a>
105 <a title="Command-line Tools: Processing" href="command-line-processing.html">Processing</a>
108 <a title="Command-line Tools: Options" href="command-line-options.html">Options</a>
111 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
114 <a title="Program Interfaces" href="api.html">Program Interfaces</a>
117 <a title="Program Interface: MagickWand" href="magick-wand.html">MagickWand</a>
120 <a title="Program Interface: MagickCore" href="magick-core.html">MagickCore</a>
123 <a title="Program Interface: PerlMagick" href="perl-magick.html">PerlMagick</a>
126 <a title="Program Interface: Magick++" href="magick++.html">Magick++</a>
128 <div class="sep"></div>
130 <a title="Install from Source" href="install-source.html">Install from Source</a>
133 <a title="Install from Source: Unix" href="install-source.html#unix">Unix</a>
136 <a title="Install from Source: Windows" href="install-source.html#windows">Windows</a>
139 <a title="Resources" href="resources.html">Resources</a>
142 <a title="Architecture" href="architecture.html">Architecture</a>
145 <a title="Download" href="download.html">Download</a>
147 <div class="sep"></div>
149 <a title="Search" href="search.html">Search</a>
151 <div class="sep"></div>
153 <a title="Site Map" href="sitemap.html">Site Map</a>
156 <a title="Site Map: Links" href="links.html">Links</a>
158 <div class="sep"></div>
160 <a title="Support ImageMagick Development" href="support.html">Support ImageMagick Development</a>
164 <div class="eastbar">
166 <div> <a class="FlattrButton" style="display:none;" rev="flattr;button:compact;" href="http://www.imagemagick.org/"></a></div>
168 <a href="http://flattr.com/thing/947300/Convert-Edit-And-Compose-Images" target="_blank">
169 <img src="http://api.flattr.com/button/flattr-badge-large.png" alt="Flattr this" title="Flattr this" width="93" height="20" border="0"></img></a>
177 <h1>MagickWand C API</h1>
179 <div class="doc-section">
180 <p>The <a href="http://magick.imagemagick.org/api/MagickWand/index.html">MagickWand API</a> is the recommended interface between the C programming language and the ImageMagick image processing libraries. Unlike the <a href="magick-core.html">MagickCore</a> C API, MagickWand uses only a few opaque types. Accessors are available to set or get important wand properties. A description of the MagickWand public methods are found here:</p>
183 <li><a href="../api/magick-wand.html">Magick Wand Methods</a></li>
184 <li><a href="../api/magick-property.html">Set or Get Magick Wand Properties</a></li>
185 <li><a href="../api/magick-image.html">Magick Wand Image Methods</a></li>
186 <li><a href="../api/pixel-iterator.html">Pixel Iterator Methods</a></li>
187 <li><a href="../api/pixel-wand.html">Pixel Wand Methods</a></li>
188 <li><a href="../api/drawing-wand.html">Image Vector Drawing</a></li>
189 <li><a href="../api/mogrify.html">Command-line Interface</a></li>
190 <li><a href="../api/wand-view.html">Wand View Methods</a></li>
191 <li><a href="../api/magick-deprecate.html">Deprecated Methods</a></li>
192 <li><a href="exception.html">Error and Warning Codes</a></li>
195 <p>After you write your MagickWand program, compile it like this:</p>
197 <p class="crt"><span class="crtprompt"> $ </span><span class="crtin">cc -o wand `pkg-config --cflags --libs MagickWand` wand.c</span></p>
198 <p>Set the <code>PKG_CONFIG_PATH</code> environment variable if ImageMagick is not in your default system path:</p>
199 <p class="crt"><span class="crtprompt"> $ </span><span class="crtin">export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig</span></p>
200 <p>Here is a example program that utilizes the MagickWand API to get you started, <a href="../source/wand.c">wand.c</a>. It reads an image, creates a thumbnail, and writes the result to disk.</p>
202 <div class="viewport">
203 #include <stdio.h>
204 #include <stdlib.h>
205 #include <wand/MagickWand.h>
207 int main(int argc,char **argv)
209 #define ThrowWandException(wand) \
217 description=MagickGetException(wand,&severity); \
218 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
219 description=(char *) MagickRelinquishMemory(description); \
231 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
238 magick_wand=NewMagickWand();
239 status=MagickReadImage(magick_wand,argv[1]);
240 if (status == MagickFalse)
241 ThrowWandException(magick_wand);
243 Turn the images into a thumbnail sequence.
245 MagickResetIterator(magick_wand);
246 while (MagickNextImage(magick_wand) != MagickFalse)
247 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
249 Write the image then destroy it.
251 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
252 if (status == MagickFalse)
253 ThrowWandException(magick_wand);
254 magick_wand=DestroyMagickWand(magick_wand);
255 MagickWandTerminus();
260 <p>Here is another program that shows one way to get and set image pixels with the MagickWand API, <a href="../source/contrast.c">contrast.c</a>. It reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk.</p>
262 <div class="viewport">
263 #include <stdio.h>
264 #include <stdlib.h>
265 #include <math.h>
266 #include <wand/MagickWand.h>
268 int main(int argc,char **argv)
270 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
271 #define SigmoidalContrast(x) \
272 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
273 #define ThrowWandException(wand) \
281 description=MagickGetException(wand,&severity); \
282 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
283 description=(char *) MagickRelinquishMemory(description); \
316 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
323 image_wand=NewMagickWand();
324 status=MagickReadImage(image_wand,argv[1]);
325 if (status == MagickFalse)
326 ThrowWandException(image_wand);
327 contrast_wand=CloneMagickWand(image_wand);
329 Sigmoidal non-linearity contrast control.
331 iterator=NewPixelIterator(image_wand);
332 contrast_iterator=NewPixelIterator(contrast_wand);
333 if ((iterator == (PixelIterator *) NULL) ||
334 (contrast_iterator == (PixelIterator *) NULL))
335 ThrowWandException(image_wand);
336 for (y=0; y < (long) MagickGetImageHeight(image_wand); y++)
338 pixels=PixelGetNextIteratorRow(iterator,&width);
339 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
340 if ((pixels == (PixelWand **) NULL) ||
341 (contrast_pixels == (PixelWand **) NULL))
343 for (x=0; x < (long) width; x++)
345 PixelGetMagickColor(pixels[x],&pixel);
346 pixel.red=SigmoidalContrast(pixel.red);
347 pixel.green=SigmoidalContrast(pixel.green);
348 pixel.blue=SigmoidalContrast(pixel.blue);
349 pixel.index=SigmoidalContrast(pixel.index);
350 PixelSetMagickColor(contrast_pixels[x],&pixel);
352 (void) PixelSyncIterator(contrast_iterator);
354 if (y < (long) MagickGetImageHeight(image_wand))
355 ThrowWandException(image_wand);
356 contrast_iterator=DestroyPixelIterator(contrast_iterator);
357 iterator=DestroyPixelIterator(iterator);
358 image_wand=DestroyMagickWand(image_wand);
360 Write the image then destroy it.
362 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
363 if (status == MagickFalse)
364 ThrowWandException(image_wand);
365 contrast_wand=DestroyMagickWand(contrast_wand);
366 MagickWandTerminus();
370 <p><a id="wand-view"></a>Now lets perform the same contrast enhancement while taking advantage of our dual or quad-core processing system by running the algorithm in parallel utilizing wand views. The <a href="../source/wand/sigmoidal-contrast.c">sigmoidal-contrast.c</a> module reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk just like the previous contrast enhancement program, but now it does its work in parallel (assumes ImageMagick is built with OpenMP support).</p>
372 <div class="viewport">
373 #include <stdio.h>
374 #include <stdlib.h>
375 #include <math.h>
376 #include <wand/MagickWand.h>
378 static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
379 const ssize_t y,const int id,void *context)
381 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
382 #define SigmoidalContrast(x) \
383 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
397 extent=GetWandViewExtent(contrast_view);
398 pixels=GetWandViewPixels(contrast_view);
399 for (x=0; x < (long) (extent.width-extent.height); x++)
401 PixelGetMagickColor(pixels[x],&pixel);
402 pixel.red=SigmoidalContrast(pixel.red);
403 pixel.green=SigmoidalContrast(pixel.green);
404 pixel.blue=SigmoidalContrast(pixel.blue);
405 pixel.index=SigmoidalContrast(pixel.index);
406 PixelSetMagickColor(contrast_pixels[x],&pixel);
411 int main(int argc,char **argv)
413 #define ThrowViewException(view) \
415 description=GetWandViewException(view,&severity); \
416 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
417 description=(char *) MagickRelinquishMemory(description); \
420 #define ThrowWandException(wand) \
422 description=MagickGetException(wand,&severity); \
423 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
424 description=(char *) MagickRelinquishMemory(description); \
448 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
455 contrast_wand=NewMagickWand();
456 status=MagickReadImage(contrast_wand,argv[1]);
457 if (status == MagickFalse)
458 ThrowWandException(contrast_wand);
460 Sigmoidal non-linearity contrast control.
462 contrast_view=NewWandView(contrast_wand);
463 if (contrast_view == (WandView *) NULL)
464 ThrowWandException(contrast_wand);
465 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
466 if (status == MagickFalse)
467 ThrowWandException(contrast_wand);
468 contrast_view=DestroyWandView(contrast_view);
470 Write the image then destroy it.
472 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
473 if (status == MagickFalse)
474 ThrowWandException(contrast_wand);
475 contrast_wand=DestroyMagickWand(contrast_wand);
476 MagickWandTerminus();
480 <p><a href="http://members.shaw.ca/el.supremo/MagickWand/">MagickWand Examples in C</a> illustrates how to use the ImageMagick MagickWand API. Each example is presented as a C function, complete with headers, so that it can be copied to a file and then included in your own C project.</p>
486 <span id="linkbar-west"> </span>
488 <span id="linkbar-center">
489 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> •
490 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a> •
491 <a href="http://jqmagick.imagemagick.org/">JqMagick</a>
493 <span id="linkbar-east"> </span>
496 <span id="footer-west">© 1999-2013 ImageMagick Studio LLC</span>
497 <span id="footer-east"> <a href="contact.html">Contact the Wizards</a></span>
499 <div style="clear: both; margin: 0; width: 100%; "></div>