]> granicus.if.org Git - imagemagick/blob - www/magick-core.html
Update ImageMagick docs
[imagemagick] / www / magick-core.html
1
2
3
4
5 <!DOCTYPE html>
6 <html lang="en">
7 <head>
8   <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
9     <title>ImageMagick: MagickCore, Low-level C API for ImageMagick</title>
10   <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
11   <meta name="application-name" content="ImageMagick"/>
12   <meta name="description" content="ImageMagick® is a software suite to create, edit, compose, or convert bitmap images. It can read and write images in a variety of formats (over 200) including PNG, JPEG, JPEG-2000, GIF, WebP, Postscript, PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort, shear and transform images, adjust image colors, apply various special effects, or draw text, lines, polygons, ellipses and Bézier curves."/>
13   <meta name="application-url" content="http://www.imagemagick.org"/>
14   <meta name="generator" content="PHP"/>
15   <meta name="keywords" content="magickcore, low-level, c, api, for, imagemagick, 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-2015 ImageMagick Studio LLC"/>
23   <meta name="distribution" content="Global"/>
24   <meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1"/>
25   <link rel="icon" href="../images/wand.png"/>
26   <link rel="shortcut icon" href="../images/wand.ico"/>
27   <link rel="stylesheet" href="../css/magick.html"/>
28 </head>
29 <body>
30 <div class="main">
31 <div class="magick-masthead">
32   <div class="container">
33     <script async="async" src="http://localhost/pagead/js/adsbygoogle.js"></script>    <ins class="adsbygoogle"
34          style="display:block"
35          data-ad-client="ca-pub-3129977114552745"
36          data-ad-slot="6345125851"
37          data-ad-format="auto"></ins>
38     <script>
39       (adsbygoogle = window.adsbygoogle || []).push({});
40     </script>
41     <nav class="magick-nav">
42       <a class="magick-nav-item " href="../index.html">Home</a>
43       <a class="magick-nav-item " href="binary-releases.html">Download</a>
44       <a class="magick-nav-item " href="command-line-tools.html">Tools</a>
45       <a class="magick-nav-item " href="command-line-options.html">Options</a>
46       <a class="magick-nav-item " href="resources.html">Resources</a>
47       <a class="magick-nav-item " href="api.html">Develop</a>
48       <a class="magick-nav-item " href="http://nextgen.imagemagick.org/script/search.php">Search</a>
49       <a class="magick-nav-item pull-right" href="http://www.imagemagick.org/discourse-server/">Community</a>
50     </nav>
51   </div>
52 </div>
53 <div class="container">
54 <div class="magick-header">
55
56 <p  class="lead magick-description">The <a href="http://nextgen.imagemagick.org/api/MagickCore/index.html">MagickCore API</a> is a low-level interface between the C programming language and the ImageMagick image processing libraries and is recommended for wizard-level programmers only.  Unlike the <a href="magick-wand.html">MagickWand</a> C API which uses only a few opaque types and accessors, with MagickCore you almost exlusively access the structure members directly.  A description of the MagickCore public methods are found here:</p>
57
58 <ul>
59   <li><a href="api/magick.html">Initialize or Destroy the ImageMagick Environment</a></li>
60   <li><a href="api/constitute.html">Constitute an Image</a></li>
61   <li><a href="api/composite.html">Composite an Image</a></li>
62   <li><a href="api/image.html">Image Methods</a></li>
63   <li><a href="api/channel.html">Image Channel Methods</a></li>
64   <li><a href="api/color.html">Count the Colors in an Image</a></li>
65   <li><a href="api/colormap.html">Colormap Methods</a></li>
66   <li><a href="api/colorspace.html">Colorspace Methods</a></li>
67   <li><a href="api/distort.html">Image Distortions</a></li>
68   <li><a href="api/layer.html">Dealing with Image Layers</a></li>
69   <li><a href="api/profile.html">Dealing with Image Profiles</a></li>
70   <li><a href="api/quantize.html">Reduce the Number of Unique Colors in an Image</a></li>
71   <li><a href="api/histogram.html">Image Histograms</a></li>
72   <li><a href="api/segment.html">Segment an Image with Thresholding Fuzzy c-Means</a></li>
73   <li><a href="api/resize.html">Resize an Image</a></li>
74   <li><a href="api/transform.html">Transform an Image</a></li>
75   <li><a href="api/shear.html">Shear or Rotate an Image by an Arbitrary Angle</a></li>
76   <li><a href="api/enhance.html">Enhance an Image</a></li>
77   <li><a href="api/effect.html">Add an Effect</a></li>
78   <li><a href="api/morphology.html">Morphological Erosions, Dilations, Openings, and Closings</a></li>
79   <li><a href="api/fx.html">Add a Special Effect</a></li>
80   <li><a href="api/decorate.html">Decorate an Image</a></li>
81   <li><a href="api/attribute.html">Get/Set an Image Attribute</a></li>
82   <li><a href="api/property.html">Get/Set Image Properties</a></li>
83   <li><a href="api/statistic.html">Get Image Statistics</a></li>
84   <li><a href="api/feature.html">Get Image Features</a></li>
85   <li><a href="api/annotate.html">Annotate an Image</a></li>
86   <li><a href="api/paint.html">Paint on an Image</a></li>
87   <li><a href="api/draw.html">Draw on an Image</a></li>
88   <li><a href="api/montage.html">Create an Image Thumbnail</a></li>
89   <li><a href="api/fourier.html">Compute the discrete Fourier transform (DFT)</a></li>
90   <li><a href="api/compare.html">Compare an Image to a Reconstructed Image</a></li>
91   <li><a href="api/display.html">Interactively Display and Edit an Image</a></li>
92   <li><a href="api/animate.html">Interactively Animate an Image Sequence</a></li>
93   <li><a href="api/cipher.html">Convert to and from Cipher Pixels</a></li>
94   <li><a href="api/list.html">Working with Image Lists</a></li>
95   <li><a href="api/image-view.html">Image View Methods</a></li>
96   <li><a href="api/cache.html">Get or Set Image Pixels</a></li>
97   <li><a href="api/cache-view.html">Working with Cache Views</a></li>
98   <li><a href="api/stream.html">The Pixel FIFO</a></li>
99   <li><a href="api/blob.html">Read or Write Binary Large OBjects</a></li>
100   <li><a href="api/module.html">Loadable Modules</a></li>
101   <li><a href="api/signature.html">Compute a Message Digest for an Image</a></li>
102   <li><a href="api/registry.html">The Image Registry</a></li>
103   <li><a href="api/exception.html">Dealing with Exceptions</a></li>
104   <li><a href="api/memory.html">Memory Allocation</a></li>
105   <li><a href="api/resource.html">Monitor or Limit Resource Consumption</a></li>
106   <li><a href="api/monitor.html">Monitor the Progress of an Image Operation</a></li>
107   <li><a href="api/version.html">Get the Version and Copyrights</a></li>
108   <li><a href="api/mime.html">Mime Methods</a></li>
109   <li><a href="api/deprecate.html">Deprecated Methods</a></li>
110   <li><a href="exception.html">Error and Warning Codes</a></li>
111 </ul>
112
113 <p>After you write your MagickCore program, compile it like this:</p>
114
115 <pre>
116 cc -o core core.c `pkg-config --cflags --libs MagickCore`
117 </pre>
118
119 <p>Set the <code>PKG_CONFIG_PATH</code> environment variable if ImageMagick is not in your default system path:</p>
120
121 <pre>
122 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
123 </pre>
124
125 <p>Here is a example program that utilizes the MagickCore API to get you started, <a href="../source/core.c">core.c</a>. It reads a GIF image, creates a thumbnail, and writes it to disk in the PNG image format.</p>
126
127 <pre class="pre-scrollable">#include &lt;stdio.h>
128 #include &lt;stdlib.h>
129 #include &lt;string.h>
130 #include &lt;time.h>
131 #include &lt;magick/MagickCore.h>
132
133 int main(int argc,char **argv)
134 {
135   ExceptionInfo
136     *exception;
137
138   Image
139     *image,
140     *images,
141     *resize_image,
142     *thumbnails;
143
144   ImageInfo
145     *image_info;
146
147   if (argc != 3)
148     {
149       (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
150       exit(0);
151     }
152   /*
153     Initialize the image info structure and read an image.
154   */
155   MagickCoreGenesis(*argv,MagickTrue);
156   exception=AcquireExceptionInfo();
157   image_info=CloneImageInfo((ImageInfo *) NULL);
158   (void) strcpy(image_info-&gt;filename,argv[1]);
159   images=ReadImage(image_info,exception);
160   if (exception-&gt;severity != UndefinedException)
161     CatchException(exception);
162   if (images == (Image *) NULL)
163     exit(1);
164   /*
165     Convert the image to a thumbnail.
166   */
167   thumbnails=NewImageList();
168   while ((image=RemoveFirstImageFromList(&amp;images)) != (Image *) NULL)
169   {
170     resize_image=ResizeImage(image,106,80,LanczosFilter,1.0,exception);
171     if (resize_image == (Image *) NULL)
172       MagickError(exception-&gt;severity,exception-&gt;reason,exception-&gt;description);
173     (void) AppendImageToList(&amp;thumbnails,resize_image);
174     DestroyImage(image);
175   }
176   /*
177     Write the image thumbnail.
178   */
179   (void) strcpy(thumbnails-&gt;filename,argv[2]);
180   WriteImage(image_info,thumbnails);
181   /*
182     Destroy the image thumbnail and exit.
183   */
184   thumbnails=DestroyImageList(thumbnails);
185   image_info=DestroyImageInfo(image_info);
186   exception=DestroyExceptionInfo(exception);
187   MagickCoreTerminus();
188   return(0);
189 }</pre>
190 <p><a id="image-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="../source/core/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>
191
192 <pre class="pre-scrollable">#include &lt;stdio.h>
193 #include &lt;stdlib.h>
194 #include &lt;math.h>
195 #include &lt;magick/MagickCore.h>
196
197 static MagickBooleanType SigmoidalContrast(ImageView *contrast_view,
198   const ssize_t y,const int id,void *context)
199 {
200 #define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
201 #define SigmoidalContrast(x) \
202   (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
203
204   RectangleInfo
205     extent;
206
207   register IndexPacket
208     *indexes;
209
210   register PixelPacket
211     *pixels;
212
213   register ssize_t
214     x;
215
216   extent=GetImageViewExtent(contrast_view);
217   pixels=GetImageViewAuthenticPixels(contrast_view);
218   for (x=0; x &lt; (ssize_t) (extent.width-extent.x); x++)
219   {
220     SetPixelRed(pixels,RoundToQuantum(SigmoidalContrast(GetPixelRed(pixels)));
221     SetPixelGreen(pixels,RoundToQuantum(SigmoidalContrast(GetPixelGreen(pixels)));
222     SetPixelBlue(pixels,RoundToQuantum(SigmoidalContrast(GetPixelBlue(pixels)));
223     SetPixelOpacity(pixels,RoundToQuantum(SigmoidalContrast(GetPixelOpacity(pixels)));
224     pixels++;
225   }
226   indexes=GetImageViewAuthenticIndexes(contrast_view);
227   if (indexes != (IndexPacket *) NULL)
228     for (x=0; x &lt; (ssize_t) (extent.width-extent.x); x++)
229       SetPixelIndex(indexes+x,RoundToQuantum(SigmoidalContrast(GetPixelIndex(indexes+x))));
230   return(MagickTrue);
231 }
232
233 int main(int argc,char **argv)
234 {
235 #define ThrowImageException(image) \
236 { \
237  \
238   CatchException(exception); \
239   if (contrast_image != (Image *) NULL) \
240     contrast_image=DestroyImage(contrast_image); \
241   exit(-1); \
242 }
243 #define ThrowViewException(view) \
244 { \
245   char \
246     *description; \
247  \
248   ExceptionType \
249     severity; \
250  \
251   description=GetImageViewException(view,&amp;severity); \
252   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
253   description=DestroyString(description); \
254   exit(-1); \
255 }
256
257   ExceptionInfo
258     *exception;
259
260   Image
261     *contrast_image;
262
263   ImageInfo
264     *image_info;
265
266   ImageView
267     *contrast_view;
268
269   MagickBooleanType
270     status;
271
272   if (argc != 3)
273     {
274       (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
275       exit(0);
276     }
277   /*
278     Read an image.
279   */
280   MagickCoreGenesis(*argv,MagickTrue);
281   image_info=AcquireImageInfo();
282   (void) CopyMagickString(image_info->filename,argv[1],MaxTextExtent);
283   exception=AcquireExceptionInfo();
284   contrast_image=ReadImage(image_info,exception);
285   if (contrast_image == (Image *) NULL)
286     ThrowImageException(contrast_image);
287   /*
288     Sigmoidal non-linearity contrast control.
289   */
290   contrast_view=NewImageView(contrast_image);
291   if (contrast_view == (ImageView *) NULL)
292     ThrowImageException(contrast_image);
293   status=UpdateImageViewIterator(contrast_view,SigmoidalContrast,(void *) NULL);
294   if (status == MagickFalse)
295     ThrowImageException(contrast_image);
296   contrast_view=DestroyImageView(contrast_view);
297   /*
298     Write the image then destroy it.
299   */
300   status=WriteImages(image_info,contrast_image,argv[2],exception);
301   if (status == MagickFalse)
302     ThrowImageException(contrast_image);
303   contrast_image=DestroyImage(contrast_image);
304   exception=DestroyExceptionInfo(exception);
305   image_info=DestroyImageInfo(image_info);
306   MagickCoreTerminus();
307   return(0);
308 }</pre>
309 </div>
310   <footer class="magick-footer">
311     <p><a href="support.html">Donate</a> •
312      <a href="sitemap.html">Sitemap</a> •
313     <a href="links.html">Related</a> •
314     <a href="architecture.html">Architecture</a>
315 </p>
316     <p><a href="magick-core.html#">Back to top</a> •
317     <a href="http://pgp.mit.edu:11371/pks/lookup?op=get&amp;search=0x89AB63D48277377A">Public Key</a> •
318     <a href="http://nextgen.imagemagick.org/script/contact.php">Contact Us</a></p>
319         <p><small>©  1999-2015 ImageMagick Studio LLC</small></p>
320   </footer>
321 </div><!-- /.container -->
322
323   <script src="https://localhost/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
324   <script src="http://nextgen.imagemagick.org/js/magick.html"></script>
325 </div>
326 </body>
327 </html>