blob: 53f12e1eb43b800b1a993c399ad19444f7e0713a [file] [log] [blame]
cristy3eaa0ef2010-03-06 20:35:26 +00001
cristydcca3fa2010-12-29 21:50:07 +00002<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
cristy2bd2a982011-02-15 00:52:58 +00004<html version="-//W3C//DTD XHTML 1.1//EN"
5 xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
6 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
7 xsi:schemaLocation="http://www.w3.org/1999/xhtml
8 http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
cristy3eaa0ef2010-03-06 20:35:26 +00009<head>
cristy3c98a4f2010-08-13 20:09:41 +000010 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
11 <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U="/>
cristyffb69ed2010-12-25 00:06:48 +000012 <title>ImageMagick: MagickWand, C API for ImageMagick</title>
cristy3ed852e2009-09-05 21:47:34 +000013 <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"/>
cristy3c98a4f2010-08-13 20:09:41 +000016 <meta name="Application-name" content="ImageMagick"/>
cristye6e84152011-06-06 14:16:49 +000017 <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."/>
cristy3c98a4f2010-08-13 20:09:41 +000018 <meta name="Application-url" content="http://www.imagemagick.org"/>
cristy3ed852e2009-09-05 21:47:34 +000019 <meta name="Generator" content="PHP"/>
cristye6e84152011-06-06 14:16:49 +000020 <meta name="Keywords" content="magickwc, api, for, imagemagick, ImageMagick, ImageMagic, MagickCore, MagickWand, PerlMagick, Magick++, RMagick, PythonMagick, JMagick, TclMagick, Image, Magick, Magic, Wand, ImageMagickObject, Image, Processing, Automagically"/>
cristy3ed852e2009-09-05 21:47:34 +000021 <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"/>
cristy7e41fe82010-12-04 23:12:08 +000027 <meta name="Copyright" content="Copyright (c) 1999-2011 ImageMagick Studio LLC"/>
cristy3ed852e2009-09-05 21:47:34 +000028 <meta name="Distribution" content="Global"/>
cristydcca3fa2010-12-29 21:50:07 +000029 <link rel="icon" href="../images/wand.png"/>
cristy3c98a4f2010-08-13 20:09:41 +000030 <link rel="shortcut icon" href="../images/wand.ico" type="images/x-icon"/>
31 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
cristy7a40ba82011-01-08 20:31:18 +000032 <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
cristy3c98a4f2010-08-13 20:09:41 +000033 <style type="text/css" media="all">
34 @import url("../www/magick.css");
35 </style>
cristydcca3fa2010-12-29 21:50:07 +000036 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
cristy361f4662010-12-31 23:02:52 +000037 <script type="text/javascript" src="../fancybox/jquery.fancybox-1.3.4.pack.js"></script>
38 <link rel="stylesheet" type="text/css" href="../fancybox/jquery.fancybox-1.3.4.css" media="screen" />
39 <script type="text/javascript">
40 $(document).ready(function() {
41 $("a[href$=.jpg],a[href$=.png],a[href$=.gif]").fancybox({
42 'transitionIn' : 'elastic',
43 'transitionOut' : 'elastic',
44 'overlayShow' : false,
45 'opacity' : true
46 });
47 });
48 </script>
cristy3eaa0ef2010-03-06 20:35:26 +000049</head>
50
51<body id="www-imagemagick-org">
52<div class="titlebar">
cristyb52981c2011-03-19 17:09:31 +000053<div style="margin: 17px auto; float: left;">
54 <script type="text/javascript">
55 <!--
56 google_ad_client = "pub-3129977114552745";
57 google_ad_slot = "5439289906";
58 google_ad_width = 728;
59 google_ad_height = 90;
60 //-->
61 </script>
62 <script type="text/javascript"
63 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
64 </script>
65</div>
cristy3eaa0ef2010-03-06 20:35:26 +000066<a href="http://www.imagemagick.org/discourse-server/">
cristyaf8d6652011-02-04 21:57:45 +000067 <img src="../images/logo.jpg"
68 alt="ImageMagick Logo"
cristy178edaf2011-01-23 03:42:39 +000069 style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
cristy3eaa0ef2010-03-06 20:35:26 +000070<a href="../index.html">
cristyaf8d6652011-02-04 21:57:45 +000071 <img src="../images/sprite.jpg"
72 alt="ImageMagick Sprite"
cristy3eaa0ef2010-03-06 20:35:26 +000073 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
74</div>
75
cristyce69bb02010-07-27 19:49:46 +000076<div class="westbar">
cristy3eaa0ef2010-03-06 20:35:26 +000077
cristy3ed852e2009-09-05 21:47:34 +000078<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000079 <a title="About ImageMagick" href="../index.html">About ImageMagick</a>
cristy3ed852e2009-09-05 21:47:34 +000080</div>
cristy3eaa0ef2010-03-06 20:35:26 +000081<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +000082<div class="menu">
cristybb503372010-05-27 20:51:26 +000083 <a title="Binary Releases" href="../www/binary-releases.html">Binary Releases</a>
84</div>
85<div class="sub">
86 <a title="Binary Release: Unix" href="../www/binary-releases.html#unix">Unix</a>
87</div>
88<div class="sub">
89 <a title="Binary Release: MacOS X" href="../www/binary-releases.html#macosx">Mac OS X</a>
90</div>
91<div class="sub">
cristye6e84152011-06-06 14:16:49 +000092 <a title="Binary Release: iOS" href="../www/binary-releases.html#iOS">iOS</a>
cristyda16f162011-02-19 23:52:17 +000093</div>
94<div class="sub">
cristybb503372010-05-27 20:51:26 +000095 <a title="Binary Release: Windows" href="../www/binary-releases.html#windows">Windows</a>
96</div>
97<div class="sep"></div>
98<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000099 <a title="Command-line Tools" href="../www/command-line-tools.html">Command-line Tools</a>
cristy3ed852e2009-09-05 21:47:34 +0000100</div>
101<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000102 <a title="Command-line Tools: Processing" href="../www/command-line-processing.html">Processing</a>
cristy3ed852e2009-09-05 21:47:34 +0000103</div>
104<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000105 <a title="Command-line Tools: Options" href="../www/command-line-options.html">Options</a>
cristy3ed852e2009-09-05 21:47:34 +0000106</div>
107<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000108 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
cristy3ed852e2009-09-05 21:47:34 +0000109</div>
110<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000111 <a title="Program Interfaces" href="../www/api.html">Program Interfaces</a>
cristy3ed852e2009-09-05 21:47:34 +0000112</div>
113<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000114 <a title="Program Interface: MagickWand" href="../www/magick-wand.html">MagickWand</a>
cristy3ed852e2009-09-05 21:47:34 +0000115</div>
116<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000117 <a title="Program Interface: MagickCore" href="../www/magick-core.html">MagickCore</a>
cristy3ed852e2009-09-05 21:47:34 +0000118</div>
119<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000120 <a title="Program Interface: PerlMagick" href="../www/perl-magick.html">PerlMagick</a>
cristy3ed852e2009-09-05 21:47:34 +0000121</div>
122<div class="sub">
cristydcca3fa2010-12-29 21:50:07 +0000123 <a title="Program Interface: Magick++" href="../www/magick++.html">Magick++</a>
cristy3ed852e2009-09-05 21:47:34 +0000124</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000125<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000126<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000127 <a title="Install from Source" href="../www/install-source.html">Install from Source</a>
cristy3ed852e2009-09-05 21:47:34 +0000128</div>
129<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000130 <a title="Install from Source: Unix" href="../www/install-source.html#unix">Unix</a>
cristy3ed852e2009-09-05 21:47:34 +0000131</div>
132<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000133 <a title="Install from Source: Windows" href="../www/install-source.html#windows">Windows</a>
cristy3ed852e2009-09-05 21:47:34 +0000134 </div>
135<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000136 <a title="Resources" href="../www/resources.html">Resources</a>
cristy3ed852e2009-09-05 21:47:34 +0000137</div>
cristybb503372010-05-27 20:51:26 +0000138<div class="menu">
139 <a title="Architecture" href="../www/architecture.html">Architecture</a>
140</div>
cristy3ed852e2009-09-05 21:47:34 +0000141<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000142 <a title="Download" href="../www/download.html">Download</a>
cristy3ed852e2009-09-05 21:47:34 +0000143</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000144<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000145<div class="menu">
cristy52923442011-01-15 22:54:31 +0000146 <a title="Search" href="../www/search.html">Search</a>
cristy3ed852e2009-09-05 21:47:34 +0000147</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000148<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000149<div class="menu">
cristyffb69ed2010-12-25 00:06:48 +0000150 <a title="Site Map" href="../www/sitemap.html">Site Map</a>
cristy3ed852e2009-09-05 21:47:34 +0000151</div>
152<div class="sub">
cristyffb69ed2010-12-25 00:06:48 +0000153 <a title="Site Map: Links" href="../www/links.html">Links</a>
cristy3ed852e2009-09-05 21:47:34 +0000154</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000155<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000156<div class="menu">
cristy10549a12011-05-15 19:04:46 +0000157 <a rel="follow" title="Sponsors" href="../www/sponsors.html">Sponsors:</a>
cristy3ed852e2009-09-05 21:47:34 +0000158
cristyb52981c2011-03-19 17:09:31 +0000159<a href="http://www.networkredux.com">
160 <img src="../images/networkredux.png" alt="[sponsor]"
161 style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a>
cristy3ed852e2009-09-05 21:47:34 +0000162<div class="sponsbox">
cristy178edaf2011-01-23 03:42:39 +0000163<div class="sponsor">
cristy81492d62011-06-07 16:41:42 +0000164 <a rel="follow" title="Sponsor: Web Hosting" href="http://www.micfo.com">Web Hosting</a><!-- 209901010090s golestan -->
165</div>
166<div class="sponsor">
167 <a rel="follow" title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
168</div>
169<div class="sponsor">
cristyba1758d2011-06-03 01:29:12 +0000170 <a rel="follow" title="Sponsor: Web Hosting Deals" href="http://www.webhostingdeals.org">Web Hosting Deals</a><!-- 201111010270 chee.hoa darin -->
171</div>
172<div class="sponsor">
173 <a rel="follow" title="Sponsor: Web Hosting Reviews" href="http://www.webhostingsecretrevealed.com">Web Hosting Secret Revealed</a><!-- 201204010540 iamchee jerry -->
174</div>
175<div class="sponsor">
cristy4bf6e232011-05-21 01:43:33 +0000176 <a rel="follow" title="Sponsor: Web Hosting Break" href="http://www.webhostingbreak.com">Web Hosting Break</a><!-- 201109010090 ian@ian-m... -->
cristy45dbd322011-03-27 16:40:38 +0000177</div>
178<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000179 <a rel="follow" title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
cristy4c54bbb2011-03-17 13:53:13 +0000180</div>
181<div class="sponsor">
cristy575d5ee2011-05-24 01:59:01 +0000182 <a rel="follow" title="Sponsor: Website Hosting" href="http://www.hostreviewgeeks.com">Website Hosting</a><!-- 201110010090 alexanian media -->
cristy4bf6e232011-05-21 01:43:33 +0000183</div>
184<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000185 <a rel="follow" title="Sponsor: Hotel München" href="http://www.messehotel-erb-muenchen.de">Hotel München</a><!-- 201111010450 cerb -->
cristyaf8d6652011-02-04 21:57:45 +0000186</div>
187<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000188 <a rel="follow" title="Sponsor: Best Web Hosting" href="http://webhostinggeeks.com">Best Web Hosting</a><!-- 201110010720 -->
cristy7d52cd62010-10-01 17:26:59 +0000189</div>
190<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000191 <a rel="follow" title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
cristyee742642011-02-26 02:49:59 +0000192</div>
193<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000194 <a rel="follow" title="Sponsor: Web Hosting Reviews" href="http://www.webhostingmasters.com">Web Hosting Reviews</a><!-- 201107011500 affliatelabel -->
cristy851dbce2010-08-06 21:40:00 +0000195</div>
cristyec6b4752011-01-08 03:16:23 +0000196<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000197 <a rel="follow" title="Sponsor: Web Hosting Ratings" href="http://webhostingrating.com">Web Hosting Ratings</a><!-- 201110010720 -->
cristybaacd172011-04-30 23:11:03 +0000198</div>
199<div class="sponsor">
cristy2dcd6822011-06-13 16:21:20 +0000200 <a rel="follow" title="Sponsor: Free Catalogs" href="http://www.who-sells-it.com/">Free Catalogs</a><!-- 20120801000600 -->
cristyec6b4752011-01-08 03:16:23 +0000201</div>
cristy3ed852e2009-09-05 21:47:34 +0000202</div>
203</div>
cristyce69bb02010-07-27 19:49:46 +0000204</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000205
cristyce69bb02010-07-27 19:49:46 +0000206<div class="eastbar">
cristyb52981c2011-03-19 17:09:31 +0000207
cristy3eaa0ef2010-03-06 20:35:26 +0000208</div>
209
210<div class="main">
211
cristydcca3fa2010-12-29 21:50:07 +0000212<h1>MagickWand C API</h1>
cristy3ed852e2009-09-05 21:47:34 +0000213
cristydcca3fa2010-12-29 21:50:07 +0000214<div class="doc-section">
cristy3ed852e2009-09-05 21:47:34 +0000215<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>
216
217<ul>
218 <li><a href="../www/api/magick-wand.html">Magick Wand Methods</a></li>
219 <li><a href="../www/api/magick-property.html">Set or Get Magick Wand Properties</a></li>
220 <li><a href="../www/api/magick-image.html">Magick Wand Image Methods</a></li>
221 <li><a href="../www/api/pixel-iterator.html">Pixel Iterator Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000222 <li><a href="../www/api/pixel-wand.html">Pixel Wand Methods</a></li>
223 <li><a href="../www/api/drawing-wand.html">Image Vector Drawing</a></li>
cristy5063d812010-10-19 16:28:10 +0000224 <li><a href="../www/api/mogrify.html">Command-line Interface</a></li>
cristyd6dfc0d2010-06-27 19:30:49 +0000225 <li><a href="../www/api/wand-view.html">Wand View Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000226 <li><a href="../www/api/magick-deprecate.html">Deprecated Methods</a></li>
227 <li><a href="../www/exception.html">Error and Warning Codes</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000228</ul>
229
230<p>After you write your MagickWand program, compile it like this:</p>
231
cristyd4d64ed2010-08-22 22:19:33 +0000232<p class='crt'><span class="crtprompt"> $magick&gt; </span><span class='crtin'>cc `MagickWand-config --cflags --cppflags` -O2 -o wand wand.c \ <br/> `MagickWand-config --ldflags --libs`</span></p>
cristy3ed852e2009-09-05 21:47:34 +0000233<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>
234
235<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000236#include &lt;stdio.h>
237#include &lt;stdlib.h>
238#include &lt;wand/MagickWand.h>
239
240int main(int argc,char **argv)
241{
242#define ThrowWandException(wand) \
243{ \
244 char \
245 *description; \
246 \
247 ExceptionType \
248 severity; \
249 \
250 description=MagickGetException(wand,&amp;severity); \
cristyacc04882011-05-04 23:03:43 +0000251 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
cristy3ed852e2009-09-05 21:47:34 +0000252 description=(char *) MagickRelinquishMemory(description); \
253 exit(-1); \
254}
255
256 MagickBooleanType
257 status;
258
259 MagickWand
260 *magick_wand;
261
262 if (argc != 3)
263 {
264 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
265 exit(0);
266 }
267 /*
268 Read an image.
269 */
270 MagickWandGenesis();
271 magick_wand=NewMagickWand();
272 status=MagickReadImage(magick_wand,argv[1]);
273 if (status == MagickFalse)
274 ThrowWandException(magick_wand);
275 /*
276 Turn the images into a thumbnail sequence.
277 */
278 MagickResetIterator(magick_wand);
279 while (MagickNextImage(magick_wand) != MagickFalse)
280 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
281 /*
282 Write the image then destroy it.
283 */
284 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
285 if (status == MagickFalse)
286 ThrowWandException(magick_wand);
287 magick_wand=DestroyMagickWand(magick_wand);
288 MagickWandTerminus();
289 return(0);
290}
cristy3ed852e2009-09-05 21:47:34 +0000291</div>
292
293<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>
294
295<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000296#include &lt;stdio.h>
297#include &lt;stdlib.h>
298#include &lt;math.h>
299#include &lt;wand/MagickWand.h>
300
301int main(int argc,char **argv)
302{
303#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
304#define SigmoidalContrast(x) \
305 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
306#define ThrowWandException(wand) \
307{ \
308 char \
309 *description; \
310 \
311 ExceptionType \
312 severity; \
313 \
314 description=MagickGetException(wand,&amp;severity); \
315 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
316 description=(char *) MagickRelinquishMemory(description); \
317 exit(-1); \
318}
319
320 long
321 y;
322
323 MagickBooleanType
324 status;
325
326 MagickPixelPacket
327 pixel;
328
329 MagickWand
330 *contrast_wand,
331 *image_wand;
332
333 PixelIterator
334 *contrast_iterator,
335 *iterator;
336
337 PixelWand
338 **contrast_pixels,
339 **pixels;
340
341 register long
342 x;
343
344 unsigned long
345 width;
346
347 if (argc != 3)
348 {
349 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
350 exit(0);
351 }
352 /*
353 Read an image.
354 */
355 MagickWandGenesis();
356 image_wand=NewMagickWand();
357 status=MagickReadImage(image_wand,argv[1]);
358 if (status == MagickFalse)
359 ThrowWandException(image_wand);
360 contrast_wand=CloneMagickWand(image_wand);
361 /*
362 Sigmoidal non-linearity contrast control.
363 */
364 iterator=NewPixelIterator(image_wand);
365 contrast_iterator=NewPixelIterator(contrast_wand);
366 if ((iterator == (PixelIterator *) NULL) ||
367 (contrast_iterator == (PixelIterator *) NULL))
368 ThrowWandException(image_wand);
369 for (y=0; y &lt; (long) MagickGetImageHeight(image_wand); y++)
370 {
371 pixels=PixelGetNextIteratorRow(iterator,&amp;width);
372 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&amp;width);
373 if ((pixels == (PixelWand **) NULL) ||
374 (contrast_pixels == (PixelWand **) NULL))
375 break;
376 for (x=0; x &lt; (long) width; x++)
377 {
378 PixelGetMagickColor(pixels[x],&amp;pixel);
379 pixel.red=SigmoidalContrast(pixel.red);
380 pixel.green=SigmoidalContrast(pixel.green);
381 pixel.blue=SigmoidalContrast(pixel.blue);
382 pixel.index=SigmoidalContrast(pixel.index);
383 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
384 }
385 (void) PixelSyncIterator(contrast_iterator);
386 }
387 if (y &lt; (long) MagickGetImageHeight(image_wand))
388 ThrowWandException(image_wand);
389 contrast_iterator=DestroyPixelIterator(contrast_iterator);
390 iterator=DestroyPixelIterator(iterator);
391 image_wand=DestroyMagickWand(image_wand);
392 /*
393 Write the image then destroy it.
394 */
395 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
396 if (status == MagickFalse)
397 ThrowWandException(image_wand);
398 contrast_wand=DestroyMagickWand(contrast_wand);
399 MagickWandTerminus();
400 return(0);
401}
cristy3ed852e2009-09-05 21:47:34 +0000402</div>
cristydcca3fa2010-12-29 21:50:07 +0000403<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>
cristy3ed852e2009-09-05 21:47:34 +0000404
405<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000406#include &lt;stdio.h>
407#include &lt;stdlib.h>
408#include &lt;math.h>
409#include &lt;wand/MagickWand.h>
410
cristy10c87152010-06-26 16:12:21 +0000411static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
cristyc3ebda22010-06-27 17:11:57 +0000412 const ssize_t y,const int id,void *context)
cristy3ed852e2009-09-05 21:47:34 +0000413{
414#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
415#define SigmoidalContrast(x) \
416 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
417
cristyc3ebda22010-06-27 17:11:57 +0000418 RectangleInfo
419 extent;
420
cristy3ed852e2009-09-05 21:47:34 +0000421 MagickPixelPacket
422 pixel;
423
424 PixelWand
425 **pixels;
426
427 register long
428 x;
429
cristyc3ebda22010-06-27 17:11:57 +0000430 extent=GetWandViewExtent(contrast_view);
cristy10c87152010-06-26 16:12:21 +0000431 pixels=GetWandViewPixels(contrast_view);
cristyc3ebda22010-06-27 17:11:57 +0000432 for (x=0; x &lt; (long) (extent.width-extent.height); x++)
cristy3ed852e2009-09-05 21:47:34 +0000433 {
434 PixelGetMagickColor(pixels[x],&amp;pixel);
435 pixel.red=SigmoidalContrast(pixel.red);
436 pixel.green=SigmoidalContrast(pixel.green);
437 pixel.blue=SigmoidalContrast(pixel.blue);
438 pixel.index=SigmoidalContrast(pixel.index);
439 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
440 }
441 return(MagickTrue);
442}
443
444int main(int argc,char **argv)
445{
cristyc3ebda22010-06-27 17:11:57 +0000446#define ThrowViewException(view) \
cristy3ed852e2009-09-05 21:47:34 +0000447{ \
cristydcca3fa2010-12-29 21:50:07 +0000448 description=GetWandViewException(view,&amp;severity); \
cristy3ed852e2009-09-05 21:47:34 +0000449 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
450 description=(char *) MagickRelinquishMemory(description); \
451 exit(-1); \
452}
cristyc3ebda22010-06-27 17:11:57 +0000453#define ThrowWandException(wand) \
454{ \
cristydcca3fa2010-12-29 21:50:07 +0000455 description=MagickGetException(wand,&amp;severity); \
cristyc3ebda22010-06-27 17:11:57 +0000456 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
457 description=(char *) MagickRelinquishMemory(description); \
458 exit(-1); \
459}
460
461 char
462 *description;
463
464 ExceptionType
465 severity;
cristy3ed852e2009-09-05 21:47:34 +0000466
467 MagickBooleanType
468 status;
469
470 MagickPixelPacket
471 pixel;
472
473 MagickWand
474 *contrast_wand;
475
cristy10c87152010-06-26 16:12:21 +0000476 WandView
cristy3ed852e2009-09-05 21:47:34 +0000477 *contrast_view;
478
479 if (argc != 3)
480 {
481 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
482 exit(0);
483 }
484 /*
485 Read an image.
486 */
487 MagickWandGenesis();
488 contrast_wand=NewMagickWand();
489 status=MagickReadImage(contrast_wand,argv[1]);
490 if (status == MagickFalse)
491 ThrowWandException(contrast_wand);
492 /*
493 Sigmoidal non-linearity contrast control.
494 */
cristy10c87152010-06-26 16:12:21 +0000495 contrast_view=NewWandView(contrast_wand);
496 if (contrast_view == (WandView *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000497 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000498 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
cristy3ed852e2009-09-05 21:47:34 +0000499 if (status == MagickFalse)
500 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000501 contrast_view=DestroyWandView(contrast_view);
cristy3ed852e2009-09-05 21:47:34 +0000502 /*
503 Write the image then destroy it.
504 */
505 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
506 if (status == MagickFalse)
507 ThrowWandException(contrast_wand);
508 contrast_wand=DestroyMagickWand(contrast_wand);
509 MagickWandTerminus();
510 return(0);
511}
cristy3ed852e2009-09-05 21:47:34 +0000512</div>
cristydcca3fa2010-12-29 21:50:07 +0000513</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000514
515</div>
516
517<div id="linkbar">
cristyce69bb02010-07-27 19:49:46 +0000518 <span id="linkbar-west">&nbsp;</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000519 <span id="linkbar-center">
520 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristya8902942010-07-30 00:49:52 +0000521 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000522 </span>
523 <span id="linkbar-east">&nbsp;</span>
524 </div>
525 <div class="footer">
cristy7e41fe82010-12-04 23:12:08 +0000526 <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000527 <span id="footer-east"> <a href="http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
528 </div>
529 <div style="clear: both; margin: 0; width: 100%; "></div>
cristya8902942010-07-30 00:49:52 +0000530 <script type="text/javascript">
531 var _gaq = _gaq || [];
532 _gaq.push(['_setAccount', 'UA-17690367-1']);
533 _gaq.push(['_trackPageview']);
534
535 (function() {
536 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
537 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
538 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
539 })();
540 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000541</body>
542</html>