2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
\r
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
\r
4 <html version="-//W3C//DTD XHTML 1.1//EN"
\r
5 xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
\r
6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\r
7 xsi:schemaLocation="http://www.w3.org/1999/xhtml
\r
8 http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
\r
10 <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
\r
11 <meta name="google-site-verification" content="MxsMq6bdLOx0KSuz1MY6yG9ZTIJ7_7DVRfl5NCAT5Yg"/>
\r
12 <title>ImageMagick: MagickWand, C API for ImageMagick</title>
13 <meta http-equiv="content-language" content="en-US"/>
14 <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
15 <meta http-equiv="reply-to" content="magick-users@imagemagick.org"/>
16 <meta name="application-name" content="ImageMagick"/>
17 <meta name="description" content="Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats. In addition resize, rotate, shear, distort and transform images automagically."/>
18 <meta name="application-url" content="http://www.imagemagick.org"/>
19 <meta name="generator" content="PHP"/>
20 <meta name="keywords" content="magickwc, api, for, imagemagick, ImageMagick, PerlMagick, image processing, OpenMP, software development library, image, photo, software, Magick++, MagickWand"/>
21 <meta name="rating" content="GENERAL"/>
22 <meta name="robots" content="INDEX, FOLLOW"/>
23 <meta name="generator" content="ImageMagick Studio LLC"/>
24 <meta name="author" content="ImageMagick Studio LLC"/>
25 <meta name="revisit-after" content="2 DAYS"/>
26 <meta name="resource-type" content="document"/>
27 <meta name="copyright" content="Copyright (c) 1999-2012 ImageMagick Studio LLC"/>
28 <meta name="distribution" content="Global"/>
29 <link rel="icon" href="../images/wand.png"/>
30 <link rel="shortcut icon" href="../images/wand.ico" type="images/x-icon"/>
31 <link rel="canonical" href="http://www.imagemagick.org" />
\r
32 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
\r
33 <!-- Add jQuery library -->
\r
34 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7/jquery.min.js"></script>
\r
36 <!-- Optionaly include easing and/or mousewheel plugins -->
\r
37 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.easing-1.3.pack.js"></script>
\r
38 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.mousewheel-3.0.6.pack.js"></script>
\r
40 <!-- Add fancyBox -->
\r
41 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/jquery.fancybox.css?v=2.0.4" type="text/css" media="screen" />
\r
42 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.fancybox.pack.js?v=2.0.4"></script>
\r
44 <!-- Optionaly include button and/or thumbnail helpers -->
\r
45 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-buttons.css?v=2.0.4" type="text/css" media="screen" />
\r
46 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-buttons.js?v=2.0.4"></script>
\r
48 <link rel="stylesheet" href="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-thumbs.css?v=2.0.4" type="text/css" media="screen" />
\r
49 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/helpers/jquery.fancybox-thumbs.js?v=2.0.4"></script>
\r
50 <script type="text/javascript">
\r
51 $(document).ready(function() {
\r
52 $(".fancybox").fancybox();
\r
55 <!-- ImageMagick style -->
\r
56 <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
\r
57 <style type="text/css" media="all">
\r
58 @import url("../www/magick.css");
\r
62 <body id="www-imagemagick-org">
\r
63 <div class="titlebar">
\r
64 <div style="margin: 17px auto; float: left;">
\r
65 <script type="text/javascript">
\r
67 google_ad_client = "pub-3129977114552745";
\r
68 google_ad_slot = "5439289906";
\r
69 google_ad_width = 728;
\r
70 google_ad_height = 90;
\r
73 <script type="text/javascript"
\r
74 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
\r
77 <a href="../discourse-server">
\r
78 <img src="../images/logo.jpg"
\r
79 alt="ImageMagick Logo"
\r
80 style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
\r
81 <a href="../index.html">
\r
82 <img src="../images/sprite.jpg"
\r
83 alt="ImageMagick Sprite"
\r
84 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
\r
87 <div class="westbar">
\r
90 <a title="About ImageMagick" href="../index.html">About ImageMagick</a>
93 <a title="Binary Releases" href="binary-releases.html">Binary Releases</a>
96 <a title="Binary Release: Unix" href="binary-releases.html#unix">Unix</a>
99 <a title="Binary Release: MacOS X" href="binary-releases.html#macosx">Mac OS X</a>
102 <a title="Binary Release: iOS" href="binary-releases.html#iOS">iOS</a>
105 <a title="Binary Release: Windows" href="binary-releases.html#windows">Windows</a>
107 <div class="sep"></div>
\r
109 <a title="Command-line Tools" href="command-line-tools.html">Command-line Tools</a>
112 <a title="Command-line Tools: Processing" href="command-line-processing.html">Processing</a>
115 <a title="Command-line Tools: Options" href="command-line-options.html">Options</a>
118 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
121 <a title="Program Interfaces" href="api.html">Program Interfaces</a>
124 <a title="Program Interface: MagickWand" href="magick-wand.html">MagickWand</a>
127 <a title="Program Interface: MagickCore" href="magick-core.html">MagickCore</a>
130 <a title="Program Interface: PerlMagick" href="perl-magick.html">PerlMagick</a>
133 <a title="Program Interface: Magick++" href="magick++.html">Magick++</a>
135 <div class="sep"></div>
\r
137 <a title="Install from Source" href="install-source.html">Install from Source</a>
140 <a title="Install from Source: Unix" href="install-source.html#unix">Unix</a>
143 <a title="Install from Source: Windows" href="install-source.html#windows">Windows</a>
146 <a title="Resources" href="resources.html">Resources</a>
149 <a title="Architecture" href="architecture.html">Architecture</a>
152 <a title="Download" href="download.html">Download</a>
154 <div class="sep"></div>
\r
156 <a title="Search" href="search.html">Search</a>
158 <div class="sep"></div>
\r
160 <a title="Site Map" href="sitemap.html">Site Map</a>
163 <a title="Site Map: Links" href="links.html">Links</a>
165 <div class="sep"></div>
\r
167 <a rel="follow" title="Sponsors" href="sponsors.html">Sponsors:</a>
169 <a href="http://www.networkredux.com"> <img src="../images/networkredux.png" width="140" height="31" alt="[sponsor]" style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a>
170 <a href="http://www.dinodirect.com/ipads-tablets/"> <img src="../images/dino-direct.jpg" width="140" height="90" alt="[sponsor]" style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a><!-- 201208010120 mickey@163... -->
171 <div class="sponsbox">
172 <div class="sponsor">
173 <a rel="follow" title="Sponsor: The Fastest & Easiest Way to Find Images" href="http://www.graphicsfactory.com">The Fastest & Easiest Way to Find Images</a><!-- 201210010270 graphicsfac... -->
175 <div class="sponsor">
176 <a rel="follow" title="Sponsor: VPS" href="http://www.interdominios.com/vps">VPS</a><!-- 201209010090 barsh@inter... -->
178 <div class="sponsor">
179 <a rel="follow" title="Werbebanner Werbeplane" href="http://www.allesbanner.de">Werbebanner Werbeplane</a><!-- 201212010450 info@druck... -->
181 <div class="sponsor">
182 <a rel="follow" title="Entertainment News & Photos" href="http://www.zimbio.com">Entertainment News & Photos</a><!-- 201211010540 bd@zimb... -->
184 <div class="sponsor">
185 <a rel="follow" title="Sponsor: LED24" href="http://led24.de/">LED24</a><!-- 201207010270 info@led24... -->
187 <div class="sponsor">
188 <a rel="follow" title="Sponsor: Best Website Hosting" href="http://www.top-cheap-web-hosting.com">Best Website Hosting</a><!-- 201304010090 eunge.liu-->
190 <div class="sponsor">
191 <a rel="follow" title="Android Tablet" href="http://www.dinodirect.com/ipads-tablets/">Android Tablet</a><!-- 201208010120 mickey@163... -->
193 <div class="sponsor">
194 <a rel="follow" title="Sponsor: Web Site Hosting" href="http://webhostinggeeks.com">Web Site Hosting</a><!-- 201302010900 funds@enmob... -->
196 <div class="sponsor">
197 <a rel="follow" title="Sponsor: Premium Quality Stock Photos" href="http://www.f1online.pro/en/">Premium Quality Stock Photos</a><!-- 2012080100540 ... -->
199 <div class="sponsor">
200 <a rel="follow" title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 2012070100250 ... -->
202 <div class="sponsor">
203 <a rel="follow" title="Sponsor: Managed Server" href="http://www.robhost.de">Managed Server</a><!-- 201210010720 klikics... -->
205 <div class="sponsor">
206 <a rel="follow" title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
208 <div class="sponsor">
209 <a rel="follow" title="Sponsor: Kaffeemaschinen reparatur" href="http://www.kaffeemaschinen-reparatur.de">Kaffeemaschinen reparatur</a><!-- 2012080100030 Temurbas atlas-multimedia-->
211 <div class="sponsor">
212 <a rel="follow" title="Sponsor: Fototapete - Tapetendruck" href="http://www.druck-expert.com/Fototapete-Tapetendruck,category,8830.html">Fototapete - Tapetendruck</a><!-- 2012100100155 info@druck-->
218 <div class="eastbar">
\r
219 <div class="g-plusone" id="gplusone"></div>
\r
220 <script type="text/javascript">
\r
226 var po = document.createElement('script');
\r
227 po.type = 'text/javascript'; po.async = true;
\r
228 po.src = 'https://apis.google.com/js/plusone.js';
\r
229 var script = document.getElementsByTagName('script')[0];
\r
230 script.parentNode.insertBefore(po, script);
\r
232 var gplusone = document.getElementById("gplusone");
\r
233 gplusone.setAttribute("data-size","medium");
\r
234 gplusone.setAttribute("data-count","false");
\r
240 <h1>MagickWand C API</h1>
242 <div class="doc-section">
243 <p>The <a href="http://www.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>
246 <li><a href="../www/api/magick-wand.html">Magick Wand Methods</a></li>
247 <li><a href="../www/api/magick-property.html">Set or Get Magick Wand Properties</a></li>
248 <li><a href="../www/api/magick-image.html">Magick Wand Image Methods</a></li>
249 <li><a href="../www/api/pixel-iterator.html">Pixel Iterator Methods</a></li>
250 <li><a href="../www/api/pixel-wand.html">Pixel Wand Methods</a></li>
251 <li><a href="../www/api/drawing-wand.html">Image Vector Drawing</a></li>
252 <li><a href="../www/api/mogrify.html">Command-line Interface</a></li>
253 <li><a href="../www/api/wand-view.html">Wand View Methods</a></li>
254 <li><a href="../www/api/magick-deprecate.html">Deprecated Methods</a></li>
255 <li><a href="exception.html">Error and Warning Codes</a></li>
258 <p>After you write your MagickWand program, compile it like this:</p>
260 <p class='crt'><span class="crtprompt"> $ </span><span class='crtin'>cc -o wand `pkg-config --cflags --libs MagickWand` wand.c</span></p>
261 <p>Set the <kbd>PKG_CONFIG_PATH</kbd> environment variable if ImageMagick is not in your default system path:</p>
262 <p class='crt'><span class="crtprompt"> $ </span><span class='crtin'>export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig</span></p>
263 <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>
265 <div class="viewport">
266 #include <stdio.h>
267 #include <stdlib.h>
268 #include <wand/MagickWand.h>
270 int main(int argc,char **argv)
272 #define ThrowWandException(wand) \
280 description=MagickGetException(wand,&severity); \
281 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
282 description=(char *) MagickRelinquishMemory(description); \
294 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
301 magick_wand=NewMagickWand();
302 status=MagickReadImage(magick_wand,argv[1]);
303 if (status == MagickFalse)
304 ThrowWandException(magick_wand);
306 Turn the images into a thumbnail sequence.
308 MagickResetIterator(magick_wand);
309 while (MagickNextImage(magick_wand) != MagickFalse)
310 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
312 Write the image then destroy it.
314 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
315 if (status == MagickFalse)
316 ThrowWandException(magick_wand);
317 magick_wand=DestroyMagickWand(magick_wand);
318 MagickWandTerminus();
323 <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>
325 <div class="viewport">
326 #include <stdio.h>
327 #include <stdlib.h>
329 #include <wand/MagickWand.h>
331 int main(int argc,char **argv)
333 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
334 #define SigmoidalContrast(x) \
335 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
336 #define ThrowWandException(wand) \
344 description=MagickGetException(wand,&severity); \
345 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
346 description=(char *) MagickRelinquishMemory(description); \
379 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
386 image_wand=NewMagickWand();
387 status=MagickReadImage(image_wand,argv[1]);
388 if (status == MagickFalse)
389 ThrowWandException(image_wand);
390 contrast_wand=CloneMagickWand(image_wand);
392 Sigmoidal non-linearity contrast control.
394 iterator=NewPixelIterator(image_wand);
395 contrast_iterator=NewPixelIterator(contrast_wand);
396 if ((iterator == (PixelIterator *) NULL) ||
397 (contrast_iterator == (PixelIterator *) NULL))
398 ThrowWandException(image_wand);
399 for (y=0; y < (long) MagickGetImageHeight(image_wand); y++)
401 pixels=PixelGetNextIteratorRow(iterator,&width);
402 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
403 if ((pixels == (PixelWand **) NULL) ||
404 (contrast_pixels == (PixelWand **) NULL))
406 for (x=0; x < (long) width; x++)
408 PixelGetMagickColor(pixels[x],&pixel);
409 pixel.red=SigmoidalContrast(pixel.red);
410 pixel.green=SigmoidalContrast(pixel.green);
411 pixel.blue=SigmoidalContrast(pixel.blue);
412 pixel.index=SigmoidalContrast(pixel.index);
413 PixelSetMagickColor(contrast_pixels[x],&pixel);
415 (void) PixelSyncIterator(contrast_iterator);
417 if (y < (long) MagickGetImageHeight(image_wand))
418 ThrowWandException(image_wand);
419 contrast_iterator=DestroyPixelIterator(contrast_iterator);
420 iterator=DestroyPixelIterator(iterator);
421 image_wand=DestroyMagickWand(image_wand);
423 Write the image then destroy it.
425 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
426 if (status == MagickFalse)
427 ThrowWandException(image_wand);
428 contrast_wand=DestroyMagickWand(contrast_wand);
429 MagickWandTerminus();
433 <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="../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>
435 <div class="viewport">
436 #include <stdio.h>
437 #include <stdlib.h>
439 #include <wand/MagickWand.h>
441 static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
442 const ssize_t y,const int id,void *context)
444 #define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
445 #define SigmoidalContrast(x) \
446 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
460 extent=GetWandViewExtent(contrast_view);
461 pixels=GetWandViewPixels(contrast_view);
462 for (x=0; x < (long) (extent.width-extent.height); x++)
464 PixelGetMagickColor(pixels[x],&pixel);
465 pixel.red=SigmoidalContrast(pixel.red);
466 pixel.green=SigmoidalContrast(pixel.green);
467 pixel.blue=SigmoidalContrast(pixel.blue);
468 pixel.index=SigmoidalContrast(pixel.index);
469 PixelSetMagickColor(contrast_pixels[x],&pixel);
474 int main(int argc,char **argv)
476 #define ThrowViewException(view) \
478 description=GetWandViewException(view,&severity); \
479 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
480 description=(char *) MagickRelinquishMemory(description); \
483 #define ThrowWandException(wand) \
485 description=MagickGetException(wand,&severity); \
486 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
487 description=(char *) MagickRelinquishMemory(description); \
511 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
518 contrast_wand=NewMagickWand();
519 status=MagickReadImage(contrast_wand,argv[1]);
520 if (status == MagickFalse)
521 ThrowWandException(contrast_wand);
523 Sigmoidal non-linearity contrast control.
525 contrast_view=NewWandView(contrast_wand);
526 if (contrast_view == (WandView *) NULL)
527 ThrowWandException(contrast_wand);
528 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
529 if (status == MagickFalse)
530 ThrowWandException(contrast_wand);
531 contrast_view=DestroyWandView(contrast_view);
533 Write the image then destroy it.
535 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
536 if (status == MagickFalse)
537 ThrowWandException(contrast_wand);
538 contrast_wand=DestroyMagickWand(contrast_wand);
539 MagickWandTerminus();
543 <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>
549 <span id="linkbar-west"> </span>
\r
550 <span id="linkbar-center">
\r
551 <a href="../discourse-server">Discourse Server</a> •
\r
552 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
\r
554 <span id="linkbar-east"> </span>
\r
556 <div class="footer">
\r
557 <span id="footer-west">© 1999-2012 ImageMagick Studio LLC</span>
\r
558 <span id="footer-east"> <a href="contact.html">Contact the Wizards</a></span>
\r
560 <div style="clear: both; margin: 0; width: 100%; "></div>
\r
561 <script type="text/javascript">
\r
562 var _gaq = _gaq || [];
\r
563 _gaq.push(['_setAccount', 'UA-17690367-1']);
\r
564 _gaq.push(['_trackPageview']);
\r
567 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
\r
568 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
\r
569 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
\r