• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1
2
3
4
5<!doctype html>
6<html lang="en">
7<head>
8  <meta charset="utf-8"  />
9  <meta name="viewport" content="width=device-width, initial-scale=1"  />
10  <title>ImageMagick - MagickWand, C API</title>
11  <meta name="application-name" content="ImageMagick" />
12  <meta name="description" content="Use ImageMagick® to create, edit, compose, and convert digital images. Resize an image, crop it, change its shades and colors, add captions, and more." />
13  <meta name="application-url" content="https://imagemagick.org" />
14  <meta name="generator" content="PHP" />
15  <meta name="keywords" content="magickwc, api, image processing software" />
16  <meta name="rating" content="GENERAL" />
17  <meta name="robots" content="INDEX, FOLLOW" />
18  <meta name="generator" content="ImageMagick Studio LLC" />
19  <meta name="author" content="ImageMagick Studio LLC" />
20  <meta name="revisit-after" content="2 DAYS" />
21  <meta name="resource-type" content="document" />
22  <meta name="copyright" content="Copyright (c) 1999-2020 ImageMagick Studio LLC" />
23  <meta name="distribution" content="Global" />
24  <meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1" />
25  <meta property='og:url' content='../' />
26  <meta property='og:title' content='ImageMagick' />
27  <meta property='og:image' content='../images/logo.png' />
28  <meta property='og:type' content='website' />
29  <meta property='og:site_name' content='ImageMagick' />
30  <meta property='og:description' content="Create, Edit, Compose, or Convert Digital Images" />
31  <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
32  <link href="magick-wand.html" rel="canonical" />
33  <link href="../images/wand.png" rel="icon" />
34  <link href="../images/wand.ico" rel="shortcut icon" />
35  <link href="assets/magick.css" rel="stylesheet" />
36</head>
37<body>
38  <nav class="navbar navbar-expand-md navbar-dark bg-dark fixed-top">
39  <div class="container-fluid">
40    <a class="navbar-brand" href="../"><img class="d-block" id="icon" alt="ImageMagick" width="32" height="32" src="../images/wand.ico"/></a>
41    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#magick-navbars" aria-controls="magick-navbars" aria-expanded="false" aria-label="Toggle navigation">
42      <span class="navbar-toggler-icon"></span>
43    </button>
44
45    <div class="collapse navbar-collapse" id="magick-navbars">
46      <ul class="navbar-nav me-auto mb-2 mb-md-0">
47        <li class="nav-item">
48          <a class="nav-link " href="../www/index.html">Home</a>
49        </li>
50        <li class="nav-item">
51          <a class="nav-link " href="../www/download.html">Download</a>
52        </li>
53        <li class="nav-item">
54          <a class="nav-link " href="../www/command-line-tools.html">Tools</a>
55        </li>
56        <li class="nav-item">
57          <a class="nav-link " href="../www/command-line-processing.html">CLI</a>
58        </li>
59        <li class="nav-item">
60          <a class="nav-link " href="../www/develop.html">Develop</a>
61        </li>
62        <li class="nav-item">
63          <a class="nav-link" target="_blank" href="https://github.com/ImageMagick/ImageMagick/discussions">Community</a>
64        </li>
65        <li class="nav-item">
66          <iframe src="https://github.com/sponsors/ImageMagick/button" title="Sponsor ImageMagick" height="35" width="107" style="border: 0;"></iframe>
67        </li>
68      </ul>
69      <form class="d-flex form-inline" action="search.html">
70        <input class="form-control me-2" type="text" name="q" placeholder="Search" aria-label="Search">
71        <button class="btn btn-outline-success" type="submit" name="sa">Search</button>
72      </form>
73    </div>
74  </div>
75  </nav>
76
77  <div class="container">
78    <script async="async" src="https://localhost/pagead/js/adsbygoogle.js"></script>
79    <ins class="adsbygoogle"
80      style="display:block"
81      data-ad-client="ca-pub-3129977114552745"
82      data-ad-slot="6345125851"
83      data-full-width-responsive="true"
84      data-ad-format="horizontal"></ins>
85    <script>
86      (adsbygoogle = window.adsbygoogle || []).push({});
87    </script>
88
89  </div>
90
91  <main class="container">
92  <div class="magick-template">
93<div class="magick-header">
94<h1 class="text-center">MagickWand Image API for C</h1>
95<p class="lead magick-description">The <a href="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="api/MagickCore/index.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>
96
97<ul>
98  <li><a href="api/magick-wand.html">Magick Wand Methods</a></li>
99  <li><a href="api/magick-property.html">Set or Get Magick Wand Properties</a></li>
100  <li><a href="api/magick-image.html">Magick Wand Image Methods</a></li>
101  <li><a href="api/pixel-iterator.html">Pixel Iterator Methods</a></li>
102  <li><a href="api/pixel-wand.html">Pixel Wand Methods</a></li>
103  <li><a href="api/drawing-wand.html">Image Vector Drawing</a></li>
104  <li><a href="api/mogrify.html">Command-line Interface</a></li>
105  <li><a href="api/wand-view.html">Wand View Methods</a></li>
106  <li><a href="api/magick-deprecate.html">Deprecated Methods</a></li>
107  <li><a href="exception.html">Error and Warning Codes</a></li>
108</ul>
109
110<p>After you write your MagickWand program, compile it like this:</p>
111
112<ul><pre class="highlight"><code>cc -o wand wand.c `pkg-config --cflags --libs MagickWand`</code></pre></ul>
113
114<p>Set the <code>PKG_CONFIG_PATH</code> environment variable if ImageMagick is not in your default system path:</p>
115
116<ul><pre class="highlight"><code>export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig</code></pre></ul>
117
118<p>Here is a example program that utilizes the MagickWand API to get you started, <a href="https://imagemagick.org/source/wand.c">wand.c</a>. It reads an image, creates a thumbnail, and writes the result to disk.</p>
119
120<ul><pre class="pre-scrollable highlight"><code>#include &lt;stdio.h>
121#include &lt;stdlib.h>
122#include &lt;MagickWand/MagickWand.h>
123
124int main(int argc,char **argv)
125{
126#define ThrowWandException(wand) \
127{ \
128  char \
129    *description; \
130 \
131  ExceptionType \
132    severity; \
133 \
134  description=MagickGetException(wand,&amp;severity); \
135  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
136  description=(char *) MagickRelinquishMemory(description); \
137  exit(-1); \
138}
139
140  MagickBooleanType
141    status;
142
143  MagickWand
144    *magick_wand;
145
146  if (argc != 3)
147    {
148      (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
149      exit(0);
150    }
151  /*
152    Read an image.
153  */
154  MagickWandGenesis();
155  magick_wand=NewMagickWand();
156  status=MagickReadImage(magick_wand,argv[1]);
157  if (status == MagickFalse)
158    ThrowWandException(magick_wand);
159  /*
160    Turn the images into a thumbnail sequence.
161  */
162  MagickResetIterator(magick_wand);
163  while (MagickNextImage(magick_wand) != MagickFalse)
164    MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
165  /*
166    Write the image then destroy it.
167  */
168  status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
169  if (status == MagickFalse)
170    ThrowWandException(magick_wand);
171  magick_wand=DestroyMagickWand(magick_wand);
172  MagickWandTerminus();
173  return(0);
174}
175</code></pre></ul>
176
177<p>Here is another program that shows one way to get and set image pixels with the MagickWand API, <a href="https://imagemagick.org/source/contrast.c">contrast.c</a>. It reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk.</p>
178
179<ul><pre class="pre-scrollable highlight"><code>#include &lt;stdio.h>
180#include &lt;stdlib.h>
181#include &lt;math.h>
182#include &lt;MagickWand/MagickWand.h>
183
184int main(int argc,char **argv)
185{
186#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
187#define SigmoidalContrast(x) \
188  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
189#define ThrowWandException(wand) \
190{ \
191  char \
192    *description; \
193 \
194  ExceptionType \
195    severity; \
196 \
197  description=MagickGetException(wand,&amp;severity); \
198  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
199  description=(char *) MagickRelinquishMemory(description); \
200  exit(-1); \
201}
202
203  long
204    y;
205
206  MagickBooleanType
207    status;
208
209  MagickPixelPacket
210    pixel;
211
212  MagickWand
213    *contrast_wand,
214    *image_wand;
215
216  PixelIterator
217    *contrast_iterator,
218    *iterator;
219
220  PixelWand
221    **contrast_pixels,
222    **pixels;
223
224  register long
225    x;
226
227  unsigned long
228    width;
229
230  if (argc != 3)
231    {
232      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
233      exit(0);
234    }
235  /*
236    Read an image.
237  */
238  MagickWandGenesis();
239  image_wand=NewMagickWand();
240  status=MagickReadImage(image_wand,argv[1]);
241  if (status == MagickFalse)
242    ThrowWandException(image_wand);
243  contrast_wand=CloneMagickWand(image_wand);
244  /*
245    Sigmoidal non-linearity contrast control.
246  */
247  iterator=NewPixelIterator(image_wand);
248  contrast_iterator=NewPixelIterator(contrast_wand);
249  if ((iterator == (PixelIterator *) NULL) ||
250      (contrast_iterator == (PixelIterator *) NULL))
251    ThrowWandException(image_wand);
252  for (y=0; y &lt; (long) MagickGetImageHeight(image_wand); y++)
253  {
254    pixels=PixelGetNextIteratorRow(iterator,&amp;width);
255    contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&amp;width);
256    if ((pixels == (PixelWand **) NULL) ||
257        (contrast_pixels == (PixelWand **) NULL))
258      break;
259    for (x=0; x &lt; (long) width; x++)
260    {
261      PixelGetMagickColor(pixels[x],&amp;pixel);
262      pixel.red=SigmoidalContrast(pixel.red);
263      pixel.green=SigmoidalContrast(pixel.green);
264      pixel.blue=SigmoidalContrast(pixel.blue);
265      pixel.index=SigmoidalContrast(pixel.index);
266      PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
267    }
268    (void) PixelSyncIterator(contrast_iterator);
269  }
270  if (y &lt; (long) MagickGetImageHeight(image_wand))
271    ThrowWandException(image_wand);
272  contrast_iterator=DestroyPixelIterator(contrast_iterator);
273  iterator=DestroyPixelIterator(iterator);
274  image_wand=DestroyMagickWand(image_wand);
275  /*
276    Write the image then destroy it.
277  */
278  status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
279  if (status == MagickFalse)
280    ThrowWandException(image_wand);
281  contrast_wand=DestroyMagickWand(contrast_wand);
282  MagickWandTerminus();
283  return(0);
284}
285</code></pre></ul>
286<p><a class="anchor" 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="https://imagemagick.org/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>
287
288<ul><pre class="pre-scrollable highlight"><code>#include &lt;stdio.h>
289#include &lt;stdlib.h>
290#include &lt;math.h>
291#include &lt;MagickWand/MagickWand.h>
292
293static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
294  const ssize_t y,const int id,void *context)
295{
296#define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
297#define SigmoidalContrast(x) \
298  (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
299
300  RectangleInfo
301    extent;
302
303  MagickPixelPacket
304    pixel;
305
306  PixelWand
307    **pixels;
308
309  register long
310    x;
311
312  extent=GetWandViewExtent(contrast_view);
313  pixels=GetWandViewPixels(contrast_view);
314  for (x=0; x &lt; (long) (extent.width-extent.height); x++)
315  {
316    PixelGetMagickColor(pixels[x],&amp;pixel);
317    pixel.red=SigmoidalContrast(pixel.red);
318    pixel.green=SigmoidalContrast(pixel.green);
319    pixel.blue=SigmoidalContrast(pixel.blue);
320    pixel.index=SigmoidalContrast(pixel.index);
321    PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
322  }
323  return(MagickTrue);
324}
325
326int main(int argc,char **argv)
327{
328#define ThrowViewException(view) \
329{ \
330  description=GetWandViewException(view,&amp;severity); \
331  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
332  description=(char *) MagickRelinquishMemory(description); \
333  exit(-1); \
334}
335#define ThrowWandException(wand) \
336{ \
337  description=MagickGetException(wand,&amp;severity); \
338  (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
339  description=(char *) MagickRelinquishMemory(description); \
340  exit(-1); \
341}
342
343  char
344    *description;
345
346  ExceptionType
347    severity;
348
349  MagickBooleanType
350    status;
351
352  MagickPixelPacket
353    pixel;
354
355  MagickWand
356    *contrast_wand;
357
358  WandView
359    *contrast_view;
360
361  if (argc != 3)
362    {
363      (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
364      exit(0);
365    }
366  /*
367    Read an image.
368  */
369  MagickWandGenesis();
370  contrast_wand=NewMagickWand();
371  status=MagickReadImage(contrast_wand,argv[1]);
372  if (status == MagickFalse)
373    ThrowWandException(contrast_wand);
374  /*
375    Sigmoidal non-linearity contrast control.
376  */
377  contrast_view=NewWandView(contrast_wand);
378  if (contrast_view == (WandView *) NULL)
379    ThrowWandException(contrast_wand);
380  status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
381  if (status == MagickFalse)
382    ThrowWandException(contrast_wand);
383  contrast_view=DestroyWandView(contrast_view);
384  /*
385    Write the image then destroy it.
386  */
387  status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
388  if (status == MagickFalse)
389    ThrowWandException(contrast_wand);
390  contrast_wand=DestroyMagickWand(contrast_wand);
391  MagickWandTerminus();
392  return(0);
393}
394</code></pre></ul>
395<p><a href="../MagickWand/index.html">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>
396</div>
397  </div>
398  </main><!-- /.container -->
399  <footer class="magick-footer">
400    <div class="container-fluid">
401      <a href="../www/security-policy.html">Security</a> •
402      <a href="../www/news.html">News</a>
403
404      <a href="magick-wand.html#"><img class="d-inline" id="wand" alt="And Now a Touch of Magick" width="16" height="16" src="../images/wand.ico"/></a>
405
406      <a href="../www/links.html">Related</a> •
407      <a href="../www/sitemap.html">Sitemap</a>
408   <br/>
409     <a href="../www/support.html">Sponsor</a> •
410     <a href="../www/cite.html">Cite</a> •
411     <a href="http://pgp.mit.edu/pks/lookup?op=get&amp;search=0x89AB63D48277377A">Public Key</a> •
412     <a href="../www/https://imagemagick.org/script/contact.php">Contact Us</a>
413   <br/>
414     <a href="https://github.com/imagemagick/imagemagick" target="_blank" rel="noopener" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 499.36" width="2%" height="2%" role="img" focusable="false"><title>GitHub</title><path fill="currentColor" fill-rule="evenodd" d="M256 0C114.64 0 0 114.61 0 256c0 113.09 73.34 209 175.08 242.9 12.8 2.35 17.47-5.56 17.47-12.34 0-6.08-.22-22.18-.35-43.54-71.2 15.49-86.2-34.34-86.2-34.34-11.64-29.57-28.42-37.45-28.42-37.45-23.27-15.84 1.73-15.55 1.73-15.55 25.69 1.81 39.21 26.38 39.21 26.38 22.84 39.12 59.92 27.82 74.5 21.27 2.33-16.54 8.94-27.82 16.25-34.22-56.84-6.43-116.6-28.43-116.6-126.49 0-27.95 10-50.8 26.35-68.69-2.63-6.48-11.42-32.5 2.51-67.75 0 0 21.49-6.88 70.4 26.24a242.65 242.65 0 0 1 128.18 0c48.87-33.13 70.33-26.24 70.33-26.24 14 35.25 5.18 61.27 2.55 67.75 16.41 17.9 26.31 40.75 26.31 68.69 0 98.35-59.85 120-116.88 126.32 9.19 7.9 17.38 23.53 17.38 47.41 0 34.22-.31 61.83-.31 70.23 0 6.85 4.61 14.81 17.6 12.31C438.72 464.97 512 369.08 512 256.02 512 114.62 397.37 0 256 0z"/></svg></a> •
415     <a href="https://twitter.com/imagemagick" target="_blank" rel="noopener" aria-label="Twitter"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 416.32" width="2%" height="2%" role="img" focusable="false"><title>Twitter</title><path fill="currentColor" d="M160.83 416.32c193.2 0 298.92-160.22 298.92-298.92 0-4.51 0-9-.2-13.52A214 214 0 0 0 512 49.38a212.93 212.93 0 0 1-60.44 16.6 105.7 105.7 0 0 0 46.3-58.19 209 209 0 0 1-66.79 25.37 105.09 105.09 0 0 0-181.73 71.91 116.12 116.12 0 0 0 2.66 24c-87.28-4.3-164.73-46.3-216.56-109.82A105.48 105.48 0 0 0 68 159.6a106.27 106.27 0 0 1-47.53-13.11v1.43a105.28 105.28 0 0 0 84.21 103.06 105.67 105.67 0 0 1-47.33 1.84 105.06 105.06 0 0 0 98.14 72.94A210.72 210.72 0 0 1 25 370.84a202.17 202.17 0 0 1-25-1.43 298.85 298.85 0 0 0 160.83 46.92"/></svg></a>
416    <br/>
417    <small>© 1999-2021 ImageMagick Studio LLC</small>
418    </div>
419  </footer>
420
421  <!-- Javascript assets -->
422  <script src="assets/magick.js" ></script>
423  </body>
424</html>
425<!-- Magick Cache 13th February 2021 12:21 -->