Home | History | Annotate | Download | only in www
      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,minimum-scale=1,initial-scale=1,shrink-to-fit=no"  />
     10   <title>MagickWand, C API @ ImageMagick</title>
     11   <meta name="application-name" content="ImageMagick" />
     12   <meta name="description" content="Use ImageMagick to create, edit, compose, or convert bitmap images. You can resize your image, crop it, change its shades and colors, add captions, among other operations." />
     13   <meta name="application-url" content="https://imagemagick.org" />
     14   <meta name="generator" content="PHP" />
     15   <meta name="keywords" content="magickwc, api, ImageMagick, PerlMagick, image processing, image, photo, software, Magick++, OpenMP, convert" />
     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-2019 ImageMagick Studio LLC" />
     23   <meta name="distribution" content="Global" />
     24   <meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1" />
     25   <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
     26   <link href="magick-wand.html" rel="canonical" />
     27   <link href="../images/wand.png" rel="icon" />
     28   <link href="../images/wand.ico" rel="shortcut icon" />
     29   <link href="assets/magick.css" rel="stylesheet" />
     30 </head>
     31 <body>
     32   <header>
     33   <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
     34     <a class="navbar-brand" href="../"><img class="d-block" id="icon" alt="ImageMagick" width="32" height="32" src="../images/wand.ico"/></a>
     35     <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsMagick" aria-controls="navbarsMagick" aria-expanded="false" aria-label="Toggle navigation">
     36       <span class="navbar-toggler-icon"></span>
     37     </button>
     38 
     39     <div class="navbar-collapse collapse" id="navbarsMagick" style="">
     40     <ul class="navbar-nav mr-auto">
     41       <li class="nav-item ">
     42         <a class="nav-link" href="api/quantize.html">Home <span class="sr-only">(current)</span></a>
     43       </li>
     44       <li class="nav-item ">
     45         <a class="nav-link" href="../www/download.html">Download</a>
     46       </li>
     47       <li class="nav-item ">
     48         <a class="nav-link" href="../www/command-line-tools.html">Tools</a>
     49       </li>
     50       <li class="nav-item ">
     51         <a class="nav-link" href="../www/command-line-processing.html">Command-line</a>
     52       </li>
     53       <li class="nav-item ">
     54         <a class="nav-link" href="../www/resources.html">Resources</a>
     55       </li>
     56       <li class="nav-item ">
     57         <a class="nav-link" href="../www/develop.html">Develop</a>
     58       </li>
     59       <li class="nav-item">
     60         <a class="nav-link" target="_blank" href="https://imagemagick.org/discourse-server/">Community</a>
     61       </li>
     62     </ul>
     63     <form class="form-inline my-2 my-lg-0" action="https://imagemagick.org/script/search.php">
     64       <input class="form-control mr-sm-2" type="text" name="q" placeholder="Search" aria-label="Search">
     65       <button class="btn btn-outline-success my-2 my-sm-0" type="submit" name="sa">Search</button>
     66     </form>
     67     </div>
     68   </nav>
     69   <div class="container">
     70    <script async="async" src="https://localhost/pagead/js/adsbygoogle.js"></script>    <ins class="adsbygoogle"
     71          style="display:block"
     72          data-ad-client="ca-pub-3129977114552745"
     73          data-ad-slot="6345125851"
     74          data-ad-format="auto"></ins>
     75     <script>
     76       (adsbygoogle = window.adsbygoogle || []).push({});
     77     </script>
     78 
     79   </div>
     80   </header>
     81   <main class="container">
     82     <div class="magick-template">
     83 <div class="magick-header">
     84 
     85 <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="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>
     86 
     87 <ul>
     88   <li><a href="api/magick-wand.html">Magick Wand Methods</a></li>
     89   <li><a href="api/magick-property.html">Set or Get Magick Wand Properties</a></li>
     90   <li><a href="api/magick-image.html">Magick Wand Image Methods</a></li>
     91   <li><a href="api/pixel-iterator.html">Pixel Iterator Methods</a></li>
     92   <li><a href="api/pixel-wand.html">Pixel Wand Methods</a></li>
     93   <li><a href="api/drawing-wand.html">Image Vector Drawing</a></li>
     94   <li><a href="api/mogrify.html">Command-line Interface</a></li>
     95   <li><a href="api/wand-view.html">Wand View Methods</a></li>
     96   <li><a href="api/magick-deprecate.html">Deprecated Methods</a></li>
     97   <li><a href="exception.html">Error and Warning Codes</a></li>
     98 </ul>
     99 
    100 <p>After you write your MagickWand program, compile it like this:</p>
    101 
    102 <pre class="highlight"><code>cc -o wand wand.c `pkg-config --cflags --libs MagickWand`
    103 </code></pre>
    104 
    105 <p>Set the <code>PKG_CONFIG_PATH</code> environment variable if ImageMagick is not in your default system path:</p>
    106 
    107 <pre class="highlight"><code>export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    108 </code></pre>
    109 
    110 <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>
    111 
    112 <pre class="pre-scrollable"><code>#include &lt;stdio.h>
    113 #include &lt;stdlib.h>
    114 #include &lt;wand/MagickWand.h>
    115 
    116 int main(int argc,char **argv)
    117 {
    118 #define ThrowWandException(wand) \
    119 { \
    120   char \
    121     *description; \
    122  \
    123   ExceptionType \
    124     severity; \
    125  \
    126   description=MagickGetException(wand,&amp;severity); \
    127   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    128   description=(char *) MagickRelinquishMemory(description); \
    129   exit(-1); \
    130 }
    131 
    132   MagickBooleanType
    133     status;
    134 
    135   MagickWand
    136     *magick_wand;
    137 
    138   if (argc != 3)
    139     {
    140       (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
    141       exit(0);
    142     }
    143   /*
    144     Read an image.
    145   */
    146   MagickWandGenesis();
    147   magick_wand=NewMagickWand();
    148   status=MagickReadImage(magick_wand,argv[1]);
    149   if (status == MagickFalse)
    150     ThrowWandException(magick_wand);
    151   /*
    152     Turn the images into a thumbnail sequence.
    153   */
    154   MagickResetIterator(magick_wand);
    155   while (MagickNextImage(magick_wand) != MagickFalse)
    156     MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
    157   /*
    158     Write the image then destroy it.
    159   */
    160   status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
    161   if (status == MagickFalse)
    162     ThrowWandException(magick_wand);
    163   magick_wand=DestroyMagickWand(magick_wand);
    164   MagickWandTerminus();
    165   return(0);
    166 }
    167 </code></pre>
    168 
    169 <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>
    170 
    171 <pre class="pre-scrollable"><code>#include &lt;stdio.h>
    172 #include &lt;stdlib.h>
    173 #include &lt;math.h>
    174 #include &lt;wand/MagickWand.h>
    175 
    176 int main(int argc,char **argv)
    177 {
    178 #define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    179 #define SigmoidalContrast(x) \
    180   (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    181 #define ThrowWandException(wand) \
    182 { \
    183   char \
    184     *description; \
    185  \
    186   ExceptionType \
    187     severity; \
    188  \
    189   description=MagickGetException(wand,&amp;severity); \
    190   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    191   description=(char *) MagickRelinquishMemory(description); \
    192   exit(-1); \
    193 }
    194 
    195   long
    196     y;
    197 
    198   MagickBooleanType
    199     status;
    200 
    201   MagickPixelPacket
    202     pixel;
    203 
    204   MagickWand
    205     *contrast_wand,
    206     *image_wand;
    207 
    208   PixelIterator
    209     *contrast_iterator,
    210     *iterator;
    211 
    212   PixelWand
    213     **contrast_pixels,
    214     **pixels;
    215 
    216   register long
    217     x;
    218 
    219   unsigned long
    220     width;
    221 
    222   if (argc != 3)
    223     {
    224       (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
    225       exit(0);
    226     }
    227   /*
    228     Read an image.
    229   */
    230   MagickWandGenesis();
    231   image_wand=NewMagickWand();
    232   status=MagickReadImage(image_wand,argv[1]);
    233   if (status == MagickFalse)
    234     ThrowWandException(image_wand);
    235   contrast_wand=CloneMagickWand(image_wand);
    236   /*
    237     Sigmoidal non-linearity contrast control.
    238   */
    239   iterator=NewPixelIterator(image_wand);
    240   contrast_iterator=NewPixelIterator(contrast_wand);
    241   if ((iterator == (PixelIterator *) NULL) ||
    242       (contrast_iterator == (PixelIterator *) NULL))
    243     ThrowWandException(image_wand);
    244   for (y=0; y &lt; (long) MagickGetImageHeight(image_wand); y++)
    245   {
    246     pixels=PixelGetNextIteratorRow(iterator,&amp;width);
    247     contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&amp;width);
    248     if ((pixels == (PixelWand **) NULL) ||
    249         (contrast_pixels == (PixelWand **) NULL))
    250       break;
    251     for (x=0; x &lt; (long) width; x++)
    252     {
    253       PixelGetMagickColor(pixels[x],&amp;pixel);
    254       pixel.red=SigmoidalContrast(pixel.red);
    255       pixel.green=SigmoidalContrast(pixel.green);
    256       pixel.blue=SigmoidalContrast(pixel.blue);
    257       pixel.index=SigmoidalContrast(pixel.index);
    258       PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
    259     }
    260     (void) PixelSyncIterator(contrast_iterator);
    261   }
    262   if (y &lt; (long) MagickGetImageHeight(image_wand))
    263     ThrowWandException(image_wand);
    264   contrast_iterator=DestroyPixelIterator(contrast_iterator);
    265   iterator=DestroyPixelIterator(iterator);
    266   image_wand=DestroyMagickWand(image_wand);
    267   /*
    268     Write the image then destroy it.
    269   */
    270   status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
    271   if (status == MagickFalse)
    272     ThrowWandException(image_wand);
    273   contrast_wand=DestroyMagickWand(contrast_wand);
    274   MagickWandTerminus();
    275   return(0);
    276 }
    277 </code></pre>
    278 <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>
    279 
    280 <pre class="pre-scrollable"><code>#include &lt;stdio.h>
    281 #include &lt;stdlib.h>
    282 #include &lt;math.h>
    283 #include &lt;wand/MagickWand.h>
    284 
    285 static MagickBooleanType SigmoidalContrast(WandView *pixel_view,
    286   const ssize_t y,const int id,void *context)
    287 {
    288 #define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    289 #define SigmoidalContrast(x) \
    290   (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    291 
    292   RectangleInfo
    293     extent;
    294 
    295   MagickPixelPacket
    296     pixel;
    297 
    298   PixelWand
    299     **pixels;
    300 
    301   register long
    302     x;
    303 
    304   extent=GetWandViewExtent(contrast_view);
    305   pixels=GetWandViewPixels(contrast_view);
    306   for (x=0; x &lt; (long) (extent.width-extent.height); x++)
    307   {
    308     PixelGetMagickColor(pixels[x],&amp;pixel);
    309     pixel.red=SigmoidalContrast(pixel.red);
    310     pixel.green=SigmoidalContrast(pixel.green);
    311     pixel.blue=SigmoidalContrast(pixel.blue);
    312     pixel.index=SigmoidalContrast(pixel.index);
    313     PixelSetMagickColor(contrast_pixels[x],&amp;pixel);
    314   }
    315   return(MagickTrue);
    316 }
    317 
    318 int main(int argc,char **argv)
    319 {
    320 #define ThrowViewException(view) \
    321 { \
    322   description=GetWandViewException(view,&amp;severity); \
    323   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    324   description=(char *) MagickRelinquishMemory(description); \
    325   exit(-1); \
    326 }
    327 #define ThrowWandException(wand) \
    328 { \
    329   description=MagickGetException(wand,&amp;severity); \
    330   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
    331   description=(char *) MagickRelinquishMemory(description); \
    332   exit(-1); \
    333 }
    334 
    335   char
    336     *description;
    337 
    338   ExceptionType
    339     severity;
    340 
    341   MagickBooleanType
    342     status;
    343 
    344   MagickPixelPacket
    345     pixel;
    346 
    347   MagickWand
    348     *contrast_wand;
    349 
    350   WandView
    351     *contrast_view;
    352 
    353   if (argc != 3)
    354     {
    355       (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
    356       exit(0);
    357     }
    358   /*
    359     Read an image.
    360   */
    361   MagickWandGenesis();
    362   contrast_wand=NewMagickWand();
    363   status=MagickReadImage(contrast_wand,argv[1]);
    364   if (status == MagickFalse)
    365     ThrowWandException(contrast_wand);
    366   /*
    367     Sigmoidal non-linearity contrast control.
    368   */
    369   contrast_view=NewWandView(contrast_wand);
    370   if (contrast_view == (WandView *) NULL)
    371     ThrowWandException(contrast_wand);
    372   status=UpdateWandViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
    373   if (status == MagickFalse)
    374     ThrowWandException(contrast_wand);
    375   contrast_view=DestroyWandView(contrast_view);
    376   /*
    377     Write the image then destroy it.
    378   */
    379   status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
    380   if (status == MagickFalse)
    381     ThrowWandException(contrast_wand);
    382   contrast_wand=DestroyMagickWand(contrast_wand);
    383   MagickWandTerminus();
    384   return(0);
    385 }
    386 </code></pre>
    387 <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>
    388 </div>
    389     </div>
    390   </main><!-- /.container -->
    391   <footer class="magick-footer">
    392     <p><a href="../www/security-policy.html">Security</a> 
    393     <a href="../www/architecture.html">Architecture</a> 
    394     <a href="../www/links.html">Related</a> 
    395      <a href="../www/sitemap.html">Sitemap</a>
    396        
    397     <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>
    398        
    399     <a href="http://pgp.mit.edu/pks/lookup?op=get&search=0x89AB63D48277377A">Public Key</a> 
    400     <a href="../www/support.html">Donate</a> 
    401     <a href="../www/https://imagemagick.org/script/contact.php">Contact Us</a>
    402     <br/>
    403     <small> 1999-2019 ImageMagick Studio LLC</small></p>
    404   </footer>
    405 
    406   <!-- Javascript assets -->
    407   <script src="assets/magick.js" crossorigin="anonymous"></script>
    408   <script>window.jQuery || document.write('<script src="https://localhost/ajax/libs/jquery/3.3.1/jquery.min.js"><\/script>')</script>
    409 </body>
    410 </html>
    411