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 <stdio.h> 121#include <stdlib.h> 122#include <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,&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 <stdio.h> 180#include <stdlib.h> 181#include <math.h> 182#include <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,&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 < (long) MagickGetImageHeight(image_wand); y++) 253 { 254 pixels=PixelGetNextIteratorRow(iterator,&width); 255 contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width); 256 if ((pixels == (PixelWand **) NULL) || 257 (contrast_pixels == (PixelWand **) NULL)) 258 break; 259 for (x=0; x < (long) width; x++) 260 { 261 PixelGetMagickColor(pixels[x],&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],&pixel); 267 } 268 (void) PixelSyncIterator(contrast_iterator); 269 } 270 if (y < (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 <stdio.h> 289#include <stdlib.h> 290#include <math.h> 291#include <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 < (long) (extent.width-extent.height); x++) 315 { 316 PixelGetMagickColor(pixels[x],&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],&pixel); 322 } 323 return(MagickTrue); 324} 325 326int main(int argc,char **argv) 327{ 328#define ThrowViewException(view) \ 329{ \ 330 description=GetWandViewException(view,&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,&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&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 -->