2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
\r
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
\r
4 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
\r
6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
\r
7 <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U="/>
\r
8 <title>ImageMagick: MagickWand, C API for ImageMagick</title/>
9 <meta http-equiv="Content-Language" content="en-US"/>
10 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
11 <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
12 <meta name="Application-name" content="ImageMagick"/>
13 <meta name="Description" content="ImageMagick® is a software suite to create, edit, and compose bitmap images. It can read, convert and write images in a variety of formats (about 100) including GIF, JPEG, JPEG-2000, PNG, PDF, PhotoCD, TIFF, and DPX. Use ImageMagick to translate, flip, mirror, rotate, scale, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves. ImageMagick is free software delivered as a ready-to-run binary distribution or as source code that you can freely use, copy, modify, and distribute. Its license is compatible with the GPL. It runs on all major operating systems. The functionality of ImageMagick is typically utilized from the command line or you can use the features from programs written in your favorite programming language. Choose from these interfaces: MagickCore (C), MagickWand (C), ChMagick (Ch), Magick++ (C++), JMagick (Java), L-Magick (Lisp), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick (Tcl/TK). With a language interface, use ImageMagick to modify or create images automagically and dynamically."/>
14 <meta name="Application-url" content="http://www.imagemagick.org"/>
15 <meta name="Generator" content="PHP"/>
16 <meta name="Keywords" content="magickwc, api, for, imagemagick, ImageMagick, ImageMagic, MagickCore, MagickWand, PerlMagick, Magick++, RMagick, PythonMagick, JMagick, TclMagick, Image, Magick, Magic, Wand, ImageMagickObject, Swiss, Army, Knife, Image, Processing"/>
17 <meta name="Rating" content="GENERAL"/>
18 <meta name="Robots" content="INDEX, FOLLOW"/>
19 <meta name="Generator" content="ImageMagick Studio LLC"/>
20 <meta name="Author" content="ImageMagick Studio LLC"/>
21 <meta name="Revisit-after" content="2 DAYS"/>
22 <meta name="Resource-type" content="document"/>
23 <meta name="Copyright" content="Copyright (c) 1999-2010 ImageMagick Studio LLC"/>
24 <meta name="Distribution" content="Global"/>
25 <link rel="icon" href="../images/wand.png" sizes="32x32"/>
26 <link rel="shortcut icon" href="../images/wand.ico" type="images/x-icon"/>
27 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
\r
28 <style type="text/css" media="all">
\r
29 @import url("../www/magick.css");
\r
33 <body id="www-imagemagick-org">
\r
34 <div class="titlebar">
\r
35 <a href="../index.html">
\r
36 <img src="../images/script.png" alt="[ImageMagick]"
\r
37 style="width: 350px; height: 60px; margin: 28px auto; float: left;" /></a>
\r
38 <a href="http://www.networkredux.com">
\r
39 <img src="../images/networkredux.png" alt="[sponsor]"
\r
40 style="margin: 45px auto; border: 0px; float: left;" /></a>
\r
41 <a href="http://www.imagemagick.org/discourse-server/">
\r
42 <img src="../images/logo.jpg" alt=""
\r
43 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
\r
44 <a href="../index.html">
\r
45 <img src="../images/sprite.jpg" alt=""
\r
46 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
\r
49 <div class="westbar">
\r
52 <a title="About ImageMagick" href="../index.html">About ImageMagick</a>
54 <div class="sep"></div>
\r
56 <a title="Binary Releases" href="../www/binary-releases.html">Binary Releases</a>
59 <a title="Binary Release: Unix" href="../www/binary-releases.html#unix">Unix</a>
62 <a title="Binary Release: MacOS X" href="../www/binary-releases.html#macosx">Mac OS X</a>
65 <a title="Binary Release: Windows" href="../www/binary-releases.html#windows">Windows</a>
67 <div class="sep"></div>
\r
69 <a title="Command-line Tools" href="../www/command-line-tools.html">Command-line Tools</a>
72 <a title="Command-line Tools: Processing" href="../www/command-line-processing.html">Processing</a>
75 <a title="Command-line Tools: Options" href="../www/command-line-options.html">Options</a>
78 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
81 <a title="Program Interfaces" href="../www/api.html">Program Interfaces</a>
84 <a title="Program Interface: MagickWand" href="../www/magick-wand.html">MagickWand</a>
87 <a title="Program Interface: MagickCore" href="../www/magick-core.html">MagickCore</a>
90 <a title="Program Interface: PerlMagick" href="../www/perl-magick.html">PerlMagick</a>
93 <a title="Program Interface: Magick++" href="../Magick++/">Magick++</a>
95 <div class="sep"></div>
\r
97 <a title="Install from Source" href="../www/install-source.html">Install from Source</a>
100 <a title="Install from Source: Unix" href="../www/install-source.html#unix">Unix</a>
103 <a title="Install from Source: Windows" href="../www/install-source.html#windows">Windows</a>
106 <a title="Resources" href="../www/resources.html">Resources</a>
109 <a title="Architecture" href="../www/architecture.html">Architecture</a>
112 <a title="Download" href="../www/download.html">Download</a>
114 <div class="sep"></div>
\r
116 <a title="Search" href="http://www.imagemagick.org/script/search.php">Search</a>
118 <div class="sep"></div>
\r
120 <a title="Site Map"href="../www/sitemap.html">Site Map</a>
123 <a title="Site Map: Links"href="../www/links.html">Links</a>
125 <div class="sep"></div>
\r
127 <a title="Sponsors" href="../www/sponsors.html">Sponsors:</a>
129 <div class="sponsbox">
130 <div class="sponsor">
131 <a title="Sponsor: Notebook of repair" href="http://www.notebook-reparatur-berlin.de/">Notebook of Repair</a><!-- 2011030100025 -->
133 <div class="sponsor">
134 <a title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
136 <div class="sponsor">
137 <a title="Sponsor: Image Converter" href="http://www.batchphoto.com">Image Converter</a><!-- 201103010900 Bits Coffee-->
139 <div class="sponsor">
140 <a title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
142 <div class="sponsor">
143 <a title="Sponsor: Webdesign Agentur" href="http://www.ventzke-partner.de">Webdesign Agentur</a><!-- 201101010480 invendio.de-->
145 <div class="sponsor">
146 <a title="Sponsor: LVM Versicherung" href="http://www.neu-reich.de">LVM Versicherung</a><!-- 201101010480 -->
148 <div class="sponsor">
149 <a title="Sponsor: Diamonds are a Girls Best Friend" href="http://www.schmuck.org">Diamonds are a Girls Best Friend</a><!-- 201101010600 Peterssen-->
155 <div class="eastbar">
\r
156 <script type="text/javascript">
\r
158 google_ad_client = "pub-3129977114552745";
\r
159 google_ad_slot = "0574824969";
\r
160 google_ad_width = 160;
\r
161 google_ad_height = 600;
\r
164 <script type="text/javascript"
\r
165 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
\r
171 <p class="navigation-index"></p>
173 <p>The <a href="../www/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="../www/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>
176 <li><a href="../www/api/magick-wand.html">Magick Wand Methods</a></li>
177 <li><a href="../www/api/magick-property.html">Set or Get Magick Wand Properties</a></li>
178 <li><a href="../www/api/magick-image.html">Magick Wand Image Methods</a></li>
179 <li><a href="../www/api/pixel-iterator.html">Pixel Iterator Methods</a></li>
180 <li><a href="../www/api/pixel-wand.html">Pixel Wand Methods</a></li>
181 <li><a href="../www/api/drawing-wand.html">Image Vector Drawing</a></li>
182 <li><a href="../www/api/mogrify.html">Command-line Interface</a></li>
183 <li><a href="../www/api/wand-view.html">Wand View Methods</a></li>
184 <li><a href="../www/api/magick-deprecate.html">Deprecated Methods</a></li>
185 <li><a href="../www/exception.html">Error and Warning Codes</a></li>
189 <p>After you write your MagickWand program, compile it like this:</p>
191 <p class='crt'><span class="crtprompt"> $magick> </span><span class='crtin'>cc `MagickWand-config --cflags --cppflags` -O2 -o wand wand.c \ <br/> `MagickWand-config --ldflags --libs`</span></p>
192 <p>Here is a example program that utilizes the MagickWand API to get you started, <a href="../www/source/wand.c">wand.c</a>. It reads an image, creates a thumbnail, and writes the result to disk.</p>
194 <div class="viewport">
196 #include <stdio.h>
197 #include <stdlib.h>
198 #include <wand/MagickWand.h>
200 int main(int argc,char **argv)
202 #define ThrowWandException(wand) \
210 description=MagickGetException(wand,&severity); \
211 (void) fprintf(stderr,"%s %s %u %s\n",GetMagickModule(),description); \
212 description=(char *) MagickRelinquishMemory(description); \
224 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
231 magick_wand=NewMagickWand();
232 status=MagickReadImage(magick_wand,argv[1]);
233 if (status == MagickFalse)
234 ThrowWandException(magick_wand);
236 Turn the images into a thumbnail sequence.
238 MagickResetIterator(magick_wand);
239 while (MagickNextImage(magick_wand) != MagickFalse)
240 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
242 Write the image then destroy it.
244 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
245 if (status == MagickFalse)
246 ThrowWandException(magick_wand);
247 magick_wand=DestroyMagickWand(magick_wand);
248 MagickWandTerminus();
254 <p>Here is another program that shows one way to get and set image pixels with the MagickWand API, <a href="../www/source/contrast.c">contrast.c</a>. It reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk.</p>
256 <div class="viewport">
258 #include <stdio.h>
259 #include <stdlib.h>
261 #include <wand/MagickWand.h>
263 int main(int argc,char **argv)
265 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
266 #define SigmoidalContrast(x) \
267 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
268 #define ThrowWandException(wand) \
276 description=MagickGetException(wand,&severity); \
277 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
278 description=(char *) MagickRelinquishMemory(description); \
311 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
318 image_wand=NewMagickWand();
319 status=MagickReadImage(image_wand,argv[1]);
320 if (status == MagickFalse)
321 ThrowWandException(image_wand);
322 contrast_wand=CloneMagickWand(image_wand);
324 Sigmoidal non-linearity contrast control.
326 iterator=NewPixelIterator(image_wand);
327 contrast_iterator=NewPixelIterator(contrast_wand);
328 if ((iterator == (PixelIterator *) NULL) ||
329 (contrast_iterator == (PixelIterator *) NULL))
330 ThrowWandException(image_wand);
331 for (y=0; y < (long) MagickGetImageHeight(image_wand); y++)
333 pixels=PixelGetNextIteratorRow(iterator,&width);
334 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
335 if ((pixels == (PixelWand **) NULL) ||
336 (contrast_pixels == (PixelWand **) NULL))
338 for (x=0; x < (long) width; x++)
340 PixelGetMagickColor(pixels[x],&pixel);
341 pixel.red=SigmoidalContrast(pixel.red);
342 pixel.green=SigmoidalContrast(pixel.green);
343 pixel.blue=SigmoidalContrast(pixel.blue);
344 pixel.index=SigmoidalContrast(pixel.index);
345 PixelSetMagickColor(contrast_pixels[x],&pixel);
347 (void) PixelSyncIterator(contrast_iterator);
349 if (y < (long) MagickGetImageHeight(image_wand))
350 ThrowWandException(image_wand);
351 contrast_iterator=DestroyPixelIterator(contrast_iterator);
352 iterator=DestroyPixelIterator(iterator);
353 image_wand=DestroyMagickWand(image_wand);
355 Write the image then destroy it.
357 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
358 if (status == MagickFalse)
359 ThrowWandException(image_wand);
360 contrast_wand=DestroyMagickWand(contrast_wand);
361 MagickWandTerminus();
366 <p><a name="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="../www/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>
368 <div class="viewport">
370 #include <stdio.h>
371 #include <stdlib.h>
373 #include <wand/MagickWand.h>
375 static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
376 const ssize_t y,const int id,void *context)
378 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
379 #define SigmoidalContrast(x) \
380 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
394 extent=GetWandViewExtent(contrast_view);
395 pixels=GetWandViewPixels(contrast_view);
396 for (x=0; x < (long) (extent.width-extent.height); x++)
398 PixelGetMagickColor(pixels[x],&pixel);
399 pixel.red=SigmoidalContrast(pixel.red);
400 pixel.green=SigmoidalContrast(pixel.green);
401 pixel.blue=SigmoidalContrast(pixel.blue);
402 pixel.index=SigmoidalContrast(pixel.index);
403 PixelSetMagickColor(contrast_pixels[x],&pixel);
408 int main(int argc,char **argv)
410 #define ThrowViewException(view) \
412 description=GetWandViewException(view,&severity); \
413 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
414 description=(char *) MagickRelinquishMemory(description); \
417 #define ThrowWandException(wand) \
419 description=MagickGetException(wand,&severity); \
420 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
421 description=(char *) MagickRelinquishMemory(description); \
445 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
452 contrast_wand=NewMagickWand();
453 status=MagickReadImage(contrast_wand,argv[1]);
454 if (status == MagickFalse)
455 ThrowWandException(contrast_wand);
457 Sigmoidal non-linearity contrast control.
459 contrast_view=NewWandView(contrast_wand);
460 if (contrast_view == (WandView *) NULL)
461 ThrowWandException(contrast_wand);
462 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
463 if (status == MagickFalse)
464 ThrowWandException(contrast_wand);
465 contrast_view=DestroyWandView(contrast_view);
467 Write the image then destroy it.
469 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
470 if (status == MagickFalse)
471 ThrowWandException(contrast_wand);
472 contrast_wand=DestroyMagickWand(contrast_wand);
473 MagickWandTerminus();
482 <span id="linkbar-west"> </span>
\r
483 <span id="linkbar-center">
\r
484 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> •
\r
485 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
\r
487 <span id="linkbar-east"> </span>
\r
489 <div class="footer">
\r
490 <span id="footer-west">© 1999-2010 ImageMagick Studio LLC</span>
\r
491 <span id="footer-east"> <a href="http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
\r
493 <div style="clear: both; margin: 0; width: 100%; "></div>
\r
494 <script type="text/javascript">
\r
495 var _gaq = _gaq || [];
\r
496 _gaq.push(['_setAccount', 'UA-17690367-1']);
\r
497 _gaq.push(['_trackPageview']);
\r
500 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
\r
501 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
\r
502 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
\r