blob: 99bdeaeb2fbaa838255fa64efb93ee4353468b2a [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"/>
cristyaf8d6652011-02-04 21:57:45 +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."/>
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"/>
20 <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"/>
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">
cristyda16f162011-02-19 23:52:17 +000092 <a title="Binary Release: iPhone" href="../www/binary-releases.html#iPhone">iPhone</a>
93</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">
cristy83a272e2010-05-07 20:40:35 +0000157 <a 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">
cristybaacd172011-04-30 23:11:03 +0000164 <a title="Sponsor: Website Hosting" href="http://www.hostreviewgeeks.com">Website Hosting</a><!-- 201109010090 alexanian media -->
cristy45dbd322011-03-27 16:40:38 +0000165</div>
166<div class="sponsor">
cristy4c54bbb2011-03-17 13:53:13 +0000167 <a title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
168</div>
169<div class="sponsor">
cristyf9a6c462011-04-24 14:01:11 +0000170 <a title="Sponsor: Hotel München" href="http://www.messehotel-erb-muenchen.de">Hotel München</a><!-- 201111010450 cerb -->
cristyaf8d6652011-02-04 21:57:45 +0000171</div>
172<div class="sponsor">
cristyee742642011-02-26 02:49:59 +0000173 <a title="Sponsor: Best Web Hosting" href="http://webhostinggeeks.com">Best Web Hosting</a><!-- 201110010720 -->
cristy7d52cd62010-10-01 17:26:59 +0000174</div>
175<div class="sponsor">
cristyf9a6c462011-04-24 14:01:11 +0000176 <a title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
cristyee742642011-02-26 02:49:59 +0000177</div>
178<div class="sponsor">
cristybaacd172011-04-30 23:11:03 +0000179 <a title="Sponsor: Web Hosting Reviews" href="http://www.webhostingmasters.com">Web Hosting Reviews</a><!-- 201107011500 affliatelabel -->
cristy851dbce2010-08-06 21:40:00 +0000180</div>
cristyec6b4752011-01-08 03:16:23 +0000181<div class="sponsor">
cristy178edaf2011-01-23 03:42:39 +0000182 <a title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
183</div>
184<div class="sponsor">
cristybaacd172011-04-30 23:11:03 +0000185 <a title="Sponsor: Web Hosting Ratings" href="http://webhostingrating.com">Web Hosting Ratings</a><!-- 201110010720 -->
186</div>
187<div class="sponsor">
188 <a title="Sponsor: Free Catalogs" href="http://www.who-sells-it.com/">Free Catalogs</a><!-- 20120801000600 -->
cristyec6b4752011-01-08 03:16:23 +0000189</div>
cristy3ed852e2009-09-05 21:47:34 +0000190</div>
191</div>
cristyce69bb02010-07-27 19:49:46 +0000192</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000193
cristyce69bb02010-07-27 19:49:46 +0000194<div class="eastbar">
cristyb52981c2011-03-19 17:09:31 +0000195
cristy3eaa0ef2010-03-06 20:35:26 +0000196</div>
197
198<div class="main">
199
cristydcca3fa2010-12-29 21:50:07 +0000200<h1>MagickWand C API</h1>
cristy3ed852e2009-09-05 21:47:34 +0000201
cristydcca3fa2010-12-29 21:50:07 +0000202<div class="doc-section">
cristy3ed852e2009-09-05 21:47:34 +0000203<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>
204
205<ul>
206 <li><a href="../www/api/magick-wand.html">Magick Wand Methods</a></li>
207 <li><a href="../www/api/magick-property.html">Set or Get Magick Wand Properties</a></li>
208 <li><a href="../www/api/magick-image.html">Magick Wand Image Methods</a></li>
209 <li><a href="../www/api/pixel-iterator.html">Pixel Iterator Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000210 <li><a href="../www/api/pixel-wand.html">Pixel Wand Methods</a></li>
211 <li><a href="../www/api/drawing-wand.html">Image Vector Drawing</a></li>
cristy5063d812010-10-19 16:28:10 +0000212 <li><a href="../www/api/mogrify.html">Command-line Interface</a></li>
cristyd6dfc0d2010-06-27 19:30:49 +0000213 <li><a href="../www/api/wand-view.html">Wand View Methods</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000214 <li><a href="../www/api/magick-deprecate.html">Deprecated Methods</a></li>
215 <li><a href="../www/exception.html">Error and Warning Codes</a></li>
cristy3ed852e2009-09-05 21:47:34 +0000216</ul>
217
218<p>After you write your MagickWand program, compile it like this:</p>
219
cristyd4d64ed2010-08-22 22:19:33 +0000220<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 +0000221<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>
222
223<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000224#include &lt;stdio.h>
225#include &lt;stdlib.h>
226#include &lt;wand/MagickWand.h>
227
228int main(int argc,char **argv)
229{
230#define ThrowWandException(wand) \
231{ \
232 char \
233 *description; \
234 \
235 ExceptionType \
236 severity; \
237 \
238 description=MagickGetException(wand,&amp;severity); \
cristyc3186d52010-06-04 13:55:23 +0000239 (void) fprintf(stderr,"%s %s %u %s\n",GetMagickModule(),description); \
cristy3ed852e2009-09-05 21:47:34 +0000240 description=(char *) MagickRelinquishMemory(description); \
241 exit(-1); \
242}
243
244 MagickBooleanType
245 status;
246
247 MagickWand
248 *magick_wand;
249
250 if (argc != 3)
251 {
252 (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
253 exit(0);
254 }
255 /*
256 Read an image.
257 */
258 MagickWandGenesis();
259 magick_wand=NewMagickWand();
260 status=MagickReadImage(magick_wand,argv[1]);
261 if (status == MagickFalse)
262 ThrowWandException(magick_wand);
263 /*
264 Turn the images into a thumbnail sequence.
265 */
266 MagickResetIterator(magick_wand);
267 while (MagickNextImage(magick_wand) != MagickFalse)
268 MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
269 /*
270 Write the image then destroy it.
271 */
272 status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
273 if (status == MagickFalse)
274 ThrowWandException(magick_wand);
275 magick_wand=DestroyMagickWand(magick_wand);
276 MagickWandTerminus();
277 return(0);
278}
cristy3ed852e2009-09-05 21:47:34 +0000279</div>
280
281<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>
282
283<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000284#include &lt;stdio.h>
285#include &lt;stdlib.h>
286#include &lt;math.h>
287#include &lt;wand/MagickWand.h>
288
289int main(int argc,char **argv)
290{
291#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
292#define SigmoidalContrast(x) \
293 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
294#define ThrowWandException(wand) \
295{ \
296 char \
297 *description; \
298 \
299 ExceptionType \
300 severity; \
301 \
302 description=MagickGetException(wand,&amp;severity); \
303 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
304 description=(char *) MagickRelinquishMemory(description); \
305 exit(-1); \
306}
307
308 long
309 y;
310
311 MagickBooleanType
312 status;
313
314 MagickPixelPacket
315 pixel;
316
317 MagickWand
318 *contrast_wand,
319 *image_wand;
320
321 PixelIterator
322 *contrast_iterator,
323 *iterator;
324
325 PixelWand
326 **contrast_pixels,
327 **pixels;
328
329 register long
330 x;
331
332 unsigned long
333 width;
334
335 if (argc != 3)
336 {
337 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
338 exit(0);
339 }
340 /*
341 Read an image.
342 */
343 MagickWandGenesis();
344 image_wand=NewMagickWand();
345 status=MagickReadImage(image_wand,argv[1]);
346 if (status == MagickFalse)
347 ThrowWandException(image_wand);
348 contrast_wand=CloneMagickWand(image_wand);
349 /*
350 Sigmoidal non-linearity contrast control.
351 */
352 iterator=NewPixelIterator(image_wand);
353 contrast_iterator=NewPixelIterator(contrast_wand);
354 if ((iterator == (PixelIterator *) NULL) ||
355 (contrast_iterator == (PixelIterator *) NULL))
356 ThrowWandException(image_wand);
357 for (y=0; y &lt; (long) MagickGetImageHeight(image_wand); y++)
358 {
359 pixels=PixelGetNextIteratorRow(iterator,&amp;width);
360 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&amp;width);
361 if ((pixels == (PixelWand **) NULL) ||
362 (contrast_pixels == (PixelWand **) NULL))
363 break;
364 for (x=0; x &lt; (long) width; x++)
365 {
366 PixelGetMagickColor(pixels[x],&amp;pixel);
367 pixel.red=SigmoidalContrast(pixel.red);
368 pixel.green=SigmoidalContrast(pixel.green);
369 pixel.blue=SigmoidalContrast(pixel.blue);
370 pixel.index=SigmoidalContrast(pixel.index);
371 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
372 }
373 (void) PixelSyncIterator(contrast_iterator);
374 }
375 if (y &lt; (long) MagickGetImageHeight(image_wand))
376 ThrowWandException(image_wand);
377 contrast_iterator=DestroyPixelIterator(contrast_iterator);
378 iterator=DestroyPixelIterator(iterator);
379 image_wand=DestroyMagickWand(image_wand);
380 /*
381 Write the image then destroy it.
382 */
383 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
384 if (status == MagickFalse)
385 ThrowWandException(image_wand);
386 contrast_wand=DestroyMagickWand(contrast_wand);
387 MagickWandTerminus();
388 return(0);
389}
cristy3ed852e2009-09-05 21:47:34 +0000390</div>
cristydcca3fa2010-12-29 21:50:07 +0000391<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 +0000392
393<div class="viewport">
cristy3ed852e2009-09-05 21:47:34 +0000394#include &lt;stdio.h>
395#include &lt;stdlib.h>
396#include &lt;math.h>
397#include &lt;wand/MagickWand.h>
398
cristy10c87152010-06-26 16:12:21 +0000399static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
cristyc3ebda22010-06-27 17:11:57 +0000400 const ssize_t y,const int id,void *context)
cristy3ed852e2009-09-05 21:47:34 +0000401{
402#define QuantumScale ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
403#define SigmoidalContrast(x) \
404 (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
405
cristyc3ebda22010-06-27 17:11:57 +0000406 RectangleInfo
407 extent;
408
cristy3ed852e2009-09-05 21:47:34 +0000409 MagickPixelPacket
410 pixel;
411
412 PixelWand
413 **pixels;
414
415 register long
416 x;
417
cristyc3ebda22010-06-27 17:11:57 +0000418 extent=GetWandViewExtent(contrast_view);
cristy10c87152010-06-26 16:12:21 +0000419 pixels=GetWandViewPixels(contrast_view);
cristyc3ebda22010-06-27 17:11:57 +0000420 for (x=0; x &lt; (long) (extent.width-extent.height); x++)
cristy3ed852e2009-09-05 21:47:34 +0000421 {
422 PixelGetMagickColor(pixels[x],&amp;pixel);
423 pixel.red=SigmoidalContrast(pixel.red);
424 pixel.green=SigmoidalContrast(pixel.green);
425 pixel.blue=SigmoidalContrast(pixel.blue);
426 pixel.index=SigmoidalContrast(pixel.index);
427 PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
428 }
429 return(MagickTrue);
430}
431
432int main(int argc,char **argv)
433{
cristyc3ebda22010-06-27 17:11:57 +0000434#define ThrowViewException(view) \
cristy3ed852e2009-09-05 21:47:34 +0000435{ \
cristydcca3fa2010-12-29 21:50:07 +0000436 description=GetWandViewException(view,&amp;severity); \
cristy3ed852e2009-09-05 21:47:34 +0000437 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
438 description=(char *) MagickRelinquishMemory(description); \
439 exit(-1); \
440}
cristyc3ebda22010-06-27 17:11:57 +0000441#define ThrowWandException(wand) \
442{ \
cristydcca3fa2010-12-29 21:50:07 +0000443 description=MagickGetException(wand,&amp;severity); \
cristyc3ebda22010-06-27 17:11:57 +0000444 (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
445 description=(char *) MagickRelinquishMemory(description); \
446 exit(-1); \
447}
448
449 char
450 *description;
451
452 ExceptionType
453 severity;
cristy3ed852e2009-09-05 21:47:34 +0000454
455 MagickBooleanType
456 status;
457
458 MagickPixelPacket
459 pixel;
460
461 MagickWand
462 *contrast_wand;
463
cristy10c87152010-06-26 16:12:21 +0000464 WandView
cristy3ed852e2009-09-05 21:47:34 +0000465 *contrast_view;
466
467 if (argc != 3)
468 {
469 (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
470 exit(0);
471 }
472 /*
473 Read an image.
474 */
475 MagickWandGenesis();
476 contrast_wand=NewMagickWand();
477 status=MagickReadImage(contrast_wand,argv[1]);
478 if (status == MagickFalse)
479 ThrowWandException(contrast_wand);
480 /*
481 Sigmoidal non-linearity contrast control.
482 */
cristy10c87152010-06-26 16:12:21 +0000483 contrast_view=NewWandView(contrast_wand);
484 if (contrast_view == (WandView *) NULL)
cristy3ed852e2009-09-05 21:47:34 +0000485 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000486 status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
cristy3ed852e2009-09-05 21:47:34 +0000487 if (status == MagickFalse)
488 ThrowWandException(contrast_wand);
cristy10c87152010-06-26 16:12:21 +0000489 contrast_view=DestroyWandView(contrast_view);
cristy3ed852e2009-09-05 21:47:34 +0000490 /*
491 Write the image then destroy it.
492 */
493 status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
494 if (status == MagickFalse)
495 ThrowWandException(contrast_wand);
496 contrast_wand=DestroyMagickWand(contrast_wand);
497 MagickWandTerminus();
498 return(0);
499}
cristy3ed852e2009-09-05 21:47:34 +0000500</div>
cristydcca3fa2010-12-29 21:50:07 +0000501</div>
cristy3eaa0ef2010-03-06 20:35:26 +0000502
503</div>
504
505<div id="linkbar">
cristyce69bb02010-07-27 19:49:46 +0000506 <span id="linkbar-west">&nbsp;</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000507 <span id="linkbar-center">
508 <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
cristya8902942010-07-30 00:49:52 +0000509 <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
cristy3eaa0ef2010-03-06 20:35:26 +0000510 </span>
511 <span id="linkbar-east">&nbsp;</span>
512 </div>
513 <div class="footer">
cristy7e41fe82010-12-04 23:12:08 +0000514 <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
cristy3eaa0ef2010-03-06 20:35:26 +0000515 <span id="footer-east"> <a href="http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
516 </div>
517 <div style="clear: both; margin: 0; width: 100%; "></div>
cristya8902942010-07-30 00:49:52 +0000518 <script type="text/javascript">
519 var _gaq = _gaq || [];
520 _gaq.push(['_setAccount', 'UA-17690367-1']);
521 _gaq.push(['_trackPageview']);
522
523 (function() {
524 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
525 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
526 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
527 })();
528 </script>
cristy3eaa0ef2010-03-06 20:35:26 +0000529</body>
530</html>