blob: fcadd187ba9cc6e7dc734ebd60a5903e10d7f119 [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"/>
cristy1efc1ab2011-08-01 14:47:02 +000011 <meta name="google-site-verification" content="MxsMq6bdLOx0KSuz1MY6yG9ZTIJ7_7DVRfl5NCAT5Yg"/>
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"/>
cristy29c5c992011-06-25 13:58:49 +000031 <link rel="canonical" href="http://www.imagemagick.org" />
cristy3c98a4f2010-08-13 20:09:41 +000032 <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
cristy7a40ba82011-01-08 20:31:18 +000033 <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
cristy1efc1ab2011-08-01 14:47:02 +000034 <link rel="stylesheet" type="text/css" href="http://www.imagemagick.org/fancybox/jquery.fancybox-1.3.4.css" media="screen" />
cristy3c98a4f2010-08-13 20:09:41 +000035 <style type="text/css" media="all">
36 @import url("../www/magick.css");
37 </style>
cristy29c5c992011-06-25 13:58:49 +000038 <script type="text/javascript" src="https://apis.google.com/js/plusone.js"></script>
cristy1efc1ab2011-08-01 14:47:02 +000039 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
40 <script type="text/javascript" src="http://www.imagemagick.org/fancybox/jquery.fancybox-1.3.4.pack.js"></script>
cristy361f4662010-12-31 23:02:52 +000041 <script type="text/javascript">
42 $(document).ready(function() {
43 $("a[href$=.jpg],a[href$=.png],a[href$=.gif]").fancybox({
44 'transitionIn' : 'elastic',
45 'transitionOut' : 'elastic',
46 'overlayShow' : false,
47 'opacity' : true
48 });
49 });
50 </script>
cristy3eaa0ef2010-03-06 20:35:26 +000051</head>
52
53<body id="www-imagemagick-org">
54<div class="titlebar">
cristyb52981c2011-03-19 17:09:31 +000055<div style="margin: 17px auto; float: left;">
56 <script type="text/javascript">
57 <!--
58 google_ad_client = "pub-3129977114552745";
59 google_ad_slot = "5439289906";
60 google_ad_width = 728;
61 google_ad_height = 90;
62 //-->
63 </script>
64 <script type="text/javascript"
65 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
66 </script>
67</div>
cristy3eaa0ef2010-03-06 20:35:26 +000068<a href="http://www.imagemagick.org/discourse-server/">
cristyaf8d6652011-02-04 21:57:45 +000069 <img src="../images/logo.jpg"
70 alt="ImageMagick Logo"
cristy178edaf2011-01-23 03:42:39 +000071 style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
cristy3eaa0ef2010-03-06 20:35:26 +000072<a href="../index.html">
cristyaf8d6652011-02-04 21:57:45 +000073 <img src="../images/sprite.jpg"
74 alt="ImageMagick Sprite"
cristy3eaa0ef2010-03-06 20:35:26 +000075 style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
76</div>
77
cristyce69bb02010-07-27 19:49:46 +000078<div class="westbar">
cristy3eaa0ef2010-03-06 20:35:26 +000079
cristy3ed852e2009-09-05 21:47:34 +000080<div class="menu">
cristy83a272e2010-05-07 20:40:35 +000081 <a title="About ImageMagick" href="../index.html">About ImageMagick</a>
cristy3ed852e2009-09-05 21:47:34 +000082</div>
cristy3ed852e2009-09-05 21:47:34 +000083<div class="menu">
cristybb503372010-05-27 20:51:26 +000084 <a title="Binary Releases" href="../www/binary-releases.html">Binary Releases</a>
85</div>
86<div class="sub">
87 <a title="Binary Release: Unix" href="../www/binary-releases.html#unix">Unix</a>
88</div>
89<div class="sub">
90 <a title="Binary Release: MacOS X" href="../www/binary-releases.html#macosx">Mac OS X</a>
91</div>
92<div class="sub">
cristye6e84152011-06-06 14:16:49 +000093 <a title="Binary Release: iOS" href="../www/binary-releases.html#iOS">iOS</a>
cristyda16f162011-02-19 23:52:17 +000094</div>
95<div class="sub">
cristybb503372010-05-27 20:51:26 +000096 <a title="Binary Release: Windows" href="../www/binary-releases.html#windows">Windows</a>
97</div>
98<div class="sep"></div>
99<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000100 <a title="Command-line Tools" href="../www/command-line-tools.html">Command-line Tools</a>
cristy3ed852e2009-09-05 21:47:34 +0000101</div>
102<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000103 <a title="Command-line Tools: Processing" href="../www/command-line-processing.html">Processing</a>
cristy3ed852e2009-09-05 21:47:34 +0000104</div>
105<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000106 <a title="Command-line Tools: Options" href="../www/command-line-options.html">Options</a>
cristy3ed852e2009-09-05 21:47:34 +0000107</div>
108<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000109 <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
cristy3ed852e2009-09-05 21:47:34 +0000110</div>
111<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000112 <a title="Program Interfaces" href="../www/api.html">Program Interfaces</a>
cristy3ed852e2009-09-05 21:47:34 +0000113</div>
114<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000115 <a title="Program Interface: MagickWand" href="../www/magick-wand.html">MagickWand</a>
cristy3ed852e2009-09-05 21:47:34 +0000116</div>
117<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000118 <a title="Program Interface: MagickCore" href="../www/magick-core.html">MagickCore</a>
cristy3ed852e2009-09-05 21:47:34 +0000119</div>
120<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000121 <a title="Program Interface: PerlMagick" href="../www/perl-magick.html">PerlMagick</a>
cristy3ed852e2009-09-05 21:47:34 +0000122</div>
123<div class="sub">
cristydcca3fa2010-12-29 21:50:07 +0000124 <a title="Program Interface: Magick++" href="../www/magick++.html">Magick++</a>
cristy3ed852e2009-09-05 21:47:34 +0000125</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000126<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000127<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000128 <a title="Install from Source" href="../www/install-source.html">Install from Source</a>
cristy3ed852e2009-09-05 21:47:34 +0000129</div>
130<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000131 <a title="Install from Source: Unix" href="../www/install-source.html#unix">Unix</a>
cristy3ed852e2009-09-05 21:47:34 +0000132</div>
133<div class="sub">
cristy83a272e2010-05-07 20:40:35 +0000134 <a title="Install from Source: Windows" href="../www/install-source.html#windows">Windows</a>
cristy3ed852e2009-09-05 21:47:34 +0000135 </div>
136<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000137 <a title="Resources" href="../www/resources.html">Resources</a>
cristy3ed852e2009-09-05 21:47:34 +0000138</div>
cristybb503372010-05-27 20:51:26 +0000139<div class="menu">
140 <a title="Architecture" href="../www/architecture.html">Architecture</a>
141</div>
cristy3ed852e2009-09-05 21:47:34 +0000142<div class="menu">
cristy83a272e2010-05-07 20:40:35 +0000143 <a title="Download" href="../www/download.html">Download</a>
cristy3ed852e2009-09-05 21:47:34 +0000144</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000145<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000146<div class="menu">
cristy52923442011-01-15 22:54:31 +0000147 <a title="Search" href="../www/search.html">Search</a>
cristy3ed852e2009-09-05 21:47:34 +0000148</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000149<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000150<div class="menu">
cristyffb69ed2010-12-25 00:06:48 +0000151 <a title="Site Map" href="../www/sitemap.html">Site Map</a>
cristy3ed852e2009-09-05 21:47:34 +0000152</div>
153<div class="sub">
cristyffb69ed2010-12-25 00:06:48 +0000154 <a title="Site Map: Links" href="../www/links.html">Links</a>
cristy3ed852e2009-09-05 21:47:34 +0000155</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000156<div class="sep"></div>
cristy3ed852e2009-09-05 21:47:34 +0000157<div class="menu">
cristy10549a12011-05-15 19:04:46 +0000158 <a rel="follow" title="Sponsors" href="../www/sponsors.html">Sponsors:</a>
cristy3ed852e2009-09-05 21:47:34 +0000159
cristyb52981c2011-03-19 17:09:31 +0000160<a href="http://www.networkredux.com">
161 <img src="../images/networkredux.png" alt="[sponsor]"
162 style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a>
cristy3ed852e2009-09-05 21:47:34 +0000163<div class="sponsbox">
cristy178edaf2011-01-23 03:42:39 +0000164<div class="sponsor">
cristy81492d62011-06-07 16:41:42 +0000165 <a rel="follow" title="Sponsor: Web Hosting" href="http://www.micfo.com">Web Hosting</a><!-- 209901010090s golestan -->
166</div>
167<div class="sponsor">
cristy1efc1ab2011-08-01 14:47:02 +0000168 <a rel="follow" title="Sponsor: Autos part" href="http://www.pkwteile.de/autoteile">Autos part</a><!-- 201112010090s jr@pkwte... -->
169</div>
170<div class="sponsor">
cristy84134182011-06-15 22:59:00 +0000171 <a rel="follow" title="Sponsor: Search engine optimisation" href="http://www.seomoves.com.au">Search engine optimisation</a><!-- 201110010090s jen@seo lowprofilelinks -->
172</div>
173<div class="sponsor">
cristy81492d62011-06-07 16:41:42 +0000174 <a rel="follow" title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
175</div>
176<div class="sponsor">
cristyba1758d2011-06-03 01:29:12 +0000177 <a rel="follow" title="Sponsor: Web Hosting Deals" href="http://www.webhostingdeals.org">Web Hosting Deals</a><!-- 201111010270 chee.hoa darin -->
178</div>
179<div class="sponsor">
180 <a rel="follow" title="Sponsor: Web Hosting Reviews" href="http://www.webhostingsecretrevealed.com">Web Hosting Secret Revealed</a><!-- 201204010540 iamchee jerry -->
181</div>
182<div class="sponsor">
cristy4bf6e232011-05-21 01:43:33 +0000183 <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 +0000184</div>
185<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000186 <a rel="follow" title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
cristy4c54bbb2011-03-17 13:53:13 +0000187</div>
188<div class="sponsor">
cristy575d5ee2011-05-24 01:59:01 +0000189 <a rel="follow" title="Sponsor: Website Hosting" href="http://www.hostreviewgeeks.com">Website Hosting</a><!-- 201110010090 alexanian media -->
cristy4bf6e232011-05-21 01:43:33 +0000190</div>
191<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000192 <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 +0000193</div>
194<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000195 <a rel="follow" title="Sponsor: Best Web Hosting" href="http://webhostinggeeks.com">Best Web Hosting</a><!-- 201110010720 -->
cristy7d52cd62010-10-01 17:26:59 +0000196</div>
197<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000198 <a rel="follow" title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
cristyee742642011-02-26 02:49:59 +0000199</div>
200<div class="sponsor">
cristy10549a12011-05-15 19:04:46 +0000201 <a rel="follow" title="Sponsor: Web Hosting Ratings" href="http://webhostingrating.com">Web Hosting Ratings</a><!-- 201110010720 -->
cristybaacd172011-04-30 23:11:03 +0000202</div>
203<div class="sponsor">
cristy1efc1ab2011-08-01 14:47:02 +0000204 <a rel="follow" title="Sponsor: Notebook Reparatur" href="http://www.atlasmultimedia.de">Notebook Reparatur</a><!-- 2011100100025 atlas.multimedia-->
cristyec6b4752011-01-08 03:16:23 +0000205</div>
cristy3ed852e2009-09-05 21:47:34 +0000206</div>
207</div>
cristyce69bb02010-07-27 19:49:46 +0000208</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000209
cristyce69bb02010-07-27 19:49:46 +0000210<div class="eastbar">
cristy29c5c992011-06-25 13:58:49 +0000211 <div class="g-plusone" data-size="standard" data-count="false"></div>
212</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000213
214<div class="main">
215
cristydcca3fa2010-12-29 21:50:07 +0000216<h1>MagickWand C API</h1>
cristy3ed852e2009-09-05 21:47:34 +0000217
cristydcca3fa2010-12-29 21:50:07 +0000218<div class="doc-section">
cristy3ed852e2009-09-05 21:47:34 +0000219<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>
220
221<ul>
222 <li><a href="../www/api/magick-wand.html">Magick Wand Methods</a></li>
223 <li><a href="../www/api/magick-property.html">Set or Get Magick Wand Properties</a></li>
224 <li><a href="../www/api/magick-image.html">Magick Wand Image Methods</a></li>
225 <li><a href="../www/api/pixel-iterator.html">Pixel Iterator Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000226 <li><a href="../www/api/pixel-wand.html">Pixel Wand Methods</a></li>
227 <li><a href="../www/api/drawing-wand.html">Image Vector Drawing</a></li>
cristy5063d812010-10-19 16:28:10 +0000228 <li><a href="../www/api/mogrify.html">Command-line Interface</a></li>
cristyd6dfc0d2010-06-27 19:30:49 +0000229 <li><a href="../www/api/wand-view.html">Wand View Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000230 <li><a href="../www/api/magick-deprecate.html">Deprecated Methods</a></li>
231 <li><a href="../www/exception.html">Error and Warning Codes</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000232</ul>
233
234<p>After you write your MagickWand program, compile it like this:</p>
235
cristyd4d64ed2010-08-22 22:19:33 +0000236<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 +0000237<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>
238
239<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000240#include &lt;stdio.h>
241#include &lt;stdlib.h>
242#include &lt;wand/MagickWand.h>
243
244int main(int argc,char **argv)
245{
246#define ThrowWandException(wand) \
247{ \
248 char \
249 *description; \
250 \
251 ExceptionType \
252 severity; \
253 \
254 description=MagickGetException(wand,&amp;severity); \
cristyacc04882011-05-04 23:03:43 +0000255 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
cristy3ed852e2009-09-05 21:47:34 +0000256 description=(char *) MagickRelinquishMemory(description); \
257 exit(-1); \
258}
259
260 MagickBooleanType
261 status;
262
263 MagickWand
264 *magick_wand;
265
266 if (argc != 3)
267 {
268 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
269 exit(0);
270 }
271 /*
272 Read an image.
273 */
274 MagickWandGenesis();
275 magick_wand=NewMagickWand();
276 status=MagickReadImage(magick_wand,argv[1]);
277 if (status == MagickFalse)
278 ThrowWandException(magick_wand);
279 /*
280 Turn the images into a thumbnail sequence.
281 */
282 MagickResetIterator(magick_wand);
283 while (MagickNextImage(magick_wand) != MagickFalse)
284 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
285 /*
286 Write the image then destroy it.
287 */
288 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
289 if (status == MagickFalse)
290 ThrowWandException(magick_wand);
291 magick_wand=DestroyMagickWand(magick_wand);
292 MagickWandTerminus();
293 return(0);
294}
cristy3ed852e2009-09-05 21:47:34 +0000295</div>
296
297<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>
298
299<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000300#include &lt;stdio.h>
301#include &lt;stdlib.h>
302#include &lt;math.h>
303#include &lt;wand/MagickWand.h>
304
305int main(int argc,char **argv)
306{
307#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
308#define SigmoidalContrast(x) \
309 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
310#define ThrowWandException(wand) \
311{ \
312 char \
313 *description; \
314 \
315 ExceptionType \
316 severity; \
317 \
318 description=MagickGetException(wand,&amp;severity); \
319 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
320 description=(char *) MagickRelinquishMemory(description); \
321 exit(-1); \
322}
323
324 long
325 y;
326
327 MagickBooleanType
328 status;
329
330 MagickPixelPacket
331 pixel;
332
333 MagickWand
334 *contrast_wand,
335 *image_wand;
336
337 PixelIterator
338 *contrast_iterator,
339 *iterator;
340
341 PixelWand
342 **contrast_pixels,
343 **pixels;
344
345 register long
346 x;
347
348 unsigned long
349 width;
350
351 if (argc != 3)
352 {
353 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
354 exit(0);
355 }
356 /*
357 Read an image.
358 */
359 MagickWandGenesis();
360 image_wand=NewMagickWand();
361 status=MagickReadImage(image_wand,argv[1]);
362 if (status == MagickFalse)
363 ThrowWandException(image_wand);
364 contrast_wand=CloneMagickWand(image_wand);
365 /*
366 Sigmoidal non-linearity contrast control.
367 */
368 iterator=NewPixelIterator(image_wand);
369 contrast_iterator=NewPixelIterator(contrast_wand);
370 if ((iterator == (PixelIterator *) NULL) ||
371 (contrast_iterator == (PixelIterator *) NULL))
372 ThrowWandException(image_wand);
373 for (y=0; y &lt; (long) MagickGetImageHeight(image_wand); y++)
374 {
375 pixels=PixelGetNextIteratorRow(iterator,&amp;width);
376 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&amp;width);
377 if ((pixels == (PixelWand **) NULL) ||
378 (contrast_pixels == (PixelWand **) NULL))
379 break;
380 for (x=0; x &lt; (long) width; x++)
381 {
382 PixelGetMagickColor(pixels[x],&amp;pixel);
383 pixel.red=SigmoidalContrast(pixel.red);
384 pixel.green=SigmoidalContrast(pixel.green);
385 pixel.blue=SigmoidalContrast(pixel.blue);
386 pixel.index=SigmoidalContrast(pixel.index);
387 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
388 }
389 (void) PixelSyncIterator(contrast_iterator);
390 }
391 if (y &lt; (long) MagickGetImageHeight(image_wand))
392 ThrowWandException(image_wand);
393 contrast_iterator=DestroyPixelIterator(contrast_iterator);
394 iterator=DestroyPixelIterator(iterator);
395 image_wand=DestroyMagickWand(image_wand);
396 /*
397 Write the image then destroy it.
398 */
399 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
400 if (status == MagickFalse)
401 ThrowWandException(image_wand);
402 contrast_wand=DestroyMagickWand(contrast_wand);
403 MagickWandTerminus();
404 return(0);
405}
cristy3ed852e2009-09-05 21:47:34 +0000406</div>
cristydcca3fa2010-12-29 21:50:07 +0000407<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 +0000408
409<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000410#include &lt;stdio.h>
411#include &lt;stdlib.h>
412#include &lt;math.h>
413#include &lt;wand/MagickWand.h>
414
cristy10c87152010-06-26 16:12:21 +0000415static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
cristyc3ebda22010-06-27 17:11:57 +0000416 const ssize_t y,const int id,void *context)
cristy3ed852e2009-09-05 21:47:34 +0000417{
418#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
419#define SigmoidalContrast(x) \
420 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
421
cristyc3ebda22010-06-27 17:11:57 +0000422 RectangleInfo
423 extent;
424
cristy3ed852e2009-09-05 21:47:34 +0000425 MagickPixelPacket
426 pixel;
427
428 PixelWand
429 **pixels;
430
431 register long
432 x;
433
cristyc3ebda22010-06-27 17:11:57 +0000434 extent=GetWandViewExtent(contrast_view);
cristy10c87152010-06-26 16:12:21 +0000435 pixels=GetWandViewPixels(contrast_view);
cristyc3ebda22010-06-27 17:11:57 +0000436 for (x=0; x &lt; (long) (extent.width-extent.height); x++)
cristy3ed852e2009-09-05 21:47:34 +0000437 {
438 PixelGetMagickColor(pixels[x],&amp;pixel);
439 pixel.red=SigmoidalContrast(pixel.red);
440 pixel.green=SigmoidalContrast(pixel.green);
441 pixel.blue=SigmoidalContrast(pixel.blue);
442 pixel.index=SigmoidalContrast(pixel.index);
443 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
444 }
445 return(MagickTrue);
446}
447
448int main(int argc,char **argv)
449{
cristyc3ebda22010-06-27 17:11:57 +0000450#define ThrowViewException(view) \
cristy3ed852e2009-09-05 21:47:34 +0000451{ \
cristydcca3fa2010-12-29 21:50:07 +0000452 description=GetWandViewException(view,&amp;severity); \
cristy3ed852e2009-09-05 21:47:34 +0000453 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
454 description=(char *) MagickRelinquishMemory(description); \
455 exit(-1); \
456}
cristyc3ebda22010-06-27 17:11:57 +0000457#define ThrowWandException(wand) \
458{ \
cristydcca3fa2010-12-29 21:50:07 +0000459 description=MagickGetException(wand,&amp;severity); \
cristyc3ebda22010-06-27 17:11:57 +0000460 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
461 description=(char *) MagickRelinquishMemory(description); \
462 exit(-1); \
463}
464
465 char
466 *description;
467
468 ExceptionType
469 severity;
cristy3ed852e2009-09-05 21:47:34 +0000470
471 MagickBooleanType
472 status;
473
474 MagickPixelPacket
475 pixel;
476
477 MagickWand
478 *contrast_wand;
479
cristy10c87152010-06-26 16:12:21 +0000480 WandView
cristy3ed852e2009-09-05 21:47:34 +0000481 *contrast_view;
482
483 if (argc != 3)
484 {
485 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
486 exit(0);
487 }
488 /*
489 Read an image.
490 */
491 MagickWandGenesis();
492 contrast_wand=NewMagickWand();
493 status=MagickReadImage(contrast_wand,argv[1]);
494 if (status == MagickFalse)
495 ThrowWandException(contrast_wand);
496 /*
497 Sigmoidal non-linearity contrast control.
498 */
cristy10c87152010-06-26 16:12:21 +0000499 contrast_view=NewWandView(contrast_wand);
500 if (contrast_view == (WandView *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000501 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000502 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
cristy3ed852e2009-09-05 21:47:34 +0000503 if (status == MagickFalse)
504 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000505 contrast_view=DestroyWandView(contrast_view);
cristy3ed852e2009-09-05 21:47:34 +0000506 /*
507 Write the image then destroy it.
508 */
509 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
510 if (status == MagickFalse)
511 ThrowWandException(contrast_wand);
512 contrast_wand=DestroyMagickWand(contrast_wand);
513 MagickWandTerminus();
514 return(0);
515}
cristy3ed852e2009-09-05 21:47:34 +0000516</div>
cristydcca3fa2010-12-29 21:50:07 +0000517</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000518
519</div>
520
521<div id="linkbar">
cristyce69bb02010-07-27 19:49:46 +0000522 <span id="linkbar-west">&nbsp;</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000523 <span id="linkbar-center">
524 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristya8902942010-07-30 00:49:52 +0000525 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000526 </span>
527 <span id="linkbar-east">&nbsp;</span>
528 </div>
529 <div class="footer">
cristy7e41fe82010-12-04 23:12:08 +0000530 <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000531 <span id="footer-east"> <a href="http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
532 </div>
533 <div style="clear: both; margin: 0; width: 100%; "></div>
cristya8902942010-07-30 00:49:52 +0000534 <script type="text/javascript">
535 var _gaq = _gaq || [];
536 _gaq.push(['_setAccount', 'UA-17690367-1']);
537 _gaq.push(['_trackPageview']);
538
539 (function() {
540 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
541 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
542 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
543 })();
544 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000545</body>
546</html>