magick-image.c revision 8b9f21cab4c50eb7d6e558a7a43a68833fe0b55d
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
6%                 M   M   AAA    GGGG  IIIII   CCCC  K   K                    %
7%                 MM MM  A   A  G        I    C      K  K                     %
8%                 M M M  AAAAA  G GGG    I    C      KKK                      %
9%                 M   M  A   A  G   G    I    C      K  K                     %
10%                 M   M  A   A   GGGG  IIIII   CCCC  K   K                    %
11%                                                                             %
12%                     IIIII  M   M   AAA    GGGG  EEEEE                       %
13%                       I    MM MM  A   A  G      E                           %
14%                       I    M M M  AAAAA  G  GG  EEE                         %
15%                       I    M   M  A   A  G   G  E                           %
16%                     IIIII  M   M  A   A   GGGG  EEEEE                       %
17%                                                                             %
18%                                                                             %
19%                          MagickWand Image Methods                           %
20%                                                                             %
21%                               Software Design                               %
22%                                    Cristy                                   %
23%                                 August 2003                                 %
24%                                                                             %
25%                                                                             %
26%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
27%  dedicated to making software imaging solutions freely available.           %
28%                                                                             %
29%  You may not use this file except in compliance with the License.  You may  %
30%  obtain a copy of the License at                                            %
31%                                                                             %
32%    http://www.imagemagick.org/script/license.php                            %
33%                                                                             %
34%  Unless required by applicable law or agreed to in writing, software        %
35%  distributed under the License is distributed on an "AS IS" BASIS,          %
36%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
37%  See the License for the specific language governing permissions and        %
38%  limitations under the License.                                             %
39%                                                                             %
40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41%
42%
43%
44*/
45
46/*
47  Include declarations.
48*/
49#include "MagickWand/studio.h"
50#include "MagickWand/MagickWand.h"
51#include "MagickWand/magick-wand-private.h"
52#include "MagickWand/wand.h"
53#include "MagickWand/pixel-wand-private.h"
54#include "MagickCore/image-private.h"
55
56/*
57  Define declarations.
58*/
59#define MagickWandId  "MagickWand"
60
61/*
62%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
63%                                                                             %
64%                                                                             %
65%                                                                             %
66+   C l o n e M a g i c k W a n d F r o m I m a g e s                         %
67%                                                                             %
68%                                                                             %
69%                                                                             %
70%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
71%
72%  CloneMagickWandFromImages() clones the magick wand and inserts a new image
73%  list.
74%
75%  The format of the CloneMagickWandFromImages method is:
76%
77%      MagickWand *CloneMagickWandFromImages(const MagickWand *wand,
78%        Image *images)
79%
80%  A description of each parameter follows:
81%
82%    o wand: the magick wand.
83%
84%    o images: replace the image list with these image(s).
85%
86*/
87static MagickWand *CloneMagickWandFromImages(const MagickWand *wand,
88  Image *images)
89{
90  MagickWand
91    *clone_wand;
92
93  assert(wand != (MagickWand *) NULL);
94  assert(wand->signature == MagickWandSignature);
95  if (wand->debug != MagickFalse)
96    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
97  clone_wand=(MagickWand *) AcquireMagickMemory(sizeof(*clone_wand));
98  if (clone_wand == (MagickWand *) NULL)
99    ThrowWandFatalException(ResourceLimitFatalError,"MemoryAllocationFailed",
100      images->filename);
101  (void) ResetMagickMemory(clone_wand,0,sizeof(*clone_wand));
102  clone_wand->id=AcquireWandId();
103  (void) FormatLocaleString(clone_wand->name,MagickPathExtent,"%s-%.20g",
104    MagickWandId,(double) clone_wand->id);
105  clone_wand->exception=AcquireExceptionInfo();
106  InheritException(clone_wand->exception,wand->exception);
107  clone_wand->image_info=CloneImageInfo(wand->image_info);
108  clone_wand->images=images;
109  clone_wand->debug=IsEventLogging();
110  clone_wand->signature=MagickWandSignature;
111  if (clone_wand->debug != MagickFalse)
112    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clone_wand->name);
113  return(clone_wand);
114}
115
116/*
117%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
118%                                                                             %
119%                                                                             %
120%                                                                             %
121%   G e t I m a g e F r o m M a g i c k W a n d                               %
122%                                                                             %
123%                                                                             %
124%                                                                             %
125%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
126%
127%  GetImageFromMagickWand() returns the current image from the magick wand.
128%
129%  The format of the GetImageFromMagickWand method is:
130%
131%      Image *GetImageFromMagickWand(const MagickWand *wand)
132%
133%  A description of each parameter follows:
134%
135%    o wand: the magick wand.
136%
137*/
138WandExport Image *GetImageFromMagickWand(const MagickWand *wand)
139{
140  assert(wand != (MagickWand *) NULL);
141  assert(wand->signature == MagickWandSignature);
142  if (wand->debug != MagickFalse)
143    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
144  if (wand->images == (Image *) NULL)
145    {
146      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
147        "ContainsNoImages","`%s'",wand->name);
148      return((Image *) NULL);
149    }
150  return(wand->images);
151}
152
153/*
154%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
155%                                                                             %
156%                                                                             %
157%                                                                             %
158%   M a g i c k A d a p t i v e S h a r p e n I m a g e                       %
159%                                                                             %
160%                                                                             %
161%                                                                             %
162%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
163%
164%  MagickAdaptiveBlurImage() adaptively blurs the image by blurring
165%  less intensely near image edges and more intensely far from edges. We
166%  blur the image with a Gaussian operator of the given radius and standard
167%  deviation (sigma).  For reasonable results, radius should be larger than
168%  sigma.  Use a radius of 0 and MagickAdaptiveBlurImage() selects a
169%  suitable radius for you.
170%
171%  The format of the MagickAdaptiveBlurImage method is:
172%
173%      MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand,
174%        const double radius,const double sigma)
175%
176%  A description of each parameter follows:
177%
178%    o wand: the magick wand.
179%
180%    o radius: the radius of the Gaussian, in pixels, not counting the center
181%      pixel.
182%
183%    o sigma: the standard deviation of the Gaussian, in pixels.
184%
185*/
186WandExport MagickBooleanType MagickAdaptiveBlurImage(MagickWand *wand,
187  const double radius,const double sigma)
188{
189  Image
190    *sharp_image;
191
192  assert(wand != (MagickWand *) NULL);
193  assert(wand->signature == MagickWandSignature);
194  if (wand->debug != MagickFalse)
195    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
196  if (wand->images == (Image *) NULL)
197    ThrowWandException(WandError,"ContainsNoImages",wand->name);
198  sharp_image=AdaptiveBlurImage(wand->images,radius,sigma,wand->exception);
199  if (sharp_image == (Image *) NULL)
200    return(MagickFalse);
201  ReplaceImageInList(&wand->images,sharp_image);
202  return(MagickTrue);
203}
204
205/*
206%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
207%                                                                             %
208%                                                                             %
209%                                                                             %
210%   M a g i c k A d a p t i v e R e s i z e I m a g e                         %
211%                                                                             %
212%                                                                             %
213%                                                                             %
214%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
215%
216%  MagickAdaptiveResizeImage() adaptively resize image with data dependent
217%  triangulation.
218%
219%      MagickBooleanType MagickAdaptiveResizeImage(MagickWand *wand,
220%        const size_t columns,const size_t rows)
221%
222%  A description of each parameter follows:
223%
224%    o wand: the magick wand.
225%
226%    o columns: the number of columns in the scaled image.
227%
228%    o rows: the number of rows in the scaled image.
229%
230*/
231WandExport MagickBooleanType MagickAdaptiveResizeImage(MagickWand *wand,
232  const size_t columns,const size_t rows)
233{
234  Image
235    *resize_image;
236
237  assert(wand != (MagickWand *) NULL);
238  assert(wand->signature == MagickWandSignature);
239  if (wand->debug != MagickFalse)
240    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
241  if (wand->images == (Image *) NULL)
242    ThrowWandException(WandError,"ContainsNoImages",wand->name);
243  resize_image=AdaptiveResizeImage(wand->images,columns,rows,wand->exception);
244  if (resize_image == (Image *) NULL)
245    return(MagickFalse);
246  ReplaceImageInList(&wand->images,resize_image);
247  return(MagickTrue);
248}
249
250/*
251%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
252%                                                                             %
253%                                                                             %
254%                                                                             %
255%   M a g i c k A d a p t i v e S h a r p e n I m a g e                       %
256%                                                                             %
257%                                                                             %
258%                                                                             %
259%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
260%
261%  MagickAdaptiveSharpenImage() adaptively sharpens the image by sharpening
262%  more intensely near image edges and less intensely far from edges. We
263%  sharpen the image with a Gaussian operator of the given radius and standard
264%  deviation (sigma).  For reasonable results, radius should be larger than
265%  sigma.  Use a radius of 0 and MagickAdaptiveSharpenImage() selects a
266%  suitable radius for you.
267%
268%  The format of the MagickAdaptiveSharpenImage method is:
269%
270%      MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand,
271%        const double radius,const double sigma)
272%
273%  A description of each parameter follows:
274%
275%    o wand: the magick wand.
276%
277%    o radius: the radius of the Gaussian, in pixels, not counting the center
278%      pixel.
279%
280%    o sigma: the standard deviation of the Gaussian, in pixels.
281%
282*/
283WandExport MagickBooleanType MagickAdaptiveSharpenImage(MagickWand *wand,
284  const double radius,const double sigma)
285{
286  Image
287    *sharp_image;
288
289  assert(wand != (MagickWand *) NULL);
290  assert(wand->signature == MagickWandSignature);
291  if (wand->debug != MagickFalse)
292    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
293  if (wand->images == (Image *) NULL)
294    ThrowWandException(WandError,"ContainsNoImages",wand->name);
295  sharp_image=AdaptiveSharpenImage(wand->images,radius,sigma,wand->exception);
296  if (sharp_image == (Image *) NULL)
297    return(MagickFalse);
298  ReplaceImageInList(&wand->images,sharp_image);
299  return(MagickTrue);
300}
301
302/*
303%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
304%                                                                             %
305%                                                                             %
306%                                                                             %
307%   M a g i c k A d a p t i v e T h r e s h o l d I m a g e                   %
308%                                                                             %
309%                                                                             %
310%                                                                             %
311%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
312%
313%  MagickAdaptiveThresholdImage() selects an individual threshold for each pixel
314%  based on the range of intensity values in its local neighborhood.  This
315%  allows for thresholding of an image whose global intensity histogram
316%  doesn't contain distinctive peaks.
317%
318%  The format of the AdaptiveThresholdImage method is:
319%
320%      MagickBooleanType MagickAdaptiveThresholdImage(MagickWand *wand,
321%        const size_t width,const size_t height,const double bias)
322%
323%  A description of each parameter follows:
324%
325%    o wand: the magick wand.
326%
327%    o width: the width of the local neighborhood.
328%
329%    o height: the height of the local neighborhood.
330%
331%    o offset: the mean bias.
332%
333*/
334WandExport MagickBooleanType MagickAdaptiveThresholdImage(MagickWand *wand,
335  const size_t width,const size_t height,const double bias)
336{
337  Image
338    *threshold_image;
339
340  assert(wand != (MagickWand *) NULL);
341  assert(wand->signature == MagickWandSignature);
342  if (wand->debug != MagickFalse)
343    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
344  if (wand->images == (Image *) NULL)
345    ThrowWandException(WandError,"ContainsNoImages",wand->name);
346  threshold_image=AdaptiveThresholdImage(wand->images,width,height,bias,
347    wand->exception);
348  if (threshold_image == (Image *) NULL)
349    return(MagickFalse);
350  ReplaceImageInList(&wand->images,threshold_image);
351  return(MagickTrue);
352}
353
354/*
355%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
356%                                                                             %
357%                                                                             %
358%                                                                             %
359%   M a g i c k A d d I m a g e                                               %
360%                                                                             %
361%                                                                             %
362%                                                                             %
363%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
364%
365%  MagickAddImage() adds a clone of the images from the second wand and
366%  inserts them into the first wand.
367%
368%  Use MagickSetLastIterator(), to append new images into an existing wand,
369%  current image will be set to last image so later adds with also be
370%  appened to end of wand.
371%
372%  Use MagickSetFirstIterator() to prepend new images into wand, any more
373%  images added will also be prepended before other images in the wand.
374%  However the order of a list of new images will not change.
375%
376%  Otherwise the new images will be inserted just after the current image,
377%  and any later image will also be added after this current image but
378%  before the previously added images.  Caution is advised when multiple
379%  image adds are inserted into the middle of the wand image list.
380%
381%  The format of the MagickAddImage method is:
382%
383%      MagickBooleanType MagickAddImage(MagickWand *wand,
384%        const MagickWand *add_wand)
385%
386%  A description of each parameter follows:
387%
388%    o wand: the magick wand.
389%
390%    o add_wand: A wand that contains the image list to be added
391%
392*/
393static inline MagickBooleanType InsertImageInWand(MagickWand *wand,
394  Image *images)
395{
396  if (wand->images == (Image *) NULL)
397    {
398      /*
399        No images in wand, just add them, set current as appropriate.
400      */
401      if (wand->insert_before != MagickFalse)
402        wand->images=GetFirstImageInList(images);
403      else
404        wand->images=GetLastImageInList(images);
405      return(MagickTrue);
406    }
407  /* user jumped to first image, so prepend new images - remain active */
408  if ((wand->insert_before != MagickFalse) &&
409       (wand->images->previous == (Image *) NULL))
410    {
411      PrependImageToList(&wand->images,images);
412      wand->images=GetFirstImageInList(images);
413      return(MagickTrue);
414    }
415  /*
416    Note you should never have 'insert_before' true when current image is not
417    the first image in the wand!  That is no insert before current image, only
418    after current image
419  */
420  if (wand->images->next == (Image *) NULL)
421    {
422      /*
423        At last image, append new images.
424      */
425      InsertImageInList(&wand->images,images);
426      wand->images=GetLastImageInList(images);
427      return(MagickTrue);
428    }
429  /*
430    Insert new images, just after the current image.
431  */
432  InsertImageInList(&wand->images,images);
433  return(MagickTrue);
434}
435
436WandExport MagickBooleanType MagickAddImage(MagickWand *wand,
437  const MagickWand *add_wand)
438{
439  Image
440    *images;
441
442  assert(wand != (MagickWand *) NULL);
443  assert(wand->signature == MagickWandSignature);
444  if (wand->debug != MagickFalse)
445    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
446  assert(add_wand != (MagickWand *) NULL);
447  assert(add_wand->signature == MagickWandSignature);
448  if (add_wand->images == (Image *) NULL)
449    ThrowWandException(WandError,"ContainsNoImages",add_wand->name);
450  /*
451    Clone images in second wand, and insert into first.
452  */
453  images=CloneImageList(add_wand->images,wand->exception);
454  if (images == (Image *) NULL)
455    return(MagickFalse);
456  return(InsertImageInWand(wand,images));
457}
458
459/*
460%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
461%                                                                             %
462%                                                                             %
463%                                                                             %
464%     M a g i c k A d d N o i s e I m a g e                                   %
465%                                                                             %
466%                                                                             %
467%                                                                             %
468%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
469%
470%  MagickAddNoiseImage() adds random noise to the image.
471%
472%  The format of the MagickAddNoiseImage method is:
473%
474%      MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
475%        const NoiseType noise_type,const double attenuate)
476%
477%  A description of each parameter follows:
478%
479%    o wand: the magick wand.
480%
481%    o noise_type:  The type of noise: Uniform, Gaussian, Multiplicative,
482%      Impulse, Laplacian, or Poisson.
483%
484%    o attenuate:  attenuate the random distribution.
485%
486*/
487WandExport MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
488  const NoiseType noise_type,const double attenuate)
489{
490  Image
491    *noise_image;
492
493  assert(wand != (MagickWand *) NULL);
494  assert(wand->signature == MagickWandSignature);
495  if (wand->debug != MagickFalse)
496    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
497  if (wand->images == (Image *) NULL)
498    ThrowWandException(WandError,"ContainsNoImages",wand->name);
499  noise_image=AddNoiseImage(wand->images,noise_type,attenuate,wand->exception);
500  if (noise_image == (Image *) NULL)
501    return(MagickFalse);
502  ReplaceImageInList(&wand->images,noise_image);
503  return(MagickTrue);
504}
505
506/*
507%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
508%                                                                             %
509%                                                                             %
510%                                                                             %
511%   M a g i c k A f f i n e T r a n s f o r m I m a g e                       %
512%                                                                             %
513%                                                                             %
514%                                                                             %
515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
516%
517%  MagickAffineTransformImage() transforms an image as dictated by the affine
518%  matrix of the drawing wand.
519%
520%  The format of the MagickAffineTransformImage method is:
521%
522%      MagickBooleanType MagickAffineTransformImage(MagickWand *wand,
523%        const DrawingWand *drawing_wand)
524%
525%  A description of each parameter follows:
526%
527%    o wand: the magick wand.
528%
529%    o drawing_wand: the draw wand.
530%
531*/
532WandExport MagickBooleanType MagickAffineTransformImage(MagickWand *wand,
533  const DrawingWand *drawing_wand)
534{
535  DrawInfo
536    *draw_info;
537
538  Image
539    *affine_image;
540
541  assert(wand != (MagickWand *) NULL);
542  assert(wand->signature == MagickWandSignature);
543  if (wand->debug != MagickFalse)
544    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
545  if (wand->images == (Image *) NULL)
546    ThrowWandException(WandError,"ContainsNoImages",wand->name);
547  draw_info=PeekDrawingWand(drawing_wand);
548  if (draw_info == (DrawInfo *) NULL)
549    return(MagickFalse);
550  affine_image=AffineTransformImage(wand->images,&draw_info->affine,
551    wand->exception);
552  draw_info=DestroyDrawInfo(draw_info);
553  if (affine_image == (Image *) NULL)
554    return(MagickFalse);
555  ReplaceImageInList(&wand->images,affine_image);
556  return(MagickTrue);
557}
558
559/*
560%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
561%                                                                             %
562%                                                                             %
563%                                                                             %
564%   M a g i c k A n n o t a t e I m a g e                                     %
565%                                                                             %
566%                                                                             %
567%                                                                             %
568%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
569%
570%  MagickAnnotateImage() annotates an image with text.
571%
572%  The format of the MagickAnnotateImage method is:
573%
574%      MagickBooleanType MagickAnnotateImage(MagickWand *wand,
575%        const DrawingWand *drawing_wand,const double x,const double y,
576%        const double angle,const char *text)
577%
578%  A description of each parameter follows:
579%
580%    o wand: the magick wand.
581%
582%    o drawing_wand: the draw wand.
583%
584%    o x: x ordinate to left of text
585%
586%    o y: y ordinate to text baseline
587%
588%    o angle: rotate text relative to this angle.
589%
590%    o text: text to draw
591%
592*/
593WandExport MagickBooleanType MagickAnnotateImage(MagickWand *wand,
594  const DrawingWand *drawing_wand,const double x,const double y,
595  const double angle,const char *text)
596{
597  char
598    geometry[MagickPathExtent];
599
600  DrawInfo
601    *draw_info;
602
603  MagickBooleanType
604    status;
605
606  assert(wand != (MagickWand *) NULL);
607  assert(wand->signature == MagickWandSignature);
608  if (wand->debug != MagickFalse)
609    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
610  if (wand->images == (Image *) NULL)
611    ThrowWandException(WandError,"ContainsNoImages",wand->name);
612  draw_info=PeekDrawingWand(drawing_wand);
613  if (draw_info == (DrawInfo *) NULL)
614    return(MagickFalse);
615  (void) CloneString(&draw_info->text,text);
616  (void) FormatLocaleString(geometry,MagickPathExtent,"%+g%+g",x,y);
617  draw_info->affine.sx=cos((double) DegreesToRadians(fmod(angle,360.0)));
618  draw_info->affine.rx=sin((double) DegreesToRadians(fmod(angle,360.0)));
619  draw_info->affine.ry=(-sin((double) DegreesToRadians(fmod(angle,360.0))));
620  draw_info->affine.sy=cos((double) DegreesToRadians(fmod(angle,360.0)));
621  (void) CloneString(&draw_info->geometry,geometry);
622  status=AnnotateImage(wand->images,draw_info,wand->exception);
623  draw_info=DestroyDrawInfo(draw_info);
624  return(status);
625}
626
627/*
628%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
629%                                                                             %
630%                                                                             %
631%                                                                             %
632%   M a g i c k A n i m a t e I m a g e s                                     %
633%                                                                             %
634%                                                                             %
635%                                                                             %
636%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
637%
638%  MagickAnimateImages() animates an image or image sequence.
639%
640%  The format of the MagickAnimateImages method is:
641%
642%      MagickBooleanType MagickAnimateImages(MagickWand *wand,
643%        const char *server_name)
644%
645%  A description of each parameter follows:
646%
647%    o wand: the magick wand.
648%
649%    o server_name: the X server name.
650%
651*/
652WandExport MagickBooleanType MagickAnimateImages(MagickWand *wand,
653  const char *server_name)
654{
655  MagickBooleanType
656    status;
657
658  assert(wand != (MagickWand *) NULL);
659  assert(wand->signature == MagickWandSignature);
660  if (wand->debug != MagickFalse)
661    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
662  (void) CloneString(&wand->image_info->server_name,server_name);
663  status=AnimateImages(wand->image_info,wand->images,wand->exception);
664  return(status);
665}
666
667/*
668%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
669%                                                                             %
670%                                                                             %
671%                                                                             %
672%   M a g i c k A p p e n d I m a g e s                                       %
673%                                                                             %
674%                                                                             %
675%                                                                             %
676%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
677%
678%  MagickAppendImages() append the images in a wand from the current image
679%  onwards, creating a new wand with the single image result.  This is
680%  affected by the gravity and background settings of the first image.
681%
682%  Typically you would call either MagickResetIterator() or
683%  MagickSetFirstImage() before calling this function to ensure that all
684%  the images in the wand's image list will be appended together.
685%
686%  The format of the MagickAppendImages method is:
687%
688%      MagickWand *MagickAppendImages(MagickWand *wand,
689%        const MagickBooleanType stack)
690%
691%  A description of each parameter follows:
692%
693%    o wand: the magick wand.
694%
695%    o stack: By default, images are stacked left-to-right. Set stack to
696%      MagickTrue to stack them top-to-bottom.
697%
698*/
699WandExport MagickWand *MagickAppendImages(MagickWand *wand,
700  const MagickBooleanType stack)
701{
702  Image
703    *append_image;
704
705  assert(wand != (MagickWand *) NULL);
706  assert(wand->signature == MagickWandSignature);
707  if (wand->debug != MagickFalse)
708    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
709  if (wand->images == (Image *) NULL)
710    return((MagickWand *) NULL);
711  append_image=AppendImages(wand->images,stack,wand->exception);
712  if (append_image == (Image *) NULL)
713    return((MagickWand *) NULL);
714  return(CloneMagickWandFromImages(wand,append_image));
715}
716
717/*
718%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
719%                                                                             %
720%                                                                             %
721%                                                                             %
722%   M a g i c k A u t o G a m m a I m a g e                                   %
723%                                                                             %
724%                                                                             %
725%                                                                             %
726%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
727%
728%  MagickAutoGammaImage() extracts the 'mean' from the image and adjust the
729%  image to try make set its gamma appropriatally.
730%
731%  The format of the MagickAutoGammaImage method is:
732%
733%      MagickBooleanType MagickAutoGammaImage(MagickWand *wand)
734%
735%  A description of each parameter follows:
736%
737%    o wand: the magick wand.
738%
739*/
740WandExport MagickBooleanType MagickAutoGammaImage(MagickWand *wand)
741{
742  MagickBooleanType
743    status;
744
745  assert(wand != (MagickWand *) NULL);
746  assert(wand->signature == MagickWandSignature);
747  if (wand->debug != MagickFalse)
748    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
749  if (wand->images == (Image *) NULL)
750    ThrowWandException(WandError,"ContainsNoImages",wand->name);
751  status=AutoGammaImage(wand->images,wand->exception);
752  return(status);
753}
754
755/*
756%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
757%                                                                             %
758%                                                                             %
759%                                                                             %
760%   M a g i c k A u t o L e v e l I m a g e                                   %
761%                                                                             %
762%                                                                             %
763%                                                                             %
764%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
765%
766%  MagickAutoLevelImage() adjusts the levels of a particular image channel by
767%  scaling the minimum and maximum values to the full quantum range.
768%
769%  The format of the MagickAutoLevelImage method is:
770%
771%      MagickBooleanType MagickAutoLevelImage(MagickWand *wand)
772%
773%  A description of each parameter follows:
774%
775%    o wand: the magick wand.
776%
777*/
778WandExport MagickBooleanType MagickAutoLevelImage(MagickWand *wand)
779{
780  MagickBooleanType
781    status;
782
783  assert(wand != (MagickWand *) NULL);
784  assert(wand->signature == MagickWandSignature);
785  if (wand->debug != MagickFalse)
786    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
787  if (wand->images == (Image *) NULL)
788    ThrowWandException(WandError,"ContainsNoImages",wand->name);
789  status=AutoLevelImage(wand->images,wand->exception);
790  return(status);
791}
792
793/*
794%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
795%                                                                             %
796%                                                                             %
797%                                                                             %
798%   M a g i c k A u t o O r i e n t I m a g e                                 %
799%                                                                             %
800%                                                                             %
801%                                                                             %
802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
803%
804%  MagickAutoOrientImage() adjusts an image so that its orientation is suitable
805$  for viewing (i.e. top-left orientation).
806%
807%  The format of the MagickAutoOrientImage method is:
808%
809%      MagickBooleanType MagickAutoOrientImage(MagickWand *image)
810%
811%  A description of each parameter follows:
812%
813%    o wand: the magick wand.
814%
815*/
816WandExport MagickBooleanType MagickAutoOrientImage(MagickWand *wand)
817{
818
819  Image
820    *orient_image;
821
822  assert(wand != (MagickWand *) NULL);
823  assert(wand->signature == MagickWandSignature);
824  if (wand->debug != MagickFalse)
825    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
826  if (wand->images == (Image *) NULL)
827    ThrowWandException(WandError,"ContainsNoImages",wand->name);
828  orient_image=AutoOrientImage(wand->images,wand->images->orientation,
829    wand->exception);
830  if (orient_image == (Image *) NULL)
831    return(MagickFalse);
832  ReplaceImageInList(&wand->images,orient_image);
833  return(MagickTrue);
834}
835
836/*
837%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
838%                                                                             %
839%                                                                             %
840%                                                                             %
841%   M a g i c k B l a c k T h r e s h o l d I m a g e                         %
842%                                                                             %
843%                                                                             %
844%                                                                             %
845%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
846%
847%  MagickBlackThresholdImage() is like MagickThresholdImage() but  forces all
848%  pixels below the threshold into black while leaving all pixels above the
849%  threshold unchanged.
850%
851%  The format of the MagickBlackThresholdImage method is:
852%
853%      MagickBooleanType MagickBlackThresholdImage(MagickWand *wand,
854%        const PixelWand *threshold)
855%
856%  A description of each parameter follows:
857%
858%    o wand: the magick wand.
859%
860%    o threshold: the pixel wand.
861%
862*/
863WandExport MagickBooleanType MagickBlackThresholdImage(MagickWand *wand,
864  const PixelWand *threshold)
865{
866  char
867    thresholds[MagickPathExtent];
868
869  MagickBooleanType
870    status;
871
872  assert(wand != (MagickWand *) NULL);
873  assert(wand->signature == MagickWandSignature);
874  if (wand->debug != MagickFalse)
875    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
876  if (wand->images == (Image *) NULL)
877    ThrowWandException(WandError,"ContainsNoImages",wand->name);
878  (void) FormatLocaleString(thresholds,MagickPathExtent,
879    QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat,
880    PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold),
881    PixelGetBlueQuantum(threshold),PixelGetAlphaQuantum(threshold));
882  status=BlackThresholdImage(wand->images,thresholds,wand->exception);
883  return(status);
884}
885
886/*
887%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
888%                                                                             %
889%                                                                             %
890%                                                                             %
891%   M a g i c k B l u e S h i f t I m a g e                                   %
892%                                                                             %
893%                                                                             %
894%                                                                             %
895%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
896%
897%  MagickBlueShiftImage() mutes the colors of the image to simulate a scene at
898%  nighttime in the moonlight.
899%
900%  The format of the MagickBlueShiftImage method is:
901%
902%      MagickBooleanType MagickBlueShiftImage(MagickWand *wand,
903%        const double factor)
904%
905%  A description of each parameter follows:
906%
907%    o wand: the magick wand.
908%
909%    o factor: the blue shift factor (default 1.5)
910%
911*/
912WandExport MagickBooleanType MagickBlueShiftImage(MagickWand *wand,
913  const double factor)
914{
915  Image
916    *shift_image;
917
918  assert(wand != (MagickWand *) NULL);
919  assert(wand->signature == MagickWandSignature);
920  if (wand->debug != MagickFalse)
921    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
922  if (wand->images == (Image *) NULL)
923    ThrowWandException(WandError,"ContainsNoImages",wand->name);
924  shift_image=BlueShiftImage(wand->images,factor,wand->exception);
925  if (shift_image == (Image *) NULL)
926    return(MagickFalse);
927  ReplaceImageInList(&wand->images,shift_image);
928  return(MagickTrue);
929}
930
931/*
932%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
933%                                                                             %
934%                                                                             %
935%                                                                             %
936%   M a g i c k B l u r I m a g e                                             %
937%                                                                             %
938%                                                                             %
939%                                                                             %
940%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
941%
942%  MagickBlurImage() blurs an image.  We convolve the image with a
943%  gaussian operator of the given radius and standard deviation (sigma).
944%  For reasonable results, the radius should be larger than sigma.  Use a
945%  radius of 0 and BlurImage() selects a suitable radius for you.
946%
947%  The format of the MagickBlurImage method is:
948%
949%      MagickBooleanType MagickBlurImage(MagickWand *wand,const double radius,
950%        const double sigma)
951%
952%  A description of each parameter follows:
953%
954%    o wand: the magick wand.
955%
956%    o radius: the radius of the , in pixels, not counting the center
957%      pixel.
958%
959%    o sigma: the standard deviation of the , in pixels.
960%
961*/
962WandExport MagickBooleanType MagickBlurImage(MagickWand *wand,
963  const double radius,const double sigma)
964{
965  Image
966    *blur_image;
967
968  assert(wand != (MagickWand *) NULL);
969  assert(wand->signature == MagickWandSignature);
970  if (wand->debug != MagickFalse)
971    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
972  if (wand->images == (Image *) NULL)
973    ThrowWandException(WandError,"ContainsNoImages",wand->name);
974  blur_image=BlurImage(wand->images,radius,sigma,wand->exception);
975  if (blur_image == (Image *) NULL)
976    return(MagickFalse);
977  ReplaceImageInList(&wand->images,blur_image);
978  return(MagickTrue);
979}
980
981/*
982%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
983%                                                                             %
984%                                                                             %
985%                                                                             %
986%   M a g i c k B o r d e r I m a g e                                         %
987%                                                                             %
988%                                                                             %
989%                                                                             %
990%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
991%
992%  MagickBorderImage() surrounds the image with a border of the color defined
993%  by the bordercolor pixel wand.
994%
995%  The format of the MagickBorderImage method is:
996%
997%      MagickBooleanType MagickBorderImage(MagickWand *wand,
998%        const PixelWand *bordercolor,const size_t width,
999%        const size_t height,const CompositeOperator compose)
1000%
1001%  A description of each parameter follows:
1002%
1003%    o wand: the magick wand.
1004%
1005%    o bordercolor: the border color pixel wand.
1006%
1007%    o width: the border width.
1008%
1009%    o height: the border height.
1010%
1011%    o compose: the composite operator.
1012%
1013*/
1014WandExport MagickBooleanType MagickBorderImage(MagickWand *wand,
1015  const PixelWand *bordercolor,const size_t width,const size_t height,
1016  const CompositeOperator compose)
1017{
1018  Image
1019    *border_image;
1020
1021  RectangleInfo
1022    border_info;
1023
1024  assert(wand != (MagickWand *) NULL);
1025  assert(wand->signature == MagickWandSignature);
1026  if (wand->debug != MagickFalse)
1027    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1028  if (wand->images == (Image *) NULL)
1029    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1030  border_info.width=width;
1031  border_info.height=height;
1032  border_info.x=0;
1033  border_info.y=0;
1034  PixelGetQuantumPacket(bordercolor,&wand->images->border_color);
1035  border_image=BorderImage(wand->images,&border_info,compose,wand->exception);
1036  if (border_image == (Image *) NULL)
1037    return(MagickFalse);
1038  ReplaceImageInList(&wand->images,border_image);
1039  return(MagickTrue);
1040}
1041
1042/*
1043%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1044%                                                                             %
1045%                                                                             %
1046%                                                                             %
1047%   M a g i c k B r i g h t n e s s C o n t r a s t S t r e t c h I m a g e   %
1048%                                                                             %
1049%                                                                             %
1050%                                                                             %
1051%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1052%
1053%  Use MagickBrightnessContrastImage() to change the brightness and/or contrast
1054%  of an image.  It converts the brightness and contrast parameters into slope
1055%  and intercept and calls a polynomical function to apply to the image.
1056
1057%
1058%  The format of the MagickBrightnessContrastImage method is:
1059%
1060%      MagickBooleanType MagickBrightnessContrastImage(MagickWand *wand,
1061%        const double brightness,const double contrast)
1062%
1063%  A description of each parameter follows:
1064%
1065%    o wand: the magick wand.
1066%
1067%    o brightness: the brightness percent (-100 .. 100).
1068%
1069%    o contrast: the contrast percent (-100 .. 100).
1070%
1071*/
1072WandExport MagickBooleanType MagickBrightnessContrastImage(
1073  MagickWand *wand,const double brightness,const double contrast)
1074{
1075  MagickBooleanType
1076    status;
1077
1078  assert(wand != (MagickWand *) NULL);
1079  assert(wand->signature == MagickWandSignature);
1080  if (wand->debug != MagickFalse)
1081    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1082  if (wand->images == (Image *) NULL)
1083    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1084  status=BrightnessContrastImage(wand->images,brightness,contrast,
1085    wand->exception);
1086  return(status);
1087}
1088
1089/*
1090%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1091%                                                                             %
1092%                                                                             %
1093%                                                                             %
1094%   M a g i c k C h a n n e l F x I m a g e                                   %
1095%                                                                             %
1096%                                                                             %
1097%                                                                             %
1098%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1099%
1100%  MagickChannelFxImage() applies a channel expression to the specified image.
1101%  The expression consists of one or more channels, either mnemonic or numeric
1102%  (e.g. red, 1), separated by actions as follows:
1103%
1104%    <=>     exchange two channels (e.g. red<=>blue)
1105%    =>      transfer a channel to another (e.g. red=>green)
1106%    ,       separate channel operations (e.g. red, green)
1107%    |       read channels from next input image (e.g. red | green)
1108%    ;       write channels to next output image (e.g. red; green; blue)
1109%
1110%  A channel without a operation symbol implies extract. For example, to create
1111%  3 grayscale images from the red, green, and blue channels of an image, use:
1112%
1113%    -channel-fx "red; green; blue"
1114%
1115%  The format of the MagickChannelFxImage method is:
1116%
1117%      MagickWand *MagickChannelFxImage(MagickWand *wand,const char *expression)
1118%
1119%  A description of each parameter follows:
1120%
1121%    o wand: the magick wand.
1122%
1123%    o expression: the expression.
1124%
1125*/
1126WandExport MagickWand *MagickChannelFxImage(MagickWand *wand,
1127  const char *expression)
1128{
1129  Image
1130    *fx_image;
1131
1132  assert(wand != (MagickWand *) NULL);
1133  assert(wand->signature == MagickWandSignature);
1134  if (wand->debug != MagickFalse)
1135    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1136  if (wand->images == (Image *) NULL)
1137    return((MagickWand *) NULL);
1138  fx_image=ChannelFxImage(wand->images,expression,wand->exception);
1139  if (fx_image == (Image *) NULL)
1140    return((MagickWand *) NULL);
1141  return(CloneMagickWandFromImages(wand,fx_image));
1142}
1143
1144/*
1145%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1146%                                                                             %
1147%                                                                             %
1148%                                                                             %
1149%   M a g i c k C h a r c o a l I m a g e                                     %
1150%                                                                             %
1151%                                                                             %
1152%                                                                             %
1153%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1154%
1155%  MagickCharcoalImage() simulates a charcoal drawing.
1156%
1157%  The format of the MagickCharcoalImage method is:
1158%
1159%      MagickBooleanType MagickCharcoalImage(MagickWand *wand,
1160%        const double radius,const double sigma)
1161%
1162%  A description of each parameter follows:
1163%
1164%    o wand: the magick wand.
1165%
1166%    o radius: the radius of the Gaussian, in pixels, not counting the center
1167%      pixel.
1168%
1169%    o sigma: the standard deviation of the Gaussian, in pixels.
1170%
1171*/
1172WandExport MagickBooleanType MagickCharcoalImage(MagickWand *wand,
1173  const double radius,const double sigma)
1174{
1175  Image
1176    *charcoal_image;
1177
1178  assert(wand != (MagickWand *) NULL);
1179  assert(wand->signature == MagickWandSignature);
1180  if (wand->debug != MagickFalse)
1181    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1182  if (wand->images == (Image *) NULL)
1183    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1184  charcoal_image=CharcoalImage(wand->images,radius,sigma,wand->exception);
1185  if (charcoal_image == (Image *) NULL)
1186    return(MagickFalse);
1187  ReplaceImageInList(&wand->images,charcoal_image);
1188  return(MagickTrue);
1189}
1190
1191/*
1192%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1193%                                                                             %
1194%                                                                             %
1195%                                                                             %
1196%   M a g i c k C h o p I m a g e                                             %
1197%                                                                             %
1198%                                                                             %
1199%                                                                             %
1200%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1201%
1202%  MagickChopImage() removes a region of an image and collapses the image to
1203%  occupy the removed portion
1204%
1205%  The format of the MagickChopImage method is:
1206%
1207%      MagickBooleanType MagickChopImage(MagickWand *wand,
1208%        const size_t width,const size_t height,const ssize_t x,
1209%        const ssize_t y)
1210%
1211%  A description of each parameter follows:
1212%
1213%    o wand: the magick wand.
1214%
1215%    o width: the region width.
1216%
1217%    o height: the region height.
1218%
1219%    o x: the region x offset.
1220%
1221%    o y: the region y offset.
1222%
1223%
1224*/
1225WandExport MagickBooleanType MagickChopImage(MagickWand *wand,
1226  const size_t width,const size_t height,const ssize_t x,
1227  const ssize_t y)
1228{
1229  Image
1230    *chop_image;
1231
1232  RectangleInfo
1233    chop;
1234
1235  assert(wand != (MagickWand *) NULL);
1236  assert(wand->signature == MagickWandSignature);
1237  if (wand->debug != MagickFalse)
1238    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1239  if (wand->images == (Image *) NULL)
1240    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1241  chop.width=width;
1242  chop.height=height;
1243  chop.x=x;
1244  chop.y=y;
1245  chop_image=ChopImage(wand->images,&chop,wand->exception);
1246  if (chop_image == (Image *) NULL)
1247    return(MagickFalse);
1248  ReplaceImageInList(&wand->images,chop_image);
1249  return(MagickTrue);
1250}
1251
1252/*
1253%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1254%                                                                             %
1255%                                                                             %
1256%                                                                             %
1257%   M a g i c k C l a m p I m a g e                                           %
1258%                                                                             %
1259%                                                                             %
1260%                                                                             %
1261%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1262%
1263%  MagickClampImage() restricts the color range from 0 to the quantum depth.
1264%
1265%  The format of the MagickClampImage method is:
1266%
1267%      MagickBooleanType MagickClampImage(MagickWand *wand)
1268%
1269%  A description of each parameter follows:
1270%
1271%    o wand: the magick wand.
1272%
1273%    o channel: the channel.
1274%
1275*/
1276WandExport MagickBooleanType MagickClampImage(MagickWand *wand)
1277{
1278  assert(wand != (MagickWand *) NULL);
1279  assert(wand->signature == MagickWandSignature);
1280  if (wand->debug != MagickFalse)
1281    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1282  if (wand->images == (Image *) NULL)
1283    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1284  return(ClampImage(wand->images,wand->exception));
1285}
1286
1287/*
1288%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1289%                                                                             %
1290%                                                                             %
1291%                                                                             %
1292%   M a g i c k C l i p I m a g e                                             %
1293%                                                                             %
1294%                                                                             %
1295%                                                                             %
1296%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1297%
1298%  MagickClipImage() clips along the first path from the 8BIM profile, if
1299%  present.
1300%
1301%  The format of the MagickClipImage method is:
1302%
1303%      MagickBooleanType MagickClipImage(MagickWand *wand)
1304%
1305%  A description of each parameter follows:
1306%
1307%    o wand: the magick wand.
1308%
1309*/
1310WandExport MagickBooleanType MagickClipImage(MagickWand *wand)
1311{
1312  MagickBooleanType
1313    status;
1314
1315  assert(wand != (MagickWand *) NULL);
1316  assert(wand->signature == MagickWandSignature);
1317  if (wand->debug != MagickFalse)
1318    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1319  if (wand->images == (Image *) NULL)
1320    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1321  status=ClipImage(wand->images,wand->exception);
1322  return(status);
1323}
1324
1325/*
1326%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1327%                                                                             %
1328%                                                                             %
1329%                                                                             %
1330%   M a g i c k C l i p I m a g e P a t h                                     %
1331%                                                                             %
1332%                                                                             %
1333%                                                                             %
1334%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1335%
1336%  MagickClipImagePath() clips along the named paths from the 8BIM profile, if
1337%  present. Later operations take effect inside the path.  Id may be a number
1338%  if preceded with #, to work on a numbered path, e.g., "#1" to use the first
1339%  path.
1340%
1341%  The format of the MagickClipImagePath method is:
1342%
1343%      MagickBooleanType MagickClipImagePath(MagickWand *wand,
1344%        const char *pathname,const MagickBooleanType inside)
1345%
1346%  A description of each parameter follows:
1347%
1348%    o wand: the magick wand.
1349%
1350%    o pathname: name of clipping path resource. If name is preceded by #, use
1351%      clipping path numbered by name.
1352%
1353%    o inside: if non-zero, later operations take effect inside clipping path.
1354%      Otherwise later operations take effect outside clipping path.
1355%
1356*/
1357WandExport MagickBooleanType MagickClipImagePath(MagickWand *wand,
1358  const char *pathname,const MagickBooleanType inside)
1359{
1360  MagickBooleanType
1361    status;
1362
1363  assert(wand != (MagickWand *) NULL);
1364  assert(wand->signature == MagickWandSignature);
1365  if (wand->debug != MagickFalse)
1366    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1367  if (wand->images == (Image *) NULL)
1368    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1369  status=ClipImagePath(wand->images,pathname,inside,wand->exception);
1370  return(status);
1371}
1372
1373/*
1374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1375%                                                                             %
1376%                                                                             %
1377%                                                                             %
1378%   M a g i c k C l u t I m a g e                                             %
1379%                                                                             %
1380%                                                                             %
1381%                                                                             %
1382%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1383%
1384%  MagickClutImage() replaces colors in the image from a color lookup table.
1385%
1386%  The format of the MagickClutImage method is:
1387%
1388%      MagickBooleanType MagickClutImage(MagickWand *wand,
1389%        const MagickWand *clut_wand,const PixelInterpolateMethod method)
1390%
1391%  A description of each parameter follows:
1392%
1393%    o wand: the magick wand.
1394%
1395%    o clut_image: the clut image.
1396%
1397%    o method: the pixel interpolation method.
1398%
1399*/
1400WandExport MagickBooleanType MagickClutImage(MagickWand *wand,
1401  const MagickWand *clut_wand,const PixelInterpolateMethod method)
1402{
1403  MagickBooleanType
1404    status;
1405
1406  assert(wand != (MagickWand *) NULL);
1407  assert(wand->signature == MagickWandSignature);
1408  if (wand->debug != MagickFalse)
1409    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1410  if ((wand->images == (Image *) NULL) || (clut_wand->images == (Image *) NULL))
1411    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1412  status=ClutImage(wand->images,clut_wand->images,method,wand->exception);
1413  return(status);
1414}
1415
1416/*
1417%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1418%                                                                             %
1419%                                                                             %
1420%                                                                             %
1421%   M a g i c k C o a l e s c e I m a g e s                                   %
1422%                                                                             %
1423%                                                                             %
1424%                                                                             %
1425%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1426%
1427%  MagickCoalesceImages() composites a set of images while respecting any page
1428%  offsets and disposal methods.  GIF, MIFF, and MNG animation sequences
1429%  typically start with an image background and each subsequent image
1430%  varies in size and offset.  MagickCoalesceImages() returns a new sequence
1431%  where each image in the sequence is the same size as the first and
1432%  composited with the next image in the sequence.
1433%
1434%  The format of the MagickCoalesceImages method is:
1435%
1436%      MagickWand *MagickCoalesceImages(MagickWand *wand)
1437%
1438%  A description of each parameter follows:
1439%
1440%    o wand: the magick wand.
1441%
1442*/
1443WandExport MagickWand *MagickCoalesceImages(MagickWand *wand)
1444{
1445  Image
1446    *coalesce_image;
1447
1448  assert(wand != (MagickWand *) NULL);
1449  assert(wand->signature == MagickWandSignature);
1450  if (wand->debug != MagickFalse)
1451    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1452  if (wand->images == (Image *) NULL)
1453    return((MagickWand *) NULL);
1454  coalesce_image=CoalesceImages(wand->images,wand->exception);
1455  if (coalesce_image == (Image *) NULL)
1456    return((MagickWand *) NULL);
1457  return(CloneMagickWandFromImages(wand,coalesce_image));
1458}
1459
1460/*
1461%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1462%                                                                             %
1463%                                                                             %
1464%                                                                             %
1465%   M a g i c k C o l o r D e c i s i o n I m a g e                           %
1466%                                                                             %
1467%                                                                             %
1468%                                                                             %
1469%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1470%
1471%  MagickColorDecisionListImage() accepts a lightweight Color Correction
1472%  Collection (CCC) file which solely contains one or more color corrections
1473%  and applies the color correction to the image.  Here is a sample CCC file:
1474%
1475%    <ColorCorrectionCollection xmlns="urn:ASC:CDL:v1.2">
1476%          <ColorCorrection id="cc03345">
1477%                <SOPNode>
1478%                     <Slope> 0.9 1.2 0.5 </Slope>
1479%                     <Offset> 0.4 -0.5 0.6 </Offset>
1480%                     <Power> 1.0 0.8 1.5 </Power>
1481%                </SOPNode>
1482%                <SATNode>
1483%                     <Saturation> 0.85 </Saturation>
1484%                </SATNode>
1485%          </ColorCorrection>
1486%    </ColorCorrectionCollection>
1487%
1488%  which includes the offset, slope, and power for each of the RGB channels
1489%  as well as the saturation.
1490%
1491%  The format of the MagickColorDecisionListImage method is:
1492%
1493%      MagickBooleanType MagickColorDecisionListImage(MagickWand *wand,
1494%        const char *color_correction_collection)
1495%
1496%  A description of each parameter follows:
1497%
1498%    o wand: the magick wand.
1499%
1500%    o color_correction_collection: the color correction collection in XML.
1501%
1502*/
1503WandExport MagickBooleanType MagickColorDecisionListImage(MagickWand *wand,
1504  const char *color_correction_collection)
1505{
1506  MagickBooleanType
1507    status;
1508
1509  assert(wand != (MagickWand *) NULL);
1510  assert(wand->signature == MagickWandSignature);
1511  if (wand->debug != MagickFalse)
1512    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1513  if (wand->images == (Image *) NULL)
1514    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1515  status=ColorDecisionListImage(wand->images,color_correction_collection,
1516    wand->exception);
1517  return(status);
1518}
1519
1520/*
1521%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1522%                                                                             %
1523%                                                                             %
1524%                                                                             %
1525%   M a g i c k C o l o r i z e I m a g e                                     %
1526%                                                                             %
1527%                                                                             %
1528%                                                                             %
1529%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1530%
1531%  MagickColorizeImage() blends the fill color with each pixel in the image.
1532%
1533%  The format of the MagickColorizeImage method is:
1534%
1535%      MagickBooleanType MagickColorizeImage(MagickWand *wand,
1536%        const PixelWand *colorize,const PixelWand *blend)
1537%
1538%  A description of each parameter follows:
1539%
1540%    o wand: the magick wand.
1541%
1542%    o colorize: the colorize pixel wand.
1543%
1544%    o alpha: the alpha pixel wand.
1545%
1546*/
1547WandExport MagickBooleanType MagickColorizeImage(MagickWand *wand,
1548  const PixelWand *colorize,const PixelWand *blend)
1549{
1550  char
1551    percent_blend[MagickPathExtent];
1552
1553  Image
1554    *colorize_image;
1555
1556  PixelInfo
1557    target;
1558
1559  assert(wand != (MagickWand *) NULL);
1560  assert(wand->signature == MagickWandSignature);
1561  if (wand->debug != MagickFalse)
1562    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1563  if (wand->images == (Image *) NULL)
1564    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1565  GetPixelInfo(wand->images,&target);
1566  if (target.colorspace != CMYKColorspace)
1567    (void) FormatLocaleString(percent_blend,MagickPathExtent,
1568      "%g,%g,%g,%g",(double) (100.0*QuantumScale*
1569      PixelGetRedQuantum(blend)),(double) (100.0*QuantumScale*
1570      PixelGetGreenQuantum(blend)),(double) (100.0*QuantumScale*
1571      PixelGetBlueQuantum(blend)),(double) (100.0*QuantumScale*
1572      PixelGetAlphaQuantum(blend)));
1573  else
1574    (void) FormatLocaleString(percent_blend,MagickPathExtent,
1575      "%g,%g,%g,%g,%g",(double) (100.0*QuantumScale*
1576      PixelGetRedQuantum(blend)),(double) (100.0*QuantumScale*
1577      PixelGetGreenQuantum(blend)),(double) (100.0*QuantumScale*
1578      PixelGetBlueQuantum(blend)),(double) (100.0*QuantumScale*
1579      PixelGetBlackQuantum(blend)),(double) (100.0*QuantumScale*
1580      PixelGetAlphaQuantum(blend)));
1581  target=PixelGetPixel(colorize);
1582  colorize_image=ColorizeImage(wand->images,percent_blend,&target,
1583    wand->exception);
1584  if (colorize_image == (Image *) NULL)
1585    return(MagickFalse);
1586  ReplaceImageInList(&wand->images,colorize_image);
1587  return(MagickTrue);
1588}
1589
1590/*
1591%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1592%                                                                             %
1593%                                                                             %
1594%                                                                             %
1595%   M a g i c k C o l o r M a t r i x I m a g e                               %
1596%                                                                             %
1597%                                                                             %
1598%                                                                             %
1599%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1600%
1601%  MagickColorMatrixImage() apply color transformation to an image. The method
1602%  permits saturation changes, hue rotation, luminance to alpha, and various
1603%  other effects.  Although variable-sized transformation matrices can be used,
1604%  typically one uses a 5x5 matrix for an RGBA image and a 6x6 for CMYKA
1605%  (or RGBA with offsets).  The matrix is similar to those used by Adobe Flash
1606%  except offsets are in column 6 rather than 5 (in support of CMYKA images)
1607%  and offsets are normalized (divide Flash offset by 255).
1608%
1609%  The format of the MagickColorMatrixImage method is:
1610%
1611%      MagickBooleanType MagickColorMatrixImage(MagickWand *wand,
1612%        const KernelInfo *color_matrix)
1613%
1614%  A description of each parameter follows:
1615%
1616%    o wand: the magick wand.
1617%
1618%    o color_matrix:  the color matrix.
1619%
1620*/
1621WandExport MagickBooleanType MagickColorMatrixImage(MagickWand *wand,
1622  const KernelInfo *color_matrix)
1623{
1624  Image
1625    *color_image;
1626
1627  assert(wand != (MagickWand *) NULL);
1628  assert(wand->signature == MagickWandSignature);
1629  if (wand->debug != MagickFalse)
1630    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1631  if (color_matrix == (const KernelInfo *) NULL)
1632    return(MagickFalse);
1633  if (wand->images == (Image *) NULL)
1634    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1635  color_image=ColorMatrixImage(wand->images,color_matrix,wand->exception);
1636  if (color_image == (Image *) NULL)
1637    return(MagickFalse);
1638  ReplaceImageInList(&wand->images,color_image);
1639  return(MagickTrue);
1640}
1641
1642/*
1643%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1644%                                                                             %
1645%                                                                             %
1646%                                                                             %
1647%   M a g i c k C o m b i n e I m a g e s                                     %
1648%                                                                             %
1649%                                                                             %
1650%                                                                             %
1651%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1652%
1653%  MagickCombineImages() combines one or more images into a single image.  The
1654%  grayscale value of the pixels of each image in the sequence is assigned in
1655%  order to the specified  hannels of the combined image.   The typical
1656%  ordering would be image 1 => Red, 2 => Green, 3 => Blue, etc.
1657%
1658%  The format of the MagickCombineImages method is:
1659%
1660%      MagickWand *MagickCombineImages(MagickWand *wand,
1661%        const ColorspaceType colorspace)
1662%
1663%  A description of each parameter follows:
1664%
1665%    o wand: the magick wand.
1666%
1667%    o colorspace: the colorspace.
1668%
1669*/
1670WandExport MagickWand *MagickCombineImages(MagickWand *wand,
1671  const ColorspaceType colorspace)
1672{
1673  Image
1674    *combine_image;
1675
1676  assert(wand != (MagickWand *) NULL);
1677  assert(wand->signature == MagickWandSignature);
1678  if (wand->debug != MagickFalse)
1679    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1680  if (wand->images == (Image *) NULL)
1681    return((MagickWand *) NULL);
1682  combine_image=CombineImages(wand->images,colorspace,wand->exception);
1683  if (combine_image == (Image *) NULL)
1684    return((MagickWand *) NULL);
1685  return(CloneMagickWandFromImages(wand,combine_image));
1686}
1687
1688/*
1689%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1690%                                                                             %
1691%                                                                             %
1692%                                                                             %
1693%   M a g i c k C o m m e n t I m a g e                                       %
1694%                                                                             %
1695%                                                                             %
1696%                                                                             %
1697%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1698%
1699%  MagickCommentImage() adds a comment to your image.
1700%
1701%  The format of the MagickCommentImage method is:
1702%
1703%      MagickBooleanType MagickCommentImage(MagickWand *wand,
1704%        const char *comment)
1705%
1706%  A description of each parameter follows:
1707%
1708%    o wand: the magick wand.
1709%
1710%    o comment: the image comment.
1711%
1712*/
1713WandExport MagickBooleanType MagickCommentImage(MagickWand *wand,
1714  const char *comment)
1715{
1716  MagickBooleanType
1717    status;
1718
1719  assert(wand != (MagickWand *) NULL);
1720  assert(wand->signature == MagickWandSignature);
1721  if (wand->debug != MagickFalse)
1722    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1723  if (wand->images == (Image *) NULL)
1724    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1725  status=SetImageProperty(wand->images,"comment",comment,wand->exception);
1726  return(status);
1727}
1728
1729/*
1730%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1731%                                                                             %
1732%                                                                             %
1733%                                                                             %
1734%   M a g i c k C o m p a r e I m a g e L a y e r s                           %
1735%                                                                             %
1736%                                                                             %
1737%                                                                             %
1738%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1739%
1740%  MagickCompareImagesLayers() compares each image with the next in a sequence
1741%  and returns the maximum bounding region of any pixel differences it
1742%  discovers.
1743%
1744%  The format of the MagickCompareImagesLayers method is:
1745%
1746%      MagickWand *MagickCompareImagesLayers(MagickWand *wand,
1747%        const LayerMethod method)
1748%
1749%  A description of each parameter follows:
1750%
1751%    o wand: the magick wand.
1752%
1753%    o method: the compare method.
1754%
1755*/
1756WandExport MagickWand *MagickCompareImagesLayers(MagickWand *wand,
1757  const LayerMethod method)
1758{
1759  Image
1760    *layers_image;
1761
1762  assert(wand != (MagickWand *) NULL);
1763  assert(wand->signature == MagickWandSignature);
1764  if (wand->debug != MagickFalse)
1765    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1766  if (wand->images == (Image *) NULL)
1767    return((MagickWand *) NULL);
1768  layers_image=CompareImagesLayers(wand->images,method,wand->exception);
1769  if (layers_image == (Image *) NULL)
1770    return((MagickWand *) NULL);
1771  return(CloneMagickWandFromImages(wand,layers_image));
1772}
1773
1774/*
1775%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1776%                                                                             %
1777%                                                                             %
1778%                                                                             %
1779%   M a g i c k C o m p a r e I m a g e s                                     %
1780%                                                                             %
1781%                                                                             %
1782%                                                                             %
1783%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1784%
1785%  MagickCompareImages() compares an image to a reconstructed image and returns
1786%  the specified difference image.
1787%
1788%  The format of the MagickCompareImages method is:
1789%
1790%      MagickWand *MagickCompareImages(MagickWand *wand,
1791%        const MagickWand *reference,const MetricType metric,
1792%        double *distortion)
1793%
1794%  A description of each parameter follows:
1795%
1796%    o wand: the magick wand.
1797%
1798%    o reference: the reference wand.
1799%
1800%    o metric: the metric.
1801%
1802%    o distortion: the computed distortion between the images.
1803%
1804*/
1805WandExport MagickWand *MagickCompareImages(MagickWand *wand,
1806  const MagickWand *reference,const MetricType metric,double *distortion)
1807{
1808  Image
1809    *compare_image;
1810
1811
1812  assert(wand != (MagickWand *) NULL);
1813  assert(wand->signature == MagickWandSignature);
1814  if (wand->debug != MagickFalse)
1815    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1816  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
1817    {
1818      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
1819        "ContainsNoImages","`%s'",wand->name);
1820      return((MagickWand *) NULL);
1821    }
1822  compare_image=CompareImages(wand->images,reference->images,metric,distortion,
1823    wand->exception);
1824  if (compare_image == (Image *) NULL)
1825    return((MagickWand *) NULL);
1826  return(CloneMagickWandFromImages(wand,compare_image));
1827}
1828
1829/*
1830%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1831%                                                                             %
1832%                                                                             %
1833%                                                                             %
1834%   M a g i c k C o m p o s i t e I m a g e                                   %
1835%                                                                             %
1836%                                                                             %
1837%                                                                             %
1838%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1839%
1840%  MagickCompositeImage() composite one image onto another at the specified
1841%  offset.
1842%
1843%  The format of the MagickCompositeImage method is:
1844%
1845%      MagickBooleanType MagickCompositeImage(MagickWand *wand,
1846%        const MagickWand *source_wand,const CompositeOperator compose,
1847%        const MagickBooleanType clip_to_self,const ssize_t x,const ssize_t y)
1848%
1849%  A description of each parameter follows:
1850%
1851%    o wand: the magick wand holding the destination images
1852%
1853%    o source_image: the magick wand holding source image.
1854%
1855%    o compose: This operator affects how the composite is applied to the
1856%      image.  The default is Over.  These are some of the compose methods
1857%      availble.
1858%
1859%        OverCompositeOp       InCompositeOp         OutCompositeOp
1860%        AtopCompositeOp       XorCompositeOp        PlusCompositeOp
1861%        MinusCompositeOp      AddCompositeOp        SubtractCompositeOp
1862%        DifferenceCompositeOp BumpmapCompositeOp    CopyCompositeOp
1863%        DisplaceCompositeOp
1864%
1865%    o clip_to_self: set to MagickTrue to limit composition to area composed.
1866%
1867%    o x: the column offset of the composited image.
1868%
1869%    o y: the row offset of the composited image.
1870%
1871*/
1872WandExport MagickBooleanType MagickCompositeImage(MagickWand *wand,
1873  const MagickWand *source_wand,const CompositeOperator compose,
1874  const MagickBooleanType clip_to_self,const ssize_t x,const ssize_t y)
1875{
1876  MagickBooleanType
1877    status;
1878
1879  assert(wand != (MagickWand *) NULL);
1880  assert(wand->signature == MagickWandSignature);
1881  if (wand->debug != MagickFalse)
1882    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1883  if ((wand->images == (Image *) NULL) ||
1884      (source_wand->images == (Image *) NULL))
1885    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1886  status=CompositeImage(wand->images,source_wand->images,compose,clip_to_self,
1887    x,y,wand->exception);
1888  return(status);
1889}
1890
1891/*
1892%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1893%                                                                             %
1894%                                                                             %
1895%                                                                             %
1896%   M a g i c k C o m p o s i t e I m a g e G r a v i t y                     %
1897%                                                                             %
1898%                                                                             %
1899%                                                                             %
1900%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1901%
1902%  MagickCompositeImageGravity() composite one image onto another using the
1903%  specified gravity.
1904%
1905%  The format of the MagickCompositeImageGravity method is:
1906%
1907%      MagickBooleanType MagickCompositeImageGravity(MagickWand *wand,
1908%        const MagickWand *source_wand,const CompositeOperator compose,
1909%        const GravityType gravity)
1910%
1911%  A description of each parameter follows:
1912%
1913%    o wand: the magick wand holding the destination images
1914%
1915%    o source_image: the magick wand holding source image.
1916%
1917%    o compose: This operator affects how the composite is applied to the
1918%      image.  The default is Over.  These are some of the compose methods
1919%      availble.
1920%
1921%        OverCompositeOp       InCompositeOp         OutCompositeOp
1922%        AtopCompositeOp       XorCompositeOp        PlusCompositeOp
1923%        MinusCompositeOp      AddCompositeOp        SubtractCompositeOp
1924%        DifferenceCompositeOp BumpmapCompositeOp    CopyCompositeOp
1925%        DisplaceCompositeOp
1926%
1927%    o gravity: positioning gravity (NorthWestGravity, NorthGravity,
1928%               NorthEastGravity, WestGravity, CenterGravity,
1929%               EastGravity, SouthWestGravity, SouthGravity,
1930%               SouthEastGravity)
1931%
1932*/
1933WandExport MagickBooleanType MagickCompositeImageGravity(MagickWand *wand,
1934  const MagickWand *source_wand,const CompositeOperator compose,
1935  const GravityType gravity)
1936{
1937  MagickBooleanType
1938    status;
1939
1940  RectangleInfo
1941    geometry;
1942
1943  assert(wand != (MagickWand *) NULL);
1944  assert(wand->signature == MagickWandSignature);
1945  if (wand->debug != MagickFalse)
1946    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1947  if ((wand->images == (Image *) NULL) ||
1948      (source_wand->images == (Image *) NULL))
1949    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1950  SetGeometry(source_wand->images,&geometry);
1951  GravityAdjustGeometry(wand->images->columns,wand->images->rows,gravity,
1952    &geometry);
1953  status=CompositeImage(wand->images,source_wand->images,compose,MagickTrue,
1954    geometry.x,geometry.y,wand->exception);
1955  return(status);
1956}
1957
1958/*
1959%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1960%                                                                             %
1961%                                                                             %
1962%                                                                             %
1963%   M a g i c k C o m p o s i t e L a y e r s                                 %
1964%                                                                             %
1965%                                                                             %
1966%                                                                             %
1967%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1968%
1969%  MagickCompositeLayers() composite the images in the source wand over the
1970%  images in the destination wand in sequence, starting with the current
1971%  image in both lists.
1972%
1973%  Each layer from the two image lists are composted together until the end of
1974%  one of the image lists is reached.  The offset of each composition is also
1975%  adjusted to match the virtual canvas offsets of each layer. As such the
1976%  given offset is relative to the virtual canvas, and not the actual image.
1977%
1978%  Composition uses given x and y offsets, as the 'origin' location of the
1979%  source images virtual canvas (not the real image) allowing you to compose a
1980%  list of 'layer images' into the destiantioni images.  This makes it well
1981%  sutiable for directly composing 'Clears Frame Animations' or 'Coaleased
1982%  Animations' onto a static or other 'Coaleased Animation' destination image
1983%  list.  GIF disposal handling is not looked at.
1984%
1985%  Special case:- If one of the image sequences is the last image (just a
1986%  single image remaining), that image is repeatally composed with all the
1987%  images in the other image list.  Either the source or destination lists may
1988%  be the single image, for this situation.
1989%
1990%  In the case of a single destination image (or last image given), that image
1991%  will ve cloned to match the number of images remaining in the source image
1992%  list.
1993%
1994%  This is equivelent to the "-layer Composite" Shell API operator.
1995%
1996%  The format of the MagickCompositeLayers method is:
1997%
1998%      MagickBooleanType MagickCompositeLayers(MagickWand *wand,
1999%        const MagickWand *source_wand, const CompositeOperator compose,
2000%        const ssize_t x,const ssize_t y)
2001%
2002%  A description of each parameter follows:
2003%
2004%    o wand: the magick wand holding destaintion images
2005%
2006%    o source_wand: the wand holding the source images
2007%
2008%    o compose, x, y:  composition arguments
2009%
2010*/
2011WandExport MagickBooleanType MagickCompositeLayers(MagickWand *wand,
2012  const MagickWand *source_wand,const CompositeOperator compose,
2013  const ssize_t x,const ssize_t y)
2014{
2015  MagickBooleanType
2016    status;
2017
2018  assert(wand != (MagickWand *) NULL);
2019  assert(wand->signature == MagickWandSignature);
2020  if (wand->debug != MagickFalse)
2021    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2022  if ((wand->images == (Image *) NULL) ||
2023      (source_wand->images == (Image *) NULL))
2024    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2025  CompositeLayers(wand->images,compose,source_wand->images,x,y,wand->exception);
2026  status=MagickTrue;  /* FUTURE: determine status from exceptions */
2027  return(status);
2028}
2029
2030/*
2031%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2032%                                                                             %
2033%                                                                             %
2034%                                                                             %
2035%   M a g i c k C o n t r a s t I m a g e                                     %
2036%                                                                             %
2037%                                                                             %
2038%                                                                             %
2039%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2040%
2041%  MagickContrastImage() enhances the intensity differences between the lighter
2042%  and darker elements of the image.  Set sharpen to a value other than 0 to
2043%  increase the image contrast otherwise the contrast is reduced.
2044%
2045%  The format of the MagickContrastImage method is:
2046%
2047%      MagickBooleanType MagickContrastImage(MagickWand *wand,
2048%        const MagickBooleanType sharpen)
2049%
2050%  A description of each parameter follows:
2051%
2052%    o wand: the magick wand.
2053%
2054%    o sharpen: Increase or decrease image contrast.
2055%
2056%
2057*/
2058WandExport MagickBooleanType MagickContrastImage(MagickWand *wand,
2059  const MagickBooleanType sharpen)
2060{
2061  MagickBooleanType
2062    status;
2063
2064  assert(wand != (MagickWand *) NULL);
2065  assert(wand->signature == MagickWandSignature);
2066  if (wand->debug != MagickFalse)
2067    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2068  if (wand->images == (Image *) NULL)
2069    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2070  status=ContrastImage(wand->images,sharpen,wand->exception);
2071  return(status);
2072}
2073
2074/*
2075%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2076%                                                                             %
2077%                                                                             %
2078%                                                                             %
2079%   M a g i c k C o n t r a s t S t r e t c h I m a g e                       %
2080%                                                                             %
2081%                                                                             %
2082%                                                                             %
2083%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2084%
2085%  MagickContrastStretchImage() enhances the contrast of a color image by
2086%  adjusting the pixels color to span the entire range of colors available.
2087%  You can also reduce the influence of a particular channel with a gamma
2088%  value of 0.
2089%
2090%  The format of the MagickContrastStretchImage method is:
2091%
2092%      MagickBooleanType MagickContrastStretchImage(MagickWand *wand,
2093%        const double black_point,const double white_point)
2094%
2095%  A description of each parameter follows:
2096%
2097%    o wand: the magick wand.
2098%
2099%    o black_point: the black point.
2100%
2101%    o white_point: the white point.
2102%
2103*/
2104WandExport MagickBooleanType MagickContrastStretchImage(MagickWand *wand,
2105  const double black_point,const double white_point)
2106{
2107  MagickBooleanType
2108    status;
2109
2110  assert(wand != (MagickWand *) NULL);
2111  assert(wand->signature == MagickWandSignature);
2112  if (wand->debug != MagickFalse)
2113    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2114  if (wand->images == (Image *) NULL)
2115    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2116  status=ContrastStretchImage(wand->images,black_point,white_point,
2117    wand->exception);
2118  return(status);
2119}
2120
2121/*
2122%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2123%                                                                             %
2124%                                                                             %
2125%                                                                             %
2126%   M a g i c k C o n v o l v e I m a g e                                     %
2127%                                                                             %
2128%                                                                             %
2129%                                                                             %
2130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2131%
2132%  MagickConvolveImage() applies a custom convolution kernel to the image.
2133%
2134%  The format of the MagickConvolveImage method is:
2135%
2136%      MagickBooleanType MagickConvolveImage(MagickWand *wand,
2137%        const KernelInfo *kernel)
2138%
2139%  A description of each parameter follows:
2140%
2141%    o wand: the magick wand.
2142%
2143%    o kernel: An array of doubles representing the convolution kernel.
2144%
2145*/
2146WandExport MagickBooleanType MagickConvolveImage(MagickWand *wand,
2147  const KernelInfo *kernel)
2148{
2149  Image
2150    *filter_image;
2151
2152  assert(wand != (MagickWand *) NULL);
2153  assert(wand->signature == MagickWandSignature);
2154  if (wand->debug != MagickFalse)
2155    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2156  if (kernel == (const KernelInfo *) NULL)
2157    return(MagickFalse);
2158  if (wand->images == (Image *) NULL)
2159    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2160  filter_image=ConvolveImage(wand->images,kernel,wand->exception);
2161  if (filter_image == (Image *) NULL)
2162    return(MagickFalse);
2163  ReplaceImageInList(&wand->images,filter_image);
2164  return(MagickTrue);
2165}
2166
2167/*
2168%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2169%                                                                             %
2170%                                                                             %
2171%                                                                             %
2172%   M a g i c k C r o p I m a g e                                             %
2173%                                                                             %
2174%                                                                             %
2175%                                                                             %
2176%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2177%
2178%  MagickCropImage() extracts a region of the image.
2179%
2180%  The format of the MagickCropImage method is:
2181%
2182%      MagickBooleanType MagickCropImage(MagickWand *wand,
2183%        const size_t width,const size_t height,const ssize_t x,const ssize_t y)
2184%
2185%  A description of each parameter follows:
2186%
2187%    o wand: the magick wand.
2188%
2189%    o width: the region width.
2190%
2191%    o height: the region height.
2192%
2193%    o x: the region x-offset.
2194%
2195%    o y: the region y-offset.
2196%
2197*/
2198WandExport MagickBooleanType MagickCropImage(MagickWand *wand,
2199  const size_t width,const size_t height,const ssize_t x,const ssize_t y)
2200{
2201  Image
2202    *crop_image;
2203
2204  RectangleInfo
2205    crop;
2206
2207  assert(wand != (MagickWand *) NULL);
2208  assert(wand->signature == MagickWandSignature);
2209  if (wand->debug != MagickFalse)
2210    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2211  if (wand->images == (Image *) NULL)
2212    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2213  crop.width=width;
2214  crop.height=height;
2215  crop.x=x;
2216  crop.y=y;
2217  crop_image=CropImage(wand->images,&crop,wand->exception);
2218  if (crop_image == (Image *) NULL)
2219    return(MagickFalse);
2220  ReplaceImageInList(&wand->images,crop_image);
2221  return(MagickTrue);
2222}
2223
2224/*
2225%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2226%                                                                             %
2227%                                                                             %
2228%                                                                             %
2229%   M a g i c k C y c l e C o l o r m a p I m a g e                           %
2230%                                                                             %
2231%                                                                             %
2232%                                                                             %
2233%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2234%
2235%  MagickCycleColormapImage() displaces an image's colormap by a given number
2236%  of positions.  If you cycle the colormap a number of times you can produce
2237%  a psychodelic effect.
2238%
2239%  The format of the MagickCycleColormapImage method is:
2240%
2241%      MagickBooleanType MagickCycleColormapImage(MagickWand *wand,
2242%        const ssize_t displace)
2243%
2244%  A description of each parameter follows:
2245%
2246%    o wand: the magick wand.
2247%
2248%    o pixel_wand: the pixel wand.
2249%
2250*/
2251WandExport MagickBooleanType MagickCycleColormapImage(MagickWand *wand,
2252  const ssize_t displace)
2253{
2254  MagickBooleanType
2255    status;
2256
2257  assert(wand != (MagickWand *) NULL);
2258  assert(wand->signature == MagickWandSignature);
2259  if (wand->debug != MagickFalse)
2260    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2261  if (wand->images == (Image *) NULL)
2262    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2263  status=CycleColormapImage(wand->images,displace,wand->exception);
2264  return(status);
2265}
2266
2267/*
2268%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2269%                                                                             %
2270%                                                                             %
2271%                                                                             %
2272%   M a g i c k C o n s t i t u t e I m a g e                                 %
2273%                                                                             %
2274%                                                                             %
2275%                                                                             %
2276%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2277%
2278%  MagickConstituteImage() adds an image to the wand comprised of the pixel
2279%  data you supply.  The pixel data must be in scanline order top-to-bottom.
2280%  The data can be char, short int, int, float, or double.  Float and double
2281%  require the pixels to be normalized [0..1], otherwise [0..Max],  where Max
2282%  is the maximum value the type can accomodate (e.g. 255 for char).  For
2283%  example, to create a 640x480 image from unsigned red-green-blue character
2284%  data, use
2285%
2286%      MagickConstituteImage(wand,640,480,"RGB",CharPixel,pixels);
2287%
2288%  The format of the MagickConstituteImage method is:
2289%
2290%      MagickBooleanType MagickConstituteImage(MagickWand *wand,
2291%        const size_t columns,const size_t rows,const char *map,
2292%        const StorageType storage,void *pixels)
2293%
2294%  A description of each parameter follows:
2295%
2296%    o wand: the magick wand.
2297%
2298%    o columns: width in pixels of the image.
2299%
2300%    o rows: height in pixels of the image.
2301%
2302%    o map:  This string reflects the expected ordering of the pixel array.
2303%      It can be any combination or order of R = red, G = green, B = blue,
2304%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
2305%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2306%      P = pad.
2307%
2308%    o storage: Define the data type of the pixels.  Float and double types are
2309%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
2310%      these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel,
2311%      LongPixel, QuantumPixel, or ShortPixel.
2312%
2313%    o pixels: This array of values contain the pixel components as defined by
2314%      map and type.  You must preallocate this array where the expected
2315%      length varies depending on the values of width, height, map, and type.
2316%
2317%
2318*/
2319WandExport MagickBooleanType MagickConstituteImage(MagickWand *wand,
2320  const size_t columns,const size_t rows,const char *map,
2321  const StorageType storage,const void *pixels)
2322{
2323  Image
2324    *images;
2325
2326  assert(wand != (MagickWand *) NULL);
2327  assert(wand->signature == MagickWandSignature);
2328  if (wand->debug != MagickFalse)
2329    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2330  images=ConstituteImage(columns,rows,map,storage,pixels,wand->exception);
2331  if (images == (Image *) NULL)
2332    return(MagickFalse);
2333  return(InsertImageInWand(wand,images));
2334}
2335
2336/*
2337%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2338%                                                                             %
2339%                                                                             %
2340%                                                                             %
2341%   M a g i c k D e c i p h e r I m a g e                                     %
2342%                                                                             %
2343%                                                                             %
2344%                                                                             %
2345%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2346%
2347%  MagickDecipherImage() converts cipher pixels to plain pixels.
2348%
2349%  The format of the MagickDecipherImage method is:
2350%
2351%      MagickBooleanType MagickDecipherImage(MagickWand *wand,
2352%        const char *passphrase)
2353%
2354%  A description of each parameter follows:
2355%
2356%    o wand: the magick wand.
2357%
2358%    o passphrase: the passphrase.
2359%
2360*/
2361WandExport MagickBooleanType MagickDecipherImage(MagickWand *wand,
2362  const char *passphrase)
2363{
2364  assert(wand != (MagickWand *) NULL);
2365  assert(wand->signature == MagickWandSignature);
2366  if (wand->debug != MagickFalse)
2367    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2368  if (wand->images == (Image *) NULL)
2369    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2370  return(DecipherImage(wand->images,passphrase,wand->exception));
2371}
2372
2373/*
2374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2375%                                                                             %
2376%                                                                             %
2377%                                                                             %
2378%   M a g i c k D e c o n s t r u c t I m a g e s                             %
2379%                                                                             %
2380%                                                                             %
2381%                                                                             %
2382%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2383%
2384%  MagickDeconstructImages() compares each image with the next in a sequence
2385%  and returns the maximum bounding region of any pixel differences it
2386%  discovers.
2387%
2388%  The format of the MagickDeconstructImages method is:
2389%
2390%      MagickWand *MagickDeconstructImages(MagickWand *wand)
2391%
2392%  A description of each parameter follows:
2393%
2394%    o wand: the magick wand.
2395%
2396*/
2397WandExport MagickWand *MagickDeconstructImages(MagickWand *wand)
2398{
2399  Image
2400    *deconstruct_image;
2401
2402  assert(wand != (MagickWand *) NULL);
2403  assert(wand->signature == MagickWandSignature);
2404  if (wand->debug != MagickFalse)
2405    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2406  if (wand->images == (Image *) NULL)
2407    return((MagickWand *) NULL);
2408  deconstruct_image=CompareImagesLayers(wand->images,CompareAnyLayer,
2409    wand->exception);
2410  if (deconstruct_image == (Image *) NULL)
2411    return((MagickWand *) NULL);
2412  return(CloneMagickWandFromImages(wand,deconstruct_image));
2413}
2414
2415/*
2416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2417%                                                                             %
2418%                                                                             %
2419%                                                                             %
2420%     M a g i c k D e s k e w I m a g e                                       %
2421%                                                                             %
2422%                                                                             %
2423%                                                                             %
2424%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2425%
2426%  MagickDeskewImage() removes skew from the image.  Skew is an artifact that
2427%  occurs in scanned images because of the camera being misaligned,
2428%  imperfections in the scanning or surface, or simply because the paper was
2429%  not placed completely flat when scanned.
2430%
2431%  The format of the MagickDeskewImage method is:
2432%
2433%      MagickBooleanType MagickDeskewImage(MagickWand *wand,
2434%        const double threshold)
2435%
2436%  A description of each parameter follows:
2437%
2438%    o wand: the magick wand.
2439%
2440%    o threshold: separate background from foreground.
2441%
2442*/
2443WandExport MagickBooleanType MagickDeskewImage(MagickWand *wand,
2444  const double threshold)
2445{
2446  Image
2447    *sepia_image;
2448
2449  assert(wand != (MagickWand *) NULL);
2450  assert(wand->signature == MagickWandSignature);
2451  if (wand->debug != MagickFalse)
2452    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2453  if (wand->images == (Image *) NULL)
2454    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2455  sepia_image=DeskewImage(wand->images,threshold,wand->exception);
2456  if (sepia_image == (Image *) NULL)
2457    return(MagickFalse);
2458  ReplaceImageInList(&wand->images,sepia_image);
2459  return(MagickTrue);
2460}
2461
2462/*
2463%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2464%                                                                             %
2465%                                                                             %
2466%                                                                             %
2467%     M a g i c k D e s p e c k l e I m a g e                                 %
2468%                                                                             %
2469%                                                                             %
2470%                                                                             %
2471%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2472%
2473%  MagickDespeckleImage() reduces the speckle noise in an image while
2474%  perserving the edges of the original image.
2475%
2476%  The format of the MagickDespeckleImage method is:
2477%
2478%      MagickBooleanType MagickDespeckleImage(MagickWand *wand)
2479%
2480%  A description of each parameter follows:
2481%
2482%    o wand: the magick wand.
2483%
2484*/
2485WandExport MagickBooleanType MagickDespeckleImage(MagickWand *wand)
2486{
2487  Image
2488    *despeckle_image;
2489
2490  assert(wand != (MagickWand *) NULL);
2491  assert(wand->signature == MagickWandSignature);
2492  if (wand->debug != MagickFalse)
2493    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2494  if (wand->images == (Image *) NULL)
2495    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2496  despeckle_image=DespeckleImage(wand->images,wand->exception);
2497  if (despeckle_image == (Image *) NULL)
2498    return(MagickFalse);
2499  ReplaceImageInList(&wand->images,despeckle_image);
2500  return(MagickTrue);
2501}
2502
2503/*
2504%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2505%                                                                             %
2506%                                                                             %
2507%                                                                             %
2508%   M a g i c k D e s t r o y I m a g e                                       %
2509%                                                                             %
2510%                                                                             %
2511%                                                                             %
2512%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2513%
2514%  MagickDestroyImage() dereferences an image, deallocating memory associated
2515%  with the image if the reference count becomes zero.
2516%
2517%  The format of the MagickDestroyImage method is:
2518%
2519%      Image *MagickDestroyImage(Image *image)
2520%
2521%  A description of each parameter follows:
2522%
2523%    o image: the image.
2524%
2525*/
2526WandExport Image *MagickDestroyImage(Image *image)
2527{
2528  return(DestroyImage(image));
2529}
2530
2531/*
2532%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2533%                                                                             %
2534%                                                                             %
2535%                                                                             %
2536%   M a g i c k D i s p l a y I m a g e                                       %
2537%                                                                             %
2538%                                                                             %
2539%                                                                             %
2540%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2541%
2542%  MagickDisplayImage() displays an image.
2543%
2544%  The format of the MagickDisplayImage method is:
2545%
2546%      MagickBooleanType MagickDisplayImage(MagickWand *wand,
2547%        const char *server_name)
2548%
2549%  A description of each parameter follows:
2550%
2551%    o wand: the magick wand.
2552%
2553%    o server_name: the X server name.
2554%
2555*/
2556WandExport MagickBooleanType MagickDisplayImage(MagickWand *wand,
2557  const char *server_name)
2558{
2559  Image
2560    *image;
2561
2562  MagickBooleanType
2563    status;
2564
2565  assert(wand != (MagickWand *) NULL);
2566  assert(wand->signature == MagickWandSignature);
2567  if (wand->debug != MagickFalse)
2568    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2569  if (wand->images == (Image *) NULL)
2570    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2571  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
2572  if (image == (Image *) NULL)
2573    return(MagickFalse);
2574  (void) CloneString(&wand->image_info->server_name,server_name);
2575  status=DisplayImages(wand->image_info,image,wand->exception);
2576  image=DestroyImage(image);
2577  return(status);
2578}
2579
2580/*
2581%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2582%                                                                             %
2583%                                                                             %
2584%                                                                             %
2585%   M a g i c k D i s p l a y I m a g e s                                     %
2586%                                                                             %
2587%                                                                             %
2588%                                                                             %
2589%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2590%
2591%  MagickDisplayImages() displays an image or image sequence.
2592%
2593%  The format of the MagickDisplayImages method is:
2594%
2595%      MagickBooleanType MagickDisplayImages(MagickWand *wand,
2596%        const char *server_name)
2597%
2598%  A description of each parameter follows:
2599%
2600%    o wand: the magick wand.
2601%
2602%    o server_name: the X server name.
2603%
2604*/
2605WandExport MagickBooleanType MagickDisplayImages(MagickWand *wand,
2606  const char *server_name)
2607{
2608  MagickBooleanType
2609    status;
2610
2611  assert(wand != (MagickWand *) NULL);
2612  assert(wand->signature == MagickWandSignature);
2613  if (wand->debug != MagickFalse)
2614    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2615  (void) CloneString(&wand->image_info->server_name,server_name);
2616  status=DisplayImages(wand->image_info,wand->images,wand->exception);
2617  return(status);
2618}
2619
2620/*
2621%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2622%                                                                             %
2623%                                                                             %
2624%                                                                             %
2625%   M a g i c k D i s t o r t I m a g e                                       %
2626%                                                                             %
2627%                                                                             %
2628%                                                                             %
2629%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2630%
2631%  MagickDistortImage() distorts an image using various distortion methods, by
2632%  mapping color lookups of the source image to a new destination image
2633%  usally of the same size as the source image, unless 'bestfit' is set to
2634%  true.
2635%
2636%  If 'bestfit' is enabled, and distortion allows it, the destination image is
2637%  adjusted to ensure the whole source 'image' will just fit within the final
2638%  destination image, which will be sized and offset accordingly.  Also in
2639%  many cases the virtual offset of the source image will be taken into
2640%  account in the mapping.
2641%
2642%  The format of the MagickDistortImage method is:
2643%
2644%      MagickBooleanType MagickDistortImage(MagickWand *wand,
2645%        const DistortImageMethod method,const size_t number_arguments,
2646%        const double *arguments,const MagickBooleanType bestfit)
2647%
2648%  A description of each parameter follows:
2649%
2650%    o image: the image to be distorted.
2651%
2652%    o method: the method of image distortion.
2653%
2654%        ArcDistortion always ignores the source image offset, and always
2655%        'bestfit' the destination image with the top left corner offset
2656%        relative to the polar mapping center.
2657%
2658%        Bilinear has no simple inverse mapping so it does not allow 'bestfit'
2659%        style of image distortion.
2660%
2661%        Affine, Perspective, and Bilinear, do least squares fitting of the
2662%        distortion when more than the minimum number of control point pairs
2663%        are provided.
2664%
2665%        Perspective, and Bilinear, falls back to a Affine distortion when less
2666%        that 4 control point pairs are provided. While Affine distortions let
2667%        you use any number of control point pairs, that is Zero pairs is a
2668%        no-Op (viewport only) distrotion, one pair is a translation and two
2669%        pairs of control points do a scale-rotate-translate, without any
2670%        shearing.
2671%
2672%    o number_arguments: the number of arguments given for this distortion
2673%      method.
2674%
2675%    o arguments: the arguments for this distortion method.
2676%
2677%    o bestfit: Attempt to resize destination to fit distorted source.
2678%
2679*/
2680WandExport MagickBooleanType MagickDistortImage(MagickWand *wand,
2681  const DistortImageMethod method,const size_t number_arguments,
2682  const double *arguments,const MagickBooleanType bestfit)
2683{
2684  Image
2685    *distort_image;
2686
2687  assert(wand != (MagickWand *) NULL);
2688  assert(wand->signature == MagickWandSignature);
2689  if (wand->debug != MagickFalse)
2690    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2691  if (wand->images == (Image *) NULL)
2692    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2693  distort_image=DistortImage(wand->images,method,number_arguments,arguments,
2694    bestfit,wand->exception);
2695  if (distort_image == (Image *) NULL)
2696    return(MagickFalse);
2697  ReplaceImageInList(&wand->images,distort_image);
2698  return(MagickTrue);
2699}
2700
2701/*
2702%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2703%                                                                             %
2704%                                                                             %
2705%                                                                             %
2706%   M a g i c k D r a w I m a g e                                             %
2707%                                                                             %
2708%                                                                             %
2709%                                                                             %
2710%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2711%
2712%  MagickDrawImage() renders the drawing wand on the current image.
2713%
2714%  The format of the MagickDrawImage method is:
2715%
2716%      MagickBooleanType MagickDrawImage(MagickWand *wand,
2717%        const DrawingWand *drawing_wand)
2718%
2719%  A description of each parameter follows:
2720%
2721%    o wand: the magick wand.
2722%
2723%    o drawing_wand: the draw wand.
2724%
2725*/
2726WandExport MagickBooleanType MagickDrawImage(MagickWand *wand,
2727  const DrawingWand *drawing_wand)
2728{
2729  char
2730    *primitive;
2731
2732  DrawInfo
2733    *draw_info;
2734
2735  MagickBooleanType
2736    status;
2737
2738  assert(wand != (MagickWand *) NULL);
2739  assert(wand->signature == MagickWandSignature);
2740  if (wand->debug != MagickFalse)
2741    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2742  if (wand->images == (Image *) NULL)
2743    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2744  draw_info=PeekDrawingWand(drawing_wand);
2745  if ((draw_info == (DrawInfo *) NULL) ||
2746      (draw_info->primitive == (char *) NULL))
2747    return(MagickFalse);
2748  primitive=AcquireString(draw_info->primitive);
2749  draw_info=DestroyDrawInfo(draw_info);
2750  draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
2751  draw_info->primitive=primitive;
2752  status=DrawImage(wand->images,draw_info,wand->exception);
2753  draw_info=DestroyDrawInfo(draw_info);
2754  return(status);
2755}
2756
2757/*
2758%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2759%                                                                             %
2760%                                                                             %
2761%                                                                             %
2762%   M a g i c k E d g e I m a g e                                             %
2763%                                                                             %
2764%                                                                             %
2765%                                                                             %
2766%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2767%
2768%  MagickEdgeImage() enhance edges within the image with a convolution filter
2769%  of the given radius.  Use a radius of 0 and Edge() selects a suitable
2770%  radius for you.
2771%
2772%  The format of the MagickEdgeImage method is:
2773%
2774%      MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius)
2775%
2776%  A description of each parameter follows:
2777%
2778%    o wand: the magick wand.
2779%
2780%    o radius: the radius of the pixel neighborhood.
2781%
2782*/
2783WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand,
2784  const double radius)
2785{
2786  Image
2787    *edge_image;
2788
2789  assert(wand != (MagickWand *) NULL);
2790  assert(wand->signature == MagickWandSignature);
2791  if (wand->debug != MagickFalse)
2792    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2793  if (wand->images == (Image *) NULL)
2794    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2795  edge_image=EdgeImage(wand->images,radius,wand->exception);
2796  if (edge_image == (Image *) NULL)
2797    return(MagickFalse);
2798  ReplaceImageInList(&wand->images,edge_image);
2799  return(MagickTrue);
2800}
2801
2802/*
2803%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2804%                                                                             %
2805%                                                                             %
2806%                                                                             %
2807%   M a g i c k E m b o s s I m a g e                                         %
2808%                                                                             %
2809%                                                                             %
2810%                                                                             %
2811%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2812%
2813%  MagickEmbossImage() returns a grayscale image with a three-dimensional
2814%  effect.  We convolve the image with a Gaussian operator of the given radius
2815%  and standard deviation (sigma).  For reasonable results, radius should be
2816%  larger than sigma.  Use a radius of 0 and Emboss() selects a suitable
2817%  radius for you.
2818%
2819%  The format of the MagickEmbossImage method is:
2820%
2821%      MagickBooleanType MagickEmbossImage(MagickWand *wand,const double radius,
2822%        const double sigma)
2823%
2824%  A description of each parameter follows:
2825%
2826%    o wand: the magick wand.
2827%
2828%    o radius: the radius of the Gaussian, in pixels, not counting the center
2829%      pixel.
2830%
2831%    o sigma: the standard deviation of the Gaussian, in pixels.
2832%
2833*/
2834WandExport MagickBooleanType MagickEmbossImage(MagickWand *wand,
2835  const double radius,const double sigma)
2836{
2837  Image
2838    *emboss_image;
2839
2840  assert(wand != (MagickWand *) NULL);
2841  assert(wand->signature == MagickWandSignature);
2842  if (wand->debug != MagickFalse)
2843    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2844  if (wand->images == (Image *) NULL)
2845    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2846  emboss_image=EmbossImage(wand->images,radius,sigma,wand->exception);
2847  if (emboss_image == (Image *) NULL)
2848    return(MagickFalse);
2849  ReplaceImageInList(&wand->images,emboss_image);
2850  return(MagickTrue);
2851}
2852
2853/*
2854%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2855%                                                                             %
2856%                                                                             %
2857%                                                                             %
2858%   M a g i c k E n c i p h e r I m a g e                                     %
2859%                                                                             %
2860%                                                                             %
2861%                                                                             %
2862%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2863%
2864%  MagickEncipherImage() converts plaint pixels to cipher pixels.
2865%
2866%  The format of the MagickEncipherImage method is:
2867%
2868%      MagickBooleanType MagickEncipherImage(MagickWand *wand,
2869%        const char *passphrase)
2870%
2871%  A description of each parameter follows:
2872%
2873%    o wand: the magick wand.
2874%
2875%    o passphrase: the passphrase.
2876%
2877*/
2878WandExport MagickBooleanType MagickEncipherImage(MagickWand *wand,
2879  const char *passphrase)
2880{
2881  assert(wand != (MagickWand *) NULL);
2882  assert(wand->signature == MagickWandSignature);
2883  if (wand->debug != MagickFalse)
2884    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2885  if (wand->images == (Image *) NULL)
2886    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2887  return(EncipherImage(wand->images,passphrase,wand->exception));
2888}
2889
2890/*
2891%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2892%                                                                             %
2893%                                                                             %
2894%                                                                             %
2895%   M a g i c k E n h a n c e I m a g e                                       %
2896%                                                                             %
2897%                                                                             %
2898%                                                                             %
2899%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2900%
2901%  MagickEnhanceImage() applies a digital filter that improves the quality of a
2902%  noisy image.
2903%
2904%  The format of the MagickEnhanceImage method is:
2905%
2906%      MagickBooleanType MagickEnhanceImage(MagickWand *wand)
2907%
2908%  A description of each parameter follows:
2909%
2910%    o wand: the magick wand.
2911%
2912*/
2913WandExport MagickBooleanType MagickEnhanceImage(MagickWand *wand)
2914{
2915  Image
2916    *enhance_image;
2917
2918  assert(wand != (MagickWand *) NULL);
2919  assert(wand->signature == MagickWandSignature);
2920  if (wand->debug != MagickFalse)
2921    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2922  if (wand->images == (Image *) NULL)
2923    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2924  enhance_image=EnhanceImage(wand->images,wand->exception);
2925  if (enhance_image == (Image *) NULL)
2926    return(MagickFalse);
2927  ReplaceImageInList(&wand->images,enhance_image);
2928  return(MagickTrue);
2929}
2930
2931/*
2932%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2933%                                                                             %
2934%                                                                             %
2935%                                                                             %
2936%   M a g i c k E q u a l i z e I m a g e                                     %
2937%                                                                             %
2938%                                                                             %
2939%                                                                             %
2940%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2941%
2942%  MagickEqualizeImage() equalizes the image histogram.
2943%
2944%  The format of the MagickEqualizeImage method is:
2945%
2946%      MagickBooleanType MagickEqualizeImage(MagickWand *wand)
2947%
2948%  A description of each parameter follows:
2949%
2950%    o wand: the magick wand.
2951%
2952%    o channel: the image channel(s).
2953%
2954*/
2955WandExport MagickBooleanType MagickEqualizeImage(MagickWand *wand)
2956{
2957  MagickBooleanType
2958    status;
2959
2960  assert(wand != (MagickWand *) NULL);
2961  assert(wand->signature == MagickWandSignature);
2962  if (wand->debug != MagickFalse)
2963    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2964  if (wand->images == (Image *) NULL)
2965    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2966  status=EqualizeImage(wand->images,wand->exception);
2967  return(status);
2968}
2969
2970/*
2971%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2972%                                                                             %
2973%                                                                             %
2974%                                                                             %
2975%   M a g i c k E v a l u a t e I m a g e                                     %
2976%                                                                             %
2977%                                                                             %
2978%                                                                             %
2979%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2980%
2981%  MagickEvaluateImage() applys an arithmetic, relational, or logical
2982%  expression to an image.  Use these operators to lighten or darken an image,
2983%  to increase or decrease contrast in an image, or to produce the "negative"
2984%  of an image.
2985%
2986%  The format of the MagickEvaluateImage method is:
2987%
2988%      MagickBooleanType MagickEvaluateImage(MagickWand *wand,
2989%        const MagickEvaluateOperator operator,const double value)
2990%      MagickBooleanType MagickEvaluateImages(MagickWand *wand,
2991%        const MagickEvaluateOperator operator)
2992%
2993%  A description of each parameter follows:
2994%
2995%    o wand: the magick wand.
2996%
2997%    o op: A channel operator.
2998%
2999%    o value: A value value.
3000%
3001*/
3002
3003WandExport MagickWand *MagickEvaluateImages(MagickWand *wand,
3004  const MagickEvaluateOperator op)
3005{
3006  Image
3007    *evaluate_image;
3008
3009  assert(wand != (MagickWand *) NULL);
3010  assert(wand->signature == MagickWandSignature);
3011  if (wand->debug != MagickFalse)
3012    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3013  if (wand->images == (Image *) NULL)
3014    return((MagickWand *) NULL);
3015  evaluate_image=EvaluateImages(wand->images,op,wand->exception);
3016  if (evaluate_image == (Image *) NULL)
3017    return((MagickWand *) NULL);
3018  return(CloneMagickWandFromImages(wand,evaluate_image));
3019}
3020
3021WandExport MagickBooleanType MagickEvaluateImage(MagickWand *wand,
3022  const MagickEvaluateOperator op,const double value)
3023{
3024  MagickBooleanType
3025    status;
3026
3027  assert(wand != (MagickWand *) NULL);
3028  assert(wand->signature == MagickWandSignature);
3029  if (wand->debug != MagickFalse)
3030    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3031  if (wand->images == (Image *) NULL)
3032    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3033  status=EvaluateImage(wand->images,op,value,wand->exception);
3034  return(status);
3035}
3036
3037/*
3038%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3039%                                                                             %
3040%                                                                             %
3041%                                                                             %
3042%   M a g i c k E x p o r t I m a g e P i x e l s                             %
3043%                                                                             %
3044%                                                                             %
3045%                                                                             %
3046%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3047%
3048%  MagickExportImagePixels() extracts pixel data from an image and returns it
3049%  to you.  The method returns MagickTrue on success otherwise MagickFalse if
3050%  an error is encountered.  The data is returned as char, short int, int,
3051%  ssize_t, float, or double in the order specified by map.
3052%
3053%  Suppose you want to extract the first scanline of a 640x480 image as
3054%  character data in red-green-blue order:
3055%
3056%      MagickExportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
3057%
3058%  The format of the MagickExportImagePixels method is:
3059%
3060%      MagickBooleanType MagickExportImagePixels(MagickWand *wand,
3061%        const ssize_t x,const ssize_t y,const size_t columns,
3062%        const size_t rows,const char *map,const StorageType storage,
3063%        void *pixels)
3064%
3065%  A description of each parameter follows:
3066%
3067%    o wand: the magick wand.
3068%
3069%    o x, y, columns, rows:  These values define the perimeter
3070%      of a region of pixels you want to extract.
3071%
3072%    o map:  This string reflects the expected ordering of the pixel array.
3073%      It can be any combination or order of R = red, G = green, B = blue,
3074%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
3075%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
3076%      P = pad.
3077%
3078%    o storage: Define the data type of the pixels.  Float and double types are
3079%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
3080%      these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel,
3081%      LongPixel, QuantumPixel, or ShortPixel.
3082%
3083%    o pixels: This array of values contain the pixel components as defined by
3084%      map and type.  You must preallocate this array where the expected
3085%      length varies depending on the values of width, height, map, and type.
3086%
3087*/
3088WandExport MagickBooleanType MagickExportImagePixels(MagickWand *wand,
3089  const ssize_t x,const ssize_t y,const size_t columns,
3090  const size_t rows,const char *map,const StorageType storage,
3091  void *pixels)
3092{
3093  MagickBooleanType
3094    status;
3095
3096  assert(wand != (MagickWand *) NULL);
3097  assert(wand->signature == MagickWandSignature);
3098  if (wand->debug != MagickFalse)
3099    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3100  if (wand->images == (Image *) NULL)
3101    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3102  status=ExportImagePixels(wand->images,x,y,columns,rows,map,
3103    storage,pixels,wand->exception);
3104  return(status);
3105}
3106
3107/*
3108%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3109%                                                                             %
3110%                                                                             %
3111%                                                                             %
3112%   M a g i c k E x t e n t I m a g e                                         %
3113%                                                                             %
3114%                                                                             %
3115%                                                                             %
3116%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3117%
3118%  MagickExtentImage() extends the image as defined by the geometry, gravity,
3119%  and wand background color.  Set the (x,y) offset of the geometry to move
3120%  the original wand relative to the extended wand.
3121%
3122%  The format of the MagickExtentImage method is:
3123%
3124%      MagickBooleanType MagickExtentImage(MagickWand *wand,const size_t width,
3125%        const size_t height,const ssize_t x,const ssize_t y)
3126%
3127%  A description of each parameter follows:
3128%
3129%    o wand: the magick wand.
3130%
3131%    o width: the region width.
3132%
3133%    o height: the region height.
3134%
3135%    o x: the region x offset.
3136%
3137%    o y: the region y offset.
3138%
3139*/
3140WandExport MagickBooleanType MagickExtentImage(MagickWand *wand,
3141  const size_t width,const size_t height,const ssize_t x,const ssize_t y)
3142{
3143  Image
3144    *extent_image;
3145
3146  RectangleInfo
3147    extent;
3148
3149  assert(wand != (MagickWand *) NULL);
3150  assert(wand->signature == MagickWandSignature);
3151  if (wand->debug != MagickFalse)
3152    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3153  if (wand->images == (Image *) NULL)
3154    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3155  extent.width=width;
3156  extent.height=height;
3157  extent.x=x;
3158  extent.y=y;
3159  extent_image=ExtentImage(wand->images,&extent,wand->exception);
3160  if (extent_image == (Image *) NULL)
3161    return(MagickFalse);
3162  ReplaceImageInList(&wand->images,extent_image);
3163  return(MagickTrue);
3164}
3165
3166/*
3167%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3168%                                                                             %
3169%                                                                             %
3170%                                                                             %
3171%   M a g i c k F l i p I m a g e                                             %
3172%                                                                             %
3173%                                                                             %
3174%                                                                             %
3175%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3176%
3177%  MagickFlipImage() creates a vertical mirror image by reflecting the pixels
3178%  around the central x-axis.
3179%
3180%  The format of the MagickFlipImage method is:
3181%
3182%      MagickBooleanType MagickFlipImage(MagickWand *wand)
3183%
3184%  A description of each parameter follows:
3185%
3186%    o wand: the magick wand.
3187%
3188*/
3189WandExport MagickBooleanType MagickFlipImage(MagickWand *wand)
3190{
3191  Image
3192    *flip_image;
3193
3194  assert(wand != (MagickWand *) NULL);
3195  assert(wand->signature == MagickWandSignature);
3196  if (wand->debug != MagickFalse)
3197    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3198  if (wand->images == (Image *) NULL)
3199    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3200  flip_image=FlipImage(wand->images,wand->exception);
3201  if (flip_image == (Image *) NULL)
3202    return(MagickFalse);
3203  ReplaceImageInList(&wand->images,flip_image);
3204  return(MagickTrue);
3205}
3206
3207/*
3208%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3209%                                                                             %
3210%                                                                             %
3211%                                                                             %
3212%   M a g i c k F l o o d f i l l P a i n t I m a g e                         %
3213%                                                                             %
3214%                                                                             %
3215%                                                                             %
3216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3217%
3218%  MagickFloodfillPaintImage() changes the color value of any pixel that matches
3219%  target and is an immediate neighbor.  If the method FillToBorderMethod is
3220%  specified, the color value is changed for any neighbor pixel that does not
3221%  match the bordercolor member of image.
3222%
3223%  The format of the MagickFloodfillPaintImage method is:
3224%
3225%      MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand,
3226%        const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
3227%        const ssize_t x,const ssize_t y,const MagickBooleanType invert)
3228%
3229%  A description of each parameter follows:
3230%
3231%    o wand: the magick wand.
3232%
3233%    o fill: the floodfill color pixel wand.
3234%
3235%    o fuzz: By default target must match a particular pixel color
3236%      exactly.  However, in many cases two colors may differ by a small amount.
3237%      The fuzz member of image defines how much tolerance is acceptable to
3238%      consider two colors as the same.  For example, set fuzz to 10 and the
3239%      color red at intensities of 100 and 102 respectively are now interpreted
3240%      as the same color for the purposes of the floodfill.
3241%
3242%    o bordercolor: the border color pixel wand.
3243%
3244%    o x,y: the starting location of the operation.
3245%
3246%    o invert: paint any pixel that does not match the target color.
3247%
3248*/
3249WandExport MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand,
3250  const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
3251  const ssize_t x,const ssize_t y,const MagickBooleanType invert)
3252{
3253  DrawInfo
3254    *draw_info;
3255
3256  MagickBooleanType
3257    status;
3258
3259  PixelInfo
3260    target;
3261
3262  assert(wand != (MagickWand *) NULL);
3263  assert(wand->signature == MagickWandSignature);
3264  if (wand->debug != MagickFalse)
3265    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3266  if (wand->images == (Image *) NULL)
3267    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3268  draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
3269  PixelGetQuantumPacket(fill,&draw_info->fill);
3270  (void) GetOneVirtualPixelInfo(wand->images,TileVirtualPixelMethod,x %
3271    wand->images->columns,y % wand->images->rows,&target,wand->exception);
3272  if (bordercolor != (PixelWand *) NULL)
3273    PixelGetMagickColor(bordercolor,&target);
3274  wand->images->fuzz=fuzz;
3275  status=FloodfillPaintImage(wand->images,draw_info,&target,x,y,invert,
3276    wand->exception);
3277  draw_info=DestroyDrawInfo(draw_info);
3278  return(status);
3279}
3280
3281/*
3282%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3283%                                                                             %
3284%                                                                             %
3285%                                                                             %
3286%   M a g i c k F l o p I m a g e                                             %
3287%                                                                             %
3288%                                                                             %
3289%                                                                             %
3290%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3291%
3292%  MagickFlopImage() creates a horizontal mirror image by reflecting the pixels
3293%  around the central y-axis.
3294%
3295%  The format of the MagickFlopImage method is:
3296%
3297%      MagickBooleanType MagickFlopImage(MagickWand *wand)
3298%
3299%  A description of each parameter follows:
3300%
3301%    o wand: the magick wand.
3302%
3303*/
3304WandExport MagickBooleanType MagickFlopImage(MagickWand *wand)
3305{
3306  Image
3307    *flop_image;
3308
3309  assert(wand != (MagickWand *) NULL);
3310  assert(wand->signature == MagickWandSignature);
3311  if (wand->debug != MagickFalse)
3312    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3313  if (wand->images == (Image *) NULL)
3314    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3315  flop_image=FlopImage(wand->images,wand->exception);
3316  if (flop_image == (Image *) NULL)
3317    return(MagickFalse);
3318  ReplaceImageInList(&wand->images,flop_image);
3319  return(MagickTrue);
3320}
3321
3322/*
3323%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3324%                                                                             %
3325%                                                                             %
3326%                                                                             %
3327%   M a g i c k F o u r i e r T r a n s f o r m I m a g e                     %
3328%                                                                             %
3329%                                                                             %
3330%                                                                             %
3331%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3332%
3333%  MagickForwardFourierTransformImage() implements the discrete Fourier
3334%  transform (DFT) of the image either as a magnitude / phase or real /
3335%  imaginary image pair.
3336%
3337%  The format of the MagickForwardFourierTransformImage method is:
3338%
3339%      MagickBooleanType MagickForwardFourierTransformImage(MagickWand *wand,
3340%        const MagickBooleanType magnitude)
3341%
3342%  A description of each parameter follows:
3343%
3344%    o wand: the magick wand.
3345%
3346%    o magnitude: if true, return as magnitude / phase pair otherwise a real /
3347%      imaginary image pair.
3348%
3349*/
3350WandExport MagickBooleanType MagickForwardFourierTransformImage(
3351  MagickWand *wand,const MagickBooleanType magnitude)
3352{
3353  Image
3354    *forward_image;
3355
3356  assert(wand != (MagickWand *) NULL);
3357  assert(wand->signature == MagickWandSignature);
3358  if (wand->debug != MagickFalse)
3359    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3360  if (wand->images == (Image *) NULL)
3361    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3362  forward_image=ForwardFourierTransformImage(wand->images,magnitude,
3363    wand->exception);
3364  if (forward_image == (Image *) NULL)
3365    return(MagickFalse);
3366  ReplaceImageInList(&wand->images,forward_image);
3367  return(MagickTrue);
3368}
3369
3370/*
3371%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3372%                                                                             %
3373%                                                                             %
3374%                                                                             %
3375%   M a g i c k F r a m e I m a g e                                           %
3376%                                                                             %
3377%                                                                             %
3378%                                                                             %
3379%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3380%
3381%  MagickFrameImage() adds a simulated three-dimensional border around the
3382%  image.  The width and height specify the border width of the vertical and
3383%  horizontal sides of the frame.  The inner and outer bevels indicate the
3384%  width of the inner and outer shadows of the frame.
3385%
3386%  The format of the MagickFrameImage method is:
3387%
3388%      MagickBooleanType MagickFrameImage(MagickWand *wand,
3389%        const PixelWand *alpha_color,const size_t width,
3390%        const size_t height,const ssize_t inner_bevel,
3391%        const ssize_t outer_bevel,const CompositeOperator compose)
3392%
3393%  A description of each parameter follows:
3394%
3395%    o wand: the magick wand.
3396%
3397%    o alpha_color: the frame color pixel wand.
3398%
3399%    o width: the border width.
3400%
3401%    o height: the border height.
3402%
3403%    o inner_bevel: the inner bevel width.
3404%
3405%    o outer_bevel: the outer bevel width.
3406%
3407%    o compose: the composite operator.
3408%
3409*/
3410WandExport MagickBooleanType MagickFrameImage(MagickWand *wand,
3411  const PixelWand *alpha_color,const size_t width,const size_t height,
3412  const ssize_t inner_bevel,const ssize_t outer_bevel,
3413  const CompositeOperator compose)
3414{
3415  Image
3416    *frame_image;
3417
3418  FrameInfo
3419    frame_info;
3420
3421  assert(wand != (MagickWand *) NULL);
3422  assert(wand->signature == MagickWandSignature);
3423  if (wand->debug != MagickFalse)
3424    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3425  if (wand->images == (Image *) NULL)
3426    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3427  (void) ResetMagickMemory(&frame_info,0,sizeof(frame_info));
3428  frame_info.width=wand->images->columns+2*width;
3429  frame_info.height=wand->images->rows+2*height;
3430  frame_info.x=(ssize_t) width;
3431  frame_info.y=(ssize_t) height;
3432  frame_info.inner_bevel=inner_bevel;
3433  frame_info.outer_bevel=outer_bevel;
3434  PixelGetQuantumPacket(alpha_color,&wand->images->alpha_color);
3435  frame_image=FrameImage(wand->images,&frame_info,compose,wand->exception);
3436  if (frame_image == (Image *) NULL)
3437    return(MagickFalse);
3438  ReplaceImageInList(&wand->images,frame_image);
3439  return(MagickTrue);
3440}
3441
3442/*
3443%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3444%                                                                             %
3445%                                                                             %
3446%                                                                             %
3447%   M a g i c k F u n c t i o n I m a g e                                     %
3448%                                                                             %
3449%                                                                             %
3450%                                                                             %
3451%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3452%
3453%  MagickFunctionImage() applys an arithmetic, relational, or logical
3454%  expression to an image.  Use these operators to lighten or darken an image,
3455%  to increase or decrease contrast in an image, or to produce the "negative"
3456%  of an image.
3457%
3458%  The format of the MagickFunctionImage method is:
3459%
3460%      MagickBooleanType MagickFunctionImage(MagickWand *wand,
3461%        const MagickFunction function,const size_t number_arguments,
3462%        const double *arguments)
3463%
3464%  A description of each parameter follows:
3465%
3466%    o wand: the magick wand.
3467%
3468%    o function: the image function.
3469%
3470%    o number_arguments: the number of function arguments.
3471%
3472%    o arguments: the function arguments.
3473%
3474*/
3475WandExport MagickBooleanType MagickFunctionImage(MagickWand *wand,
3476  const MagickFunction function,const size_t number_arguments,
3477  const double *arguments)
3478{
3479  MagickBooleanType
3480    status;
3481
3482  assert(wand != (MagickWand *) NULL);
3483  assert(wand->signature == MagickWandSignature);
3484  if (wand->debug != MagickFalse)
3485    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3486  if (wand->images == (Image *) NULL)
3487    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3488  status=FunctionImage(wand->images,function,number_arguments,arguments,
3489    wand->exception);
3490  return(status);
3491}
3492
3493/*
3494%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3495%                                                                             %
3496%                                                                             %
3497%                                                                             %
3498%   M a g i c k F x I m a g e                                                 %
3499%                                                                             %
3500%                                                                             %
3501%                                                                             %
3502%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3503%
3504%  MagickFxImage() evaluate expression for each pixel in the image.
3505%
3506%  The format of the MagickFxImage method is:
3507%
3508%      MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
3509%
3510%  A description of each parameter follows:
3511%
3512%    o wand: the magick wand.
3513%
3514%    o expression: the expression.
3515%
3516*/
3517WandExport MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
3518{
3519  Image
3520    *fx_image;
3521
3522  assert(wand != (MagickWand *) NULL);
3523  assert(wand->signature == MagickWandSignature);
3524  if (wand->debug != MagickFalse)
3525    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3526  if (wand->images == (Image *) NULL)
3527    return((MagickWand *) NULL);
3528  fx_image=FxImage(wand->images,expression,wand->exception);
3529  if (fx_image == (Image *) NULL)
3530    return((MagickWand *) NULL);
3531  return(CloneMagickWandFromImages(wand,fx_image));
3532}
3533
3534/*
3535%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3536%                                                                             %
3537%                                                                             %
3538%                                                                             %
3539%   M a g i c k G a m m a I m a g e                                           %
3540%                                                                             %
3541%                                                                             %
3542%                                                                             %
3543%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3544%
3545%  MagickGammaImage() gamma-corrects an image.  The same image viewed on
3546%  different devices will have perceptual differences in the way the image's
3547%  intensities are represented on the screen.  Specify individual gamma levels
3548%  for the red, green, and blue channels, or adjust all three with the gamma
3549%  parameter.  Values typically range from 0.8 to 2.3.
3550%
3551%  You can also reduce the influence of a particular channel with a gamma
3552%  value of 0.
3553%
3554%  The format of the MagickGammaImage method is:
3555%
3556%      MagickBooleanType MagickGammaImage(MagickWand *wand,const double gamma)
3557%
3558%  A description of each parameter follows:
3559%
3560%    o wand: the magick wand.
3561%
3562%    o level: Define the level of gamma correction.
3563%
3564*/
3565WandExport MagickBooleanType MagickGammaImage(MagickWand *wand,
3566  const double gamma)
3567{
3568  MagickBooleanType
3569    status;
3570
3571  assert(wand != (MagickWand *) NULL);
3572  assert(wand->signature == MagickWandSignature);
3573  if (wand->debug != MagickFalse)
3574    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3575  if (wand->images == (Image *) NULL)
3576    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3577  status=GammaImage(wand->images,gamma,wand->exception);
3578  return(status);
3579}
3580
3581/*
3582%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3583%                                                                             %
3584%                                                                             %
3585%                                                                             %
3586%   M a g i c k G a u s s i a n B l u r I m a g e                             %
3587%                                                                             %
3588%                                                                             %
3589%                                                                             %
3590%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3591%
3592%  MagickGaussianBlurImage() blurs an image.  We convolve the image with a
3593%  Gaussian operator of the given radius and standard deviation (sigma).
3594%  For reasonable results, the radius should be larger than sigma.  Use a
3595%  radius of 0 and MagickGaussianBlurImage() selects a suitable radius for you.
3596%
3597%  The format of the MagickGaussianBlurImage method is:
3598%
3599%      MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
3600%        const double radius,const double sigma)
3601%
3602%  A description of each parameter follows:
3603%
3604%    o wand: the magick wand.
3605%
3606%    o radius: the radius of the Gaussian, in pixels, not counting the center
3607%      pixel.
3608%
3609%    o sigma: the standard deviation of the Gaussian, in pixels.
3610%
3611*/
3612WandExport MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
3613  const double radius,const double sigma)
3614{
3615  Image
3616    *blur_image;
3617
3618  assert(wand != (MagickWand *) NULL);
3619  assert(wand->signature == MagickWandSignature);
3620  if (wand->debug != MagickFalse)
3621    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3622  if (wand->images == (Image *) NULL)
3623    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3624  blur_image=GaussianBlurImage(wand->images,radius,sigma,wand->exception);
3625  if (blur_image == (Image *) NULL)
3626    return(MagickFalse);
3627  ReplaceImageInList(&wand->images,blur_image);
3628  return(MagickTrue);
3629}
3630
3631/*
3632%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3633%                                                                             %
3634%                                                                             %
3635%                                                                             %
3636%   M a g i c k G e t I m a g e                                               %
3637%                                                                             %
3638%                                                                             %
3639%                                                                             %
3640%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3641%
3642%  MagickGetImage() gets the image at the current image index.
3643%
3644%  The format of the MagickGetImage method is:
3645%
3646%      MagickWand *MagickGetImage(MagickWand *wand)
3647%
3648%  A description of each parameter follows:
3649%
3650%    o wand: the magick wand.
3651%
3652*/
3653WandExport MagickWand *MagickGetImage(MagickWand *wand)
3654{
3655  Image
3656    *image;
3657
3658  assert(wand != (MagickWand *) NULL);
3659  assert(wand->signature == MagickWandSignature);
3660  if (wand->debug != MagickFalse)
3661    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3662  if (wand->images == (Image *) NULL)
3663    {
3664      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3665        "ContainsNoImages","`%s'",wand->name);
3666      return((MagickWand *) NULL);
3667    }
3668  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
3669  if (image == (Image *) NULL)
3670    return((MagickWand *) NULL);
3671  return(CloneMagickWandFromImages(wand,image));
3672}
3673
3674/*
3675%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3676%                                                                             %
3677%                                                                             %
3678%                                                                             %
3679%   M a g i c k G e t I m a g e A l p h a C h a n n e l                       %
3680%                                                                             %
3681%                                                                             %
3682%                                                                             %
3683%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3684%
3685%  MagickGetImageAlphaChannel() returns MagickFalse if the image alpha channel
3686%  is not activated.  That is, the image is RGB rather than RGBA or CMYK rather
3687%  than CMYKA.
3688%
3689%  The format of the MagickGetImageAlphaChannel method is:
3690%
3691%      MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand)
3692%
3693%  A description of each parameter follows:
3694%
3695%    o wand: the magick wand.
3696%
3697*/
3698WandExport MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand)
3699{
3700  assert(wand != (MagickWand *) NULL);
3701  assert(wand->signature == MagickWandSignature);
3702  if (wand->debug != MagickFalse)
3703    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3704  if (wand->images == (Image *) NULL)
3705    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3706  return(GetImageAlphaChannel(wand->images));
3707}
3708
3709/*
3710%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3711%                                                                             %
3712%                                                                             %
3713%                                                                             %
3714%   M a g i c k G e t I m a g e A l p h a C o l o r                           %
3715%                                                                             %
3716%                                                                             %
3717%                                                                             %
3718%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3719%
3720%  MagickGetImageAlhpaColor() returns the image alpha color.
3721%
3722%  The format of the MagickGetImageAlhpaColor method is:
3723%
3724%      MagickBooleanType MagickGetImageAlhpaColor(MagickWand *wand,
3725%        PixelWand *alpha_color)
3726%
3727%  A description of each parameter follows:
3728%
3729%    o wand: the magick wand.
3730%
3731%    o alpha_color: return the alpha color.
3732%
3733*/
3734WandExport MagickBooleanType MagickGetImageAlhpaColor(MagickWand *wand,
3735  PixelWand *alpha_color)
3736{
3737  assert(wand != (MagickWand *)NULL);
3738  assert(wand->signature == MagickWandSignature);
3739  if (wand->debug != MagickFalse)
3740    (void) LogMagickEvent(WandEvent, GetMagickModule(), "%s", wand->name);
3741  if (wand->images == (Image *)NULL)
3742    ThrowWandException(WandError, "ContainsNoImages", wand->name);
3743  PixelSetPixelColor(alpha_color, &wand->images->alpha_color);
3744  return(MagickTrue);
3745}
3746
3747/*
3748%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3749%                                                                             %
3750%                                                                             %
3751%                                                                             %
3752%   M a g i c k G e t I m a g e C l i p M a s k                               %
3753%                                                                             %
3754%                                                                             %
3755%                                                                             %
3756%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3757%
3758%  MagickGetImageMask() gets the image clip mask at the current image index.
3759%
3760%  The format of the MagickGetImageMask method is:
3761%
3762%      MagickWand *MagickGetImageMask(MagickWand *wand)
3763%
3764%  A description of each parameter follows:
3765%
3766%    o wand: the magick wand.
3767%
3768%    o type: type of mask, ReadPixelMask or WritePixelMask.
3769%
3770*/
3771WandExport MagickWand *MagickGetImageMask(MagickWand *wand,
3772  const PixelMask type)
3773{
3774  Image
3775    *image;
3776
3777  assert(wand != (MagickWand *) NULL);
3778  assert(wand->signature == MagickWandSignature);
3779  if (wand->debug != MagickFalse)
3780    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3781  if (wand->images == (Image *) NULL)
3782    {
3783      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3784        "ContainsNoImages","`%s'",wand->name);
3785      return((MagickWand *) NULL);
3786    }
3787  image=GetImageMask(wand->images,type,wand->exception);
3788  if (image == (Image *) NULL)
3789    return((MagickWand *) NULL);
3790  return(CloneMagickWandFromImages(wand,image));
3791}
3792
3793/*
3794%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3795%                                                                             %
3796%                                                                             %
3797%                                                                             %
3798%   M a g i c k G e t I m a g e B a c k g r o u n d C o l o r                 %
3799%                                                                             %
3800%                                                                             %
3801%                                                                             %
3802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3803%
3804%  MagickGetImageBackgroundColor() returns the image background color.
3805%
3806%  The format of the MagickGetImageBackgroundColor method is:
3807%
3808%      MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand,
3809%        PixelWand *background_color)
3810%
3811%  A description of each parameter follows:
3812%
3813%    o wand: the magick wand.
3814%
3815%    o background_color: Return the background color.
3816%
3817*/
3818WandExport MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand,
3819  PixelWand *background_color)
3820{
3821  assert(wand != (MagickWand *) NULL);
3822  assert(wand->signature == MagickWandSignature);
3823  if (wand->debug != MagickFalse)
3824    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3825  if (wand->images == (Image *) NULL)
3826    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3827  PixelSetPixelColor(background_color,&wand->images->background_color);
3828  return(MagickTrue);
3829}
3830
3831/*
3832%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3833%                                                                             %
3834%                                                                             %
3835%                                                                             %
3836%   M a g i c k G e t I m a g e B l o b                                       %
3837%                                                                             %
3838%                                                                             %
3839%                                                                             %
3840%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3841%
3842%  MagickGetImageBlob() implements direct to memory image formats.  It returns
3843%  the image as a blob (a formatted "file" in memory) and its length, starting
3844%  from the current position in the image sequence.  Use MagickSetImageFormat()
3845%  to set the format to write to the blob (GIF, JPEG,  PNG, etc.).
3846%
3847%  Utilize MagickResetIterator() to ensure the write is from the beginning of
3848%  the image sequence.
3849%
3850%  Use MagickRelinquishMemory() to free the blob when you are done with it.
3851%
3852%  The format of the MagickGetImageBlob method is:
3853%
3854%      unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length)
3855%
3856%  A description of each parameter follows:
3857%
3858%    o wand: the magick wand.
3859%
3860%    o length: the length of the blob.
3861%
3862*/
3863WandExport unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length)
3864{
3865  unsigned char
3866    *blob;
3867
3868  assert(wand != (MagickWand *) NULL);
3869  assert(wand->signature == MagickWandSignature);
3870  if (wand->debug != MagickFalse)
3871    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3872  if (wand->images == (Image *) NULL)
3873    {
3874      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3875        "ContainsNoImages","`%s'",wand->name);
3876      return((unsigned char *) NULL);
3877    }
3878  blob=(unsigned char *) ImageToBlob(wand->image_info,wand->images,length,
3879    wand->exception);
3880  return(blob);
3881}
3882
3883/*
3884%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3885%                                                                             %
3886%                                                                             %
3887%                                                                             %
3888%   M a g i c k G e t I m a g e s B l o b                                     %
3889%                                                                             %
3890%                                                                             %
3891%                                                                             %
3892%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3893%
3894%  MagickGetImageBlob() implements direct to memory image formats.  It
3895%  returns the image sequence as a blob and its length.  The format of the image
3896%  determines the format of the returned blob (GIF, JPEG,  PNG, etc.).  To
3897%  return a different image format, use MagickSetImageFormat().
3898%
3899%  Note, some image formats do not permit multiple images to the same image
3900%  stream (e.g. JPEG).  in this instance, just the first image of the
3901%  sequence is returned as a blob.
3902%
3903%  The format of the MagickGetImagesBlob method is:
3904%
3905%      unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length)
3906%
3907%  A description of each parameter follows:
3908%
3909%    o wand: the magick wand.
3910%
3911%    o length: the length of the blob.
3912%
3913*/
3914WandExport unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length)
3915{
3916  unsigned char
3917    *blob;
3918
3919  assert(wand != (MagickWand *) NULL);
3920  assert(wand->signature == MagickWandSignature);
3921  if (wand->debug != MagickFalse)
3922    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3923  if (wand->images == (Image *) NULL)
3924    {
3925      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3926        "ContainsNoImages","`%s'",wand->name);
3927      return((unsigned char *) NULL);
3928    }
3929  blob=(unsigned char *) ImagesToBlob(wand->image_info,GetFirstImageInList(
3930    wand->images),length,wand->exception);
3931  return(blob);
3932}
3933
3934/*
3935%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3936%                                                                             %
3937%                                                                             %
3938%                                                                             %
3939%   M a g i c k G e t I m a g e B l u e P r i m a r y                         %
3940%                                                                             %
3941%                                                                             %
3942%                                                                             %
3943%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3944%
3945%  MagickGetImageBluePrimary() returns the chromaticy blue primary point for the
3946%  image.
3947%
3948%  The format of the MagickGetImageBluePrimary method is:
3949%
3950%      MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,double *x,
3951%        double *y,double *z)
3952%
3953%  A description of each parameter follows:
3954%
3955%    o wand: the magick wand.
3956%
3957%    o x: the chromaticity blue primary x-point.
3958%
3959%    o y: the chromaticity blue primary y-point.
3960%
3961%    o z: the chromaticity blue primary z-point.
3962%
3963*/
3964WandExport MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,
3965  double *x,double *y,double *z)
3966{
3967  assert(wand != (MagickWand *) NULL);
3968  assert(wand->signature == MagickWandSignature);
3969  if (wand->debug != MagickFalse)
3970    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3971  if (wand->images == (Image *) NULL)
3972    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3973  *x=wand->images->chromaticity.blue_primary.x;
3974  *y=wand->images->chromaticity.blue_primary.y;
3975  *z=wand->images->chromaticity.blue_primary.z;
3976  return(MagickTrue);
3977}
3978
3979/*
3980%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3981%                                                                             %
3982%                                                                             %
3983%                                                                             %
3984%   M a g i c k G e t I m a g e B o r d e r C o l o r                         %
3985%                                                                             %
3986%                                                                             %
3987%                                                                             %
3988%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3989%
3990%  MagickGetImageBorderColor() returns the image border color.
3991%
3992%  The format of the MagickGetImageBorderColor method is:
3993%
3994%      MagickBooleanType MagickGetImageBorderColor(MagickWand *wand,
3995%        PixelWand *border_color)
3996%
3997%  A description of each parameter follows:
3998%
3999%    o wand: the magick wand.
4000%
4001%    o border_color: Return the border color.
4002%
4003*/
4004WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand,
4005  PixelWand *border_color)
4006{
4007  assert(wand != (MagickWand *) NULL);
4008  assert(wand->signature == MagickWandSignature);
4009  if (wand->debug != MagickFalse)
4010    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4011  if (wand->images == (Image *) NULL)
4012    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4013  PixelSetPixelColor(border_color,&wand->images->border_color);
4014  return(MagickTrue);
4015}
4016
4017/*
4018%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4019%                                                                             %
4020%                                                                             %
4021%                                                                             %
4022%   M a g i c k G e t I m a g e F e a t u r e s                               %
4023%                                                                             %
4024%                                                                             %
4025%                                                                             %
4026%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4027%
4028%  MagickGetImageFeatures() returns features for each channel in the
4029%  image in each of four directions (horizontal, vertical, left and right
4030%  diagonals) for the specified distance.  The features include the angular
4031%  second moment, contrast, correlation, sum of squares: variance, inverse
4032%  difference moment, sum average, sum varience, sum entropy, entropy,
4033%  difference variance, difference entropy, information measures of
4034%  correlation 1, information measures of correlation 2, and maximum
4035%  correlation coefficient.  You can access the red channel contrast, for
4036%  example, like this:
4037%
4038%      channel_features=MagickGetImageFeatures(wand,1);
4039%      contrast=channel_features[RedPixelChannel].contrast[0];
4040%
4041%  Use MagickRelinquishMemory() to free the statistics buffer.
4042%
4043%  The format of the MagickGetImageFeatures method is:
4044%
4045%      ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
4046%        const size_t distance)
4047%
4048%  A description of each parameter follows:
4049%
4050%    o wand: the magick wand.
4051%
4052%    o distance: the distance.
4053%
4054*/
4055WandExport ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
4056  const size_t distance)
4057{
4058  assert(wand != (MagickWand *) NULL);
4059  assert(wand->signature == MagickWandSignature);
4060  if (wand->debug != MagickFalse)
4061    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4062  if (wand->images == (Image *) NULL)
4063    {
4064      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4065        "ContainsNoImages","`%s'",wand->name);
4066      return((ChannelFeatures *) NULL);
4067    }
4068  return(GetImageFeatures(wand->images,distance,wand->exception));
4069}
4070
4071/*
4072%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4073%                                                                             %
4074%                                                                             %
4075%                                                                             %
4076%   M a g i c k G e t I m a g e K u r t o s i s                               %
4077%                                                                             %
4078%                                                                             %
4079%                                                                             %
4080%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4081%
4082%  MagickGetImageKurtosis() gets the kurtosis and skewness of one or
4083%  more image channels.
4084%
4085%  The format of the MagickGetImageKurtosis method is:
4086%
4087%      MagickBooleanType MagickGetImageKurtosis(MagickWand *wand,
4088%        double *kurtosis,double *skewness)
4089%
4090%  A description of each parameter follows:
4091%
4092%    o wand: the magick wand.
4093%
4094%    o kurtosis:  The kurtosis for the specified channel(s).
4095%
4096%    o skewness:  The skewness for the specified channel(s).
4097%
4098*/
4099WandExport MagickBooleanType MagickGetImageKurtosis(MagickWand *wand,
4100  double *kurtosis,double *skewness)
4101{
4102  MagickBooleanType
4103    status;
4104
4105  assert(wand != (MagickWand *) NULL);
4106  assert(wand->signature == MagickWandSignature);
4107  if (wand->debug != MagickFalse)
4108    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4109  if (wand->images == (Image *) NULL)
4110    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4111  status=GetImageKurtosis(wand->images,kurtosis,skewness,wand->exception);
4112  return(status);
4113}
4114
4115/*
4116%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4117%                                                                             %
4118%                                                                             %
4119%                                                                             %
4120%   M a g i c k G e t I m a g e M e a n                                       %
4121%                                                                             %
4122%                                                                             %
4123%                                                                             %
4124%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4125%
4126%  MagickGetImageMean() gets the mean and standard deviation of one or more
4127%  image channels.
4128%
4129%  The format of the MagickGetImageMean method is:
4130%
4131%      MagickBooleanType MagickGetImageMean(MagickWand *wand,double *mean,
4132%        double *standard_deviation)
4133%
4134%  A description of each parameter follows:
4135%
4136%    o wand: the magick wand.
4137%
4138%    o channel: the image channel(s).
4139%
4140%    o mean:  The mean pixel value for the specified channel(s).
4141%
4142%    o standard_deviation:  The standard deviation for the specified channel(s).
4143%
4144*/
4145WandExport MagickBooleanType MagickGetImageMean(MagickWand *wand,double *mean,
4146  double *standard_deviation)
4147{
4148  MagickBooleanType
4149    status;
4150
4151  assert(wand != (MagickWand *) NULL);
4152  assert(wand->signature == MagickWandSignature);
4153  if (wand->debug != MagickFalse)
4154    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4155  if (wand->images == (Image *) NULL)
4156    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4157  status=GetImageMean(wand->images,mean,standard_deviation,wand->exception);
4158  return(status);
4159}
4160
4161/*
4162%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4163%                                                                             %
4164%                                                                             %
4165%                                                                             %
4166%   M a g i c k G e t I m a g e R a n g e                                     %
4167%                                                                             %
4168%                                                                             %
4169%                                                                             %
4170%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4171%
4172%  MagickGetImageRange() gets the range for one or more image channels.
4173%
4174%  The format of the MagickGetImageRange method is:
4175%
4176%      MagickBooleanType MagickGetImageRange(MagickWand *wand,double *minima,
4177%        double *maxima)
4178%
4179%  A description of each parameter follows:
4180%
4181%    o wand: the magick wand.
4182%
4183%    o minima:  The minimum pixel value for the specified channel(s).
4184%
4185%    o maxima:  The maximum pixel value for the specified channel(s).
4186%
4187*/
4188WandExport MagickBooleanType MagickGetImageRange(MagickWand *wand,
4189  double *minima,double *maxima)
4190{
4191  MagickBooleanType
4192    status;
4193
4194  assert(wand != (MagickWand *) NULL);
4195  assert(wand->signature == MagickWandSignature);
4196  if (wand->debug != MagickFalse)
4197    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4198  if (wand->images == (Image *) NULL)
4199    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4200  status=GetImageRange(wand->images,minima,maxima,wand->exception);
4201  return(status);
4202}
4203
4204/*
4205%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4206%                                                                             %
4207%                                                                             %
4208%                                                                             %
4209%   M a g i c k G e t I m a g e S t a t i s t i c s                           %
4210%                                                                             %
4211%                                                                             %
4212%                                                                             %
4213%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4214%
4215%  MagickGetImageStatistics() returns statistics for each channel in the
4216%  image.  The statistics include the channel depth, its minima and
4217%  maxima, the mean, the standard deviation, the kurtosis and the skewness.
4218%  You can access the red channel mean, for example, like this:
4219%
4220%      channel_statistics=MagickGetImageStatistics(wand);
4221%      red_mean=channel_statistics[RedPixelChannel].mean;
4222%
4223%  Use MagickRelinquishMemory() to free the statistics buffer.
4224%
4225%  The format of the MagickGetImageStatistics method is:
4226%
4227%      ChannelStatistics *MagickGetImageStatistics(MagickWand *wand)
4228%
4229%  A description of each parameter follows:
4230%
4231%    o wand: the magick wand.
4232%
4233*/
4234WandExport ChannelStatistics *MagickGetImageStatistics(MagickWand *wand)
4235{
4236  assert(wand != (MagickWand *) NULL);
4237  assert(wand->signature == MagickWandSignature);
4238  if (wand->debug != MagickFalse)
4239    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4240  if (wand->images == (Image *) NULL)
4241    {
4242      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4243        "ContainsNoImages","`%s'",wand->name);
4244      return((ChannelStatistics *) NULL);
4245    }
4246  return(GetImageStatistics(wand->images,wand->exception));
4247}
4248
4249/*
4250%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4251%                                                                             %
4252%                                                                             %
4253%                                                                             %
4254%   M a g i c k G e t I m a g e C o l o r m a p C o l o r                     %
4255%                                                                             %
4256%                                                                             %
4257%                                                                             %
4258%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4259%
4260%  MagickGetImageColormapColor() returns the color of the specified colormap
4261%  index.
4262%
4263%  The format of the MagickGetImageColormapColor method is:
4264%
4265%      MagickBooleanType MagickGetImageColormapColor(MagickWand *wand,
4266%        const size_t index,PixelWand *color)
4267%
4268%  A description of each parameter follows:
4269%
4270%    o wand: the magick wand.
4271%
4272%    o index: the offset into the image colormap.
4273%
4274%    o color: Return the colormap color in this wand.
4275%
4276*/
4277WandExport MagickBooleanType MagickGetImageColormapColor(MagickWand *wand,
4278  const size_t index,PixelWand *color)
4279{
4280  assert(wand != (MagickWand *) NULL);
4281  assert(wand->signature == MagickWandSignature);
4282  if (wand->debug != MagickFalse)
4283    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4284  if (wand->images == (Image *) NULL)
4285    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4286  if ((wand->images->colormap == (PixelInfo *) NULL) ||
4287      (index >= wand->images->colors))
4288    {
4289      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4290        "InvalidColormapIndex","`%s'",wand->name);
4291      return(MagickFalse);
4292    }
4293  PixelSetPixelColor(color,wand->images->colormap+index);
4294  return(MagickTrue);
4295}
4296
4297/*
4298%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4299%                                                                             %
4300%                                                                             %
4301%                                                                             %
4302%   M a g i c k G e t I m a g e C o l o r s                                   %
4303%                                                                             %
4304%                                                                             %
4305%                                                                             %
4306%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4307%
4308%  MagickGetImageColors() gets the number of unique colors in the image.
4309%
4310%  The format of the MagickGetImageColors method is:
4311%
4312%      size_t MagickGetImageColors(MagickWand *wand)
4313%
4314%  A description of each parameter follows:
4315%
4316%    o wand: the magick wand.
4317%
4318*/
4319WandExport size_t MagickGetImageColors(MagickWand *wand)
4320{
4321  assert(wand != (MagickWand *) NULL);
4322  assert(wand->signature == MagickWandSignature);
4323  if (wand->debug != MagickFalse)
4324    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4325  if (wand->images == (Image *) NULL)
4326    {
4327      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4328        "ContainsNoImages","`%s'",wand->name);
4329      return(0);
4330    }
4331  return(GetNumberColors(wand->images,(FILE *) NULL,wand->exception));
4332}
4333
4334/*
4335%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4336%                                                                             %
4337%                                                                             %
4338%                                                                             %
4339%   M a g i c k G e t I m a g e C o l o r s p a c e                           %
4340%                                                                             %
4341%                                                                             %
4342%                                                                             %
4343%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4344%
4345%  MagickGetImageColorspace() gets the image colorspace.
4346%
4347%  The format of the MagickGetImageColorspace method is:
4348%
4349%      ColorspaceType MagickGetImageColorspace(MagickWand *wand)
4350%
4351%  A description of each parameter follows:
4352%
4353%    o wand: the magick wand.
4354%
4355*/
4356WandExport ColorspaceType MagickGetImageColorspace(MagickWand *wand)
4357{
4358  assert(wand != (MagickWand *) NULL);
4359  assert(wand->signature == MagickWandSignature);
4360  if (wand->debug != MagickFalse)
4361    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4362  if (wand->images == (Image *) NULL)
4363    {
4364      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4365        "ContainsNoImages","`%s'",wand->name);
4366      return(UndefinedColorspace);
4367    }
4368  return(wand->images->colorspace);
4369}
4370
4371/*
4372%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4373%                                                                             %
4374%                                                                             %
4375%                                                                             %
4376%   M a g i c k G e t I m a g e C o m p o s e                                 %
4377%                                                                             %
4378%                                                                             %
4379%                                                                             %
4380%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4381%
4382%  MagickGetImageCompose() returns the composite operator associated with the
4383%  image.
4384%
4385%  The format of the MagickGetImageCompose method is:
4386%
4387%      CompositeOperator MagickGetImageCompose(MagickWand *wand)
4388%
4389%  A description of each parameter follows:
4390%
4391%    o wand: the magick wand.
4392%
4393*/
4394WandExport CompositeOperator MagickGetImageCompose(MagickWand *wand)
4395{
4396  assert(wand != (MagickWand *) NULL);
4397  assert(wand->signature == MagickWandSignature);
4398  if (wand->debug != MagickFalse)
4399    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4400  if (wand->images == (Image *) NULL)
4401    {
4402      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4403        "ContainsNoImages","`%s'",wand->name);
4404      return(UndefinedCompositeOp);
4405    }
4406  return(wand->images->compose);
4407}
4408
4409/*
4410%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4411%                                                                             %
4412%                                                                             %
4413%                                                                             %
4414%   M a g i c k G e t I m a g e C o m p r e s s i o n                         %
4415%                                                                             %
4416%                                                                             %
4417%                                                                             %
4418%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4419%
4420%  MagickGetImageCompression() gets the image compression.
4421%
4422%  The format of the MagickGetImageCompression method is:
4423%
4424%      CompressionType MagickGetImageCompression(MagickWand *wand)
4425%
4426%  A description of each parameter follows:
4427%
4428%    o wand: the magick wand.
4429%
4430*/
4431WandExport CompressionType MagickGetImageCompression(MagickWand *wand)
4432{
4433  assert(wand != (MagickWand *) NULL);
4434  assert(wand->signature == MagickWandSignature);
4435  if (wand->debug != MagickFalse)
4436    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4437  if (wand->images == (Image *) NULL)
4438    {
4439      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4440        "ContainsNoImages","`%s'",wand->name);
4441      return(UndefinedCompression);
4442    }
4443  return(wand->images->compression);
4444}
4445
4446/*
4447%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4448%                                                                             %
4449%                                                                             %
4450%                                                                             %
4451%   M a g i c k G e t I m a g e C o m p r e s s i o n Q u a l i t y           %
4452%                                                                             %
4453%                                                                             %
4454%                                                                             %
4455%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4456%
4457%  MagickGetImageCompressionQuality() gets the image compression quality.
4458%
4459%  The format of the MagickGetImageCompressionQuality method is:
4460%
4461%      size_t MagickGetImageCompressionQuality(MagickWand *wand)
4462%
4463%  A description of each parameter follows:
4464%
4465%    o wand: the magick wand.
4466%
4467*/
4468WandExport size_t MagickGetImageCompressionQuality(MagickWand *wand)
4469{
4470  assert(wand != (MagickWand *) NULL);
4471  assert(wand->signature == MagickWandSignature);
4472  if (wand->debug != MagickFalse)
4473    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4474  if (wand->images == (Image *) NULL)
4475    {
4476      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4477        "ContainsNoImages","`%s'",wand->name);
4478      return(0UL);
4479    }
4480  return(wand->images->quality);
4481}
4482
4483/*
4484%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4485%                                                                             %
4486%                                                                             %
4487%                                                                             %
4488%   M a g i c k G e t I m a g e D e l a y                                     %
4489%                                                                             %
4490%                                                                             %
4491%                                                                             %
4492%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4493%
4494%  MagickGetImageDelay() gets the image delay.
4495%
4496%  The format of the MagickGetImageDelay method is:
4497%
4498%      size_t MagickGetImageDelay(MagickWand *wand)
4499%
4500%  A description of each parameter follows:
4501%
4502%    o wand: the magick wand.
4503%
4504*/
4505WandExport size_t MagickGetImageDelay(MagickWand *wand)
4506{
4507  assert(wand != (MagickWand *) NULL);
4508  assert(wand->signature == MagickWandSignature);
4509  if (wand->debug != MagickFalse)
4510    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4511  if (wand->images == (Image *) NULL)
4512    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4513  return(wand->images->delay);
4514}
4515
4516/*
4517%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4518%                                                                             %
4519%                                                                             %
4520%                                                                             %
4521%   M a g i c k G e t I m a g e D e p t h                                     %
4522%                                                                             %
4523%                                                                             %
4524%                                                                             %
4525%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4526%
4527%  MagickGetImageDepth() gets the image depth.
4528%
4529%  The format of the MagickGetImageDepth method is:
4530%
4531%      size_t MagickGetImageDepth(MagickWand *wand)
4532%
4533%  A description of each parameter follows:
4534%
4535%    o wand: the magick wand.
4536%
4537*/
4538WandExport size_t MagickGetImageDepth(MagickWand *wand)
4539{
4540  assert(wand != (MagickWand *) NULL);
4541  assert(wand->signature == MagickWandSignature);
4542  if (wand->debug != MagickFalse)
4543    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4544  if (wand->images == (Image *) NULL)
4545    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4546  return(wand->images->depth);
4547}
4548
4549/*
4550%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4551%                                                                             %
4552%                                                                             %
4553%                                                                             %
4554%   M a g i c k G e t I m a g e D i s p o s e                                 %
4555%                                                                             %
4556%                                                                             %
4557%                                                                             %
4558%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4559%
4560%  MagickGetImageDispose() gets the image disposal method.
4561%
4562%  The format of the MagickGetImageDispose method is:
4563%
4564%      DisposeType MagickGetImageDispose(MagickWand *wand)
4565%
4566%  A description of each parameter follows:
4567%
4568%    o wand: the magick wand.
4569%
4570*/
4571WandExport DisposeType MagickGetImageDispose(MagickWand *wand)
4572{
4573  assert(wand != (MagickWand *) NULL);
4574  assert(wand->signature == MagickWandSignature);
4575  if (wand->debug != MagickFalse)
4576    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4577  if (wand->images == (Image *) NULL)
4578    {
4579      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4580        "ContainsNoImages","`%s'",wand->name);
4581      return(UndefinedDispose);
4582    }
4583  return((DisposeType) wand->images->dispose);
4584}
4585
4586/*
4587%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4588%                                                                             %
4589%                                                                             %
4590%                                                                             %
4591%   M a g i c k G e t I m a g e D i s t o r t i o n                           %
4592%                                                                             %
4593%                                                                             %
4594%                                                                             %
4595%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4596%
4597%  MagickGetImageDistortion() compares an image to a reconstructed image and
4598%  returns the specified distortion metric.
4599%
4600%  The format of the MagickGetImageDistortion method is:
4601%
4602%      MagickBooleanType MagickGetImageDistortion(MagickWand *wand,
4603%        const MagickWand *reference,const MetricType metric,
4604%        double *distortion)
4605%
4606%  A description of each parameter follows:
4607%
4608%    o wand: the magick wand.
4609%
4610%    o reference: the reference wand.
4611%
4612%    o metric: the metric.
4613%
4614%    o distortion: the computed distortion between the images.
4615%
4616*/
4617WandExport MagickBooleanType MagickGetImageDistortion(MagickWand *wand,
4618  const MagickWand *reference,const MetricType metric,double *distortion)
4619{
4620  MagickBooleanType
4621    status;
4622
4623  assert(wand != (MagickWand *) NULL);
4624  assert(wand->signature == MagickWandSignature);
4625  if (wand->debug != MagickFalse)
4626    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4627  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
4628    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4629  status=GetImageDistortion(wand->images,reference->images,metric,distortion,
4630    wand->exception);
4631  return(status);
4632}
4633
4634/*
4635%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4636%                                                                             %
4637%                                                                             %
4638%                                                                             %
4639%   M a g i c k G e t I m a g e D i s t o r t i o n s                         %
4640%                                                                             %
4641%                                                                             %
4642%                                                                             %
4643%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4644%
4645%  MagickGetImageDistortions() compares one or more pixel channels of an
4646%  image to a reconstructed image and returns the specified distortion metrics.
4647%
4648%  Use MagickRelinquishMemory() to free the metrics when you are done with them.
4649%
4650%  The format of the MagickGetImageDistortion method is:
4651%
4652%      double *MagickGetImageDistortion(MagickWand *wand,
4653%        const MagickWand *reference,const MetricType metric)
4654%
4655%  A description of each parameter follows:
4656%
4657%    o wand: the magick wand.
4658%
4659%    o reference: the reference wand.
4660%
4661%    o metric: the metric.
4662%
4663*/
4664WandExport double *MagickGetImageDistortions(MagickWand *wand,
4665  const MagickWand *reference,const MetricType metric)
4666{
4667  double
4668    *channel_distortion;
4669
4670  assert(wand != (MagickWand *) NULL);
4671  assert(wand->signature == MagickWandSignature);
4672  if (wand->debug != MagickFalse)
4673    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4674  assert(reference != (MagickWand *) NULL);
4675  assert(reference->signature == MagickWandSignature);
4676  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
4677    {
4678      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4679        "ContainsNoImages","`%s'",wand->name);
4680      return((double *) NULL);
4681    }
4682  channel_distortion=GetImageDistortions(wand->images,reference->images,
4683    metric,wand->exception);
4684  return(channel_distortion);
4685}
4686
4687/*
4688%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4689%                                                                             %
4690%                                                                             %
4691%                                                                             %
4692%   M a g i c k G e t I m a g e E n d i a n                                   %
4693%                                                                             %
4694%                                                                             %
4695%                                                                             %
4696%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4697%
4698%  MagickGetImageEndian() gets the image endian.
4699%
4700%  The format of the MagickGetImageEndian method is:
4701%
4702%      EndianType MagickGetImageEndian(MagickWand *wand)
4703%
4704%  A description of each parameter follows:
4705%
4706%    o wand: the magick wand.
4707%
4708*/
4709WandExport EndianType MagickGetImageEndian(MagickWand *wand)
4710{
4711  assert(wand != (MagickWand *) NULL);
4712  assert(wand->signature == MagickWandSignature);
4713  if (wand->debug != MagickFalse)
4714    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4715  if (wand->images == (Image *) NULL)
4716    {
4717      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4718        "ContainsNoImages","`%s'",wand->name);
4719      return(UndefinedEndian);
4720    }
4721  return(wand->images->endian);
4722}
4723
4724/*
4725%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4726%                                                                             %
4727%                                                                             %
4728%                                                                             %
4729%   M a g i c k G e t I m a g e F i l e n a m e                               %
4730%                                                                             %
4731%                                                                             %
4732%                                                                             %
4733%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4734%
4735%  MagickGetImageFilename() returns the filename of a particular image in a
4736%  sequence.
4737%
4738%  The format of the MagickGetImageFilename method is:
4739%
4740%      char *MagickGetImageFilename(MagickWand *wand)
4741%
4742%  A description of each parameter follows:
4743%
4744%    o wand: the magick wand.
4745%
4746*/
4747WandExport char *MagickGetImageFilename(MagickWand *wand)
4748{
4749  assert(wand != (MagickWand *) NULL);
4750  assert(wand->signature == MagickWandSignature);
4751  if (wand->debug != MagickFalse)
4752    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4753  if (wand->images == (Image *) NULL)
4754    {
4755      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4756        "ContainsNoImages","`%s'",wand->name);
4757      return((char *) NULL);
4758    }
4759  return(AcquireString(wand->images->filename));
4760}
4761
4762/*
4763%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4764%                                                                             %
4765%                                                                             %
4766%                                                                             %
4767%   M a g i c k G e t I m a g e F o r m a t                                   %
4768%                                                                             %
4769%                                                                             %
4770%                                                                             %
4771%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4772%
4773%  MagickGetImageFormat() returns the format of a particular image in a
4774%  sequence.
4775%
4776%  The format of the MagickGetImageFormat method is:
4777%
4778%      char *MagickGetImageFormat(MagickWand *wand)
4779%
4780%  A description of each parameter follows:
4781%
4782%    o wand: the magick wand.
4783%
4784*/
4785WandExport char *MagickGetImageFormat(MagickWand *wand)
4786{
4787  assert(wand != (MagickWand *) NULL);
4788  assert(wand->signature == MagickWandSignature);
4789  if (wand->debug != MagickFalse)
4790    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4791  if (wand->images == (Image *) NULL)
4792    {
4793      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4794        "ContainsNoImages","`%s'",wand->name);
4795      return((char *) NULL);
4796    }
4797  return(AcquireString(wand->images->magick));
4798}
4799
4800/*
4801%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4802%                                                                             %
4803%                                                                             %
4804%                                                                             %
4805%   M a g i c k G e t I m a g e F u z z                                       %
4806%                                                                             %
4807%                                                                             %
4808%                                                                             %
4809%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4810%
4811%  MagickGetImageFuzz() gets the image fuzz.
4812%
4813%  The format of the MagickGetImageFuzz method is:
4814%
4815%      double MagickGetImageFuzz(MagickWand *wand)
4816%
4817%  A description of each parameter follows:
4818%
4819%    o wand: the magick wand.
4820%
4821*/
4822WandExport double MagickGetImageFuzz(MagickWand *wand)
4823{
4824  assert(wand != (MagickWand *) NULL);
4825  assert(wand->signature == MagickWandSignature);
4826  if (wand->debug != MagickFalse)
4827    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4828  if (wand->images == (Image *) NULL)
4829    {
4830      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4831        "ContainsNoImages","`%s'",wand->name);
4832      return(0.0);
4833    }
4834  return(wand->images->fuzz);
4835}
4836
4837/*
4838%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4839%                                                                             %
4840%                                                                             %
4841%                                                                             %
4842%   M a g i c k G e t I m a g e G a m m a                                     %
4843%                                                                             %
4844%                                                                             %
4845%                                                                             %
4846%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4847%
4848%  MagickGetImageGamma() gets the image gamma.
4849%
4850%  The format of the MagickGetImageGamma method is:
4851%
4852%      double MagickGetImageGamma(MagickWand *wand)
4853%
4854%  A description of each parameter follows:
4855%
4856%    o wand: the magick wand.
4857%
4858*/
4859WandExport double MagickGetImageGamma(MagickWand *wand)
4860{
4861  assert(wand != (MagickWand *) NULL);
4862  assert(wand->signature == MagickWandSignature);
4863  if (wand->debug != MagickFalse)
4864    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4865  if (wand->images == (Image *) NULL)
4866    {
4867      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4868        "ContainsNoImages","`%s'",wand->name);
4869      return(0.0);
4870    }
4871  return(wand->images->gamma);
4872}
4873
4874/*
4875%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4876%                                                                             %
4877%                                                                             %
4878%                                                                             %
4879%   M a g i c k G e t I m a g e G r a v i t y                                 %
4880%                                                                             %
4881%                                                                             %
4882%                                                                             %
4883%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4884%
4885%  MagickGetImageGravity() gets the image gravity.
4886%
4887%  The format of the MagickGetImageGravity method is:
4888%
4889%      GravityType MagickGetImageGravity(MagickWand *wand)
4890%
4891%  A description of each parameter follows:
4892%
4893%    o wand: the magick wand.
4894%
4895*/
4896WandExport GravityType MagickGetImageGravity(MagickWand *wand)
4897{
4898  assert(wand != (MagickWand *) NULL);
4899  assert(wand->signature == MagickWandSignature);
4900  if (wand->debug != MagickFalse)
4901    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4902  if (wand->images == (Image *) NULL)
4903    {
4904      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4905        "ContainsNoImages","`%s'",wand->name);
4906      return(UndefinedGravity);
4907    }
4908  return(wand->images->gravity);
4909}
4910
4911/*
4912%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4913%                                                                             %
4914%                                                                             %
4915%                                                                             %
4916%   M a g i c k G e t I m a g e G r e e n P r i m a r y                       %
4917%                                                                             %
4918%                                                                             %
4919%                                                                             %
4920%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4921%
4922%  MagickGetImageGreenPrimary() returns the chromaticy green primary point.
4923%
4924%  The format of the MagickGetImageGreenPrimary method is:
4925%
4926%      MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,double *x,
4927%        double *y,double *z)
4928%
4929%  A description of each parameter follows:
4930%
4931%    o wand: the magick wand.
4932%
4933%    o x: the chromaticity green primary x-point.
4934%
4935%    o y: the chromaticity green primary y-point.
4936%
4937%    o z: the chromaticity green primary z-point.
4938%
4939*/
4940WandExport MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,
4941  double *x,double *y,double *z)
4942{
4943  assert(wand != (MagickWand *) NULL);
4944  assert(wand->signature == MagickWandSignature);
4945  if (wand->debug != MagickFalse)
4946    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4947  if (wand->images == (Image *) NULL)
4948    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4949  *x=wand->images->chromaticity.green_primary.x;
4950  *y=wand->images->chromaticity.green_primary.y;
4951  *z=wand->images->chromaticity.green_primary.z;
4952  return(MagickTrue);
4953}
4954
4955/*
4956%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4957%                                                                             %
4958%                                                                             %
4959%                                                                             %
4960%   M a g i c k G e t I m a g e H e i g h t                                   %
4961%                                                                             %
4962%                                                                             %
4963%                                                                             %
4964%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4965%
4966%  MagickGetImageHeight() returns the image height.
4967%
4968%  The format of the MagickGetImageHeight method is:
4969%
4970%      size_t MagickGetImageHeight(MagickWand *wand)
4971%
4972%  A description of each parameter follows:
4973%
4974%    o wand: the magick wand.
4975%
4976*/
4977WandExport size_t MagickGetImageHeight(MagickWand *wand)
4978{
4979  assert(wand != (MagickWand *) NULL);
4980  assert(wand->signature == MagickWandSignature);
4981  if (wand->debug != MagickFalse)
4982    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4983  if (wand->images == (Image *) NULL)
4984    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4985  return(wand->images->rows);
4986}
4987
4988/*
4989%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4990%                                                                             %
4991%                                                                             %
4992%                                                                             %
4993%   M a g i c k G e t I m a g e H i s t o g r a m                             %
4994%                                                                             %
4995%                                                                             %
4996%                                                                             %
4997%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4998%
4999%  MagickGetImageHistogram() returns the image histogram as an array of
5000%  PixelWand wands.
5001%
5002%  The format of the MagickGetImageHistogram method is:
5003%
5004%      PixelWand **MagickGetImageHistogram(MagickWand *wand,
5005%        size_t *number_colors)
5006%
5007%  A description of each parameter follows:
5008%
5009%    o wand: the magick wand.
5010%
5011%    o number_colors: the number of unique colors in the image and the number
5012%      of pixel wands returned.
5013%
5014*/
5015WandExport PixelWand **MagickGetImageHistogram(MagickWand *wand,
5016  size_t *number_colors)
5017{
5018  PixelInfo
5019    *histogram;
5020
5021  PixelWand
5022    **pixel_wands;
5023
5024  register ssize_t
5025    i;
5026
5027  assert(wand != (MagickWand *) NULL);
5028  assert(wand->signature == MagickWandSignature);
5029  if (wand->debug != MagickFalse)
5030    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5031  if (wand->images == (Image *) NULL)
5032    {
5033      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5034        "ContainsNoImages","`%s'",wand->name);
5035      return((PixelWand **) NULL);
5036    }
5037  histogram=GetImageHistogram(wand->images,number_colors,wand->exception);
5038  if (histogram == (PixelInfo *) NULL)
5039    return((PixelWand **) NULL);
5040  pixel_wands=NewPixelWands(*number_colors);
5041  for (i=0; i < (ssize_t) *number_colors; i++)
5042  {
5043    PixelSetPixelColor(pixel_wands[i],&histogram[i]);
5044    PixelSetColorCount(pixel_wands[i],(size_t) histogram[i].count);
5045  }
5046  histogram=(PixelInfo *) RelinquishMagickMemory(histogram);
5047  return(pixel_wands);
5048}
5049
5050/*
5051%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5052%                                                                             %
5053%                                                                             %
5054%                                                                             %
5055%   M a g i c k G e t I m a g e I n t e r l a c e S c h e m e                 %
5056%                                                                             %
5057%                                                                             %
5058%                                                                             %
5059%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5060%
5061%  MagickGetImageInterlaceScheme() gets the image interlace scheme.
5062%
5063%  The format of the MagickGetImageInterlaceScheme method is:
5064%
5065%      InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand)
5066%
5067%  A description of each parameter follows:
5068%
5069%    o wand: the magick wand.
5070%
5071*/
5072WandExport InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand)
5073{
5074  assert(wand != (MagickWand *) NULL);
5075  assert(wand->signature == MagickWandSignature);
5076  if (wand->debug != MagickFalse)
5077    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5078  if (wand->images == (Image *) NULL)
5079    {
5080      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5081        "ContainsNoImages","`%s'",wand->name);
5082      return(UndefinedInterlace);
5083    }
5084  return(wand->images->interlace);
5085}
5086
5087/*
5088%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5089%                                                                             %
5090%                                                                             %
5091%                                                                             %
5092%   M a g i c k G e t I m a g e I n t e r p o l a t e M e t h o d             %
5093%                                                                             %
5094%                                                                             %
5095%                                                                             %
5096%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5097%
5098%  MagickGetImageInterpolateMethod() returns the interpolation method for the
5099%  sepcified image.
5100%
5101%  The format of the MagickGetImageInterpolateMethod method is:
5102%
5103%      PixelInterpolateMethod MagickGetImagePixelInterpolateMethod(
5104%        MagickWand *wand)
5105%
5106%  A description of each parameter follows:
5107%
5108%    o wand: the magick wand.
5109%
5110*/
5111WandExport PixelInterpolateMethod MagickGetImageInterpolateMethod(
5112  MagickWand *wand)
5113{
5114  assert(wand != (MagickWand *) NULL);
5115  assert(wand->signature == MagickWandSignature);
5116  if (wand->debug != MagickFalse)
5117    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5118  if (wand->images == (Image *) NULL)
5119    {
5120      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5121        "ContainsNoImages","`%s'",wand->name);
5122      return(UndefinedInterpolatePixel);
5123    }
5124  return(wand->images->interpolate);
5125}
5126
5127/*
5128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5129%                                                                             %
5130%                                                                             %
5131%                                                                             %
5132%   M a g i c k G e t I m a g e I t e r a t i o n s                           %
5133%                                                                             %
5134%                                                                             %
5135%                                                                             %
5136%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5137%
5138%  MagickGetImageIterations() gets the image iterations.
5139%
5140%  The format of the MagickGetImageIterations method is:
5141%
5142%      size_t MagickGetImageIterations(MagickWand *wand)
5143%
5144%  A description of each parameter follows:
5145%
5146%    o wand: the magick wand.
5147%
5148*/
5149WandExport size_t MagickGetImageIterations(MagickWand *wand)
5150{
5151  assert(wand != (MagickWand *) NULL);
5152  assert(wand->signature == MagickWandSignature);
5153  if (wand->debug != MagickFalse)
5154    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5155  if (wand->images == (Image *) NULL)
5156    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5157  return(wand->images->iterations);
5158}
5159
5160/*
5161%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5162%                                                                             %
5163%                                                                             %
5164%                                                                             %
5165%   M a g i c k G e t I m a g e L e n g t h                                   %
5166%                                                                             %
5167%                                                                             %
5168%                                                                             %
5169%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5170%
5171%  MagickGetImageLength() returns the image length in bytes.
5172%
5173%  The format of the MagickGetImageLength method is:
5174%
5175%      MagickBooleanType MagickGetImageLength(MagickWand *wand,
5176%        MagickSizeType *length)
5177%
5178%  A description of each parameter follows:
5179%
5180%    o wand: the magick wand.
5181%
5182%    o length: the image length in bytes.
5183%
5184*/
5185WandExport MagickBooleanType MagickGetImageLength(MagickWand *wand,
5186  MagickSizeType *length)
5187{
5188  assert(wand != (MagickWand *) NULL);
5189  assert(wand->signature == MagickWandSignature);
5190  if (wand->debug != MagickFalse)
5191    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5192  if (wand->images == (Image *) NULL)
5193    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5194  *length=GetBlobSize(wand->images);
5195  return(MagickTrue);
5196}
5197
5198/*
5199%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5200%                                                                             %
5201%                                                                             %
5202%                                                                             %
5203%   M a g i c k G e t I m a g e O r i e n t a t i o n                         %
5204%                                                                             %
5205%                                                                             %
5206%                                                                             %
5207%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5208%
5209%  MagickGetImageOrientation() returns the image orientation.
5210%
5211%  The format of the MagickGetImageOrientation method is:
5212%
5213%      OrientationType MagickGetImageOrientation(MagickWand *wand)
5214%
5215%  A description of each parameter follows:
5216%
5217%    o wand: the magick wand.
5218%
5219*/
5220WandExport OrientationType MagickGetImageOrientation(MagickWand *wand)
5221{
5222  assert(wand != (MagickWand *) NULL);
5223  assert(wand->signature == MagickWandSignature);
5224  if (wand->debug != MagickFalse)
5225    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5226  if (wand->images == (Image *) NULL)
5227    {
5228      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5229        "ContainsNoImages","`%s'",wand->name);
5230      return(UndefinedOrientation);
5231    }
5232  return(wand->images->orientation);
5233}
5234
5235/*
5236%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5237%                                                                             %
5238%                                                                             %
5239%                                                                             %
5240%   M a g i c k G e t I m a g e P a g e                                       %
5241%                                                                             %
5242%                                                                             %
5243%                                                                             %
5244%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5245%
5246%  MagickGetImagePage() returns the page geometry associated with the image.
5247%
5248%  The format of the MagickGetImagePage method is:
5249%
5250%      MagickBooleanType MagickGetImagePage(MagickWand *wand,
5251%        size_t *width,size_t *height,ssize_t *x,ssize_t *y)
5252%
5253%  A description of each parameter follows:
5254%
5255%    o wand: the magick wand.
5256%
5257%    o width: the page width.
5258%
5259%    o height: the page height.
5260%
5261%    o x: the page x-offset.
5262%
5263%    o y: the page y-offset.
5264%
5265*/
5266WandExport MagickBooleanType MagickGetImagePage(MagickWand *wand,
5267  size_t *width,size_t *height,ssize_t *x,ssize_t *y)
5268{
5269  assert(wand != (const MagickWand *) NULL);
5270  assert(wand->signature == MagickWandSignature);
5271  if (wand->debug != MagickFalse)
5272    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5273  if (wand->images == (Image *) NULL)
5274    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5275  *width=wand->images->page.width;
5276  *height=wand->images->page.height;
5277  *x=wand->images->page.x;
5278  *y=wand->images->page.y;
5279  return(MagickTrue);
5280}
5281
5282/*
5283%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5284%                                                                             %
5285%                                                                             %
5286%                                                                             %
5287%   M a g i c k G e t I m a g e P i x e l C o l o r                           %
5288%                                                                             %
5289%                                                                             %
5290%                                                                             %
5291%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5292%
5293%  MagickGetImagePixelColor() returns the color of the specified pixel.
5294%
5295%  The format of the MagickGetImagePixelColor method is:
5296%
5297%      MagickBooleanType MagickGetImagePixelColor(MagickWand *wand,
5298%        const ssize_t x,const ssize_t y,PixelWand *color)
5299%
5300%  A description of each parameter follows:
5301%
5302%    o wand: the magick wand.
5303%
5304%    o x,y: the pixel offset into the image.
5305%
5306%    o color: Return the colormap color in this wand.
5307%
5308*/
5309WandExport MagickBooleanType MagickGetImagePixelColor(MagickWand *wand,
5310  const ssize_t x,const ssize_t y,PixelWand *color)
5311{
5312  register const Quantum
5313    *p;
5314
5315  CacheView
5316    *image_view;
5317
5318  assert(wand != (MagickWand *) NULL);
5319  assert(wand->signature == MagickWandSignature);
5320  if (wand->debug != MagickFalse)
5321    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5322  if (wand->images == (Image *) NULL)
5323    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5324  image_view=AcquireVirtualCacheView(wand->images,wand->exception);
5325  p=GetCacheViewVirtualPixels(image_view,x,y,1,1,wand->exception);
5326  if (p == (const Quantum *) NULL)
5327    {
5328      image_view=DestroyCacheView(image_view);
5329      return(MagickFalse);
5330    }
5331  PixelSetQuantumPixel(wand->images,p,color);
5332  image_view=DestroyCacheView(image_view);
5333  return(MagickTrue);
5334}
5335
5336/*
5337%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5338%                                                                             %
5339%                                                                             %
5340%                                                                             %
5341%   M a g i c k G e t I m a g e R e d P r i m a r y                           %
5342%                                                                             %
5343%                                                                             %
5344%                                                                             %
5345%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5346%
5347%  MagickGetImageRedPrimary() returns the chromaticy red primary point.
5348%
5349%  The format of the MagickGetImageRedPrimary method is:
5350%
5351%      MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,double *x,
5352%        double *y, double *z)
5353%
5354%  A description of each parameter follows:
5355%
5356%    o wand: the magick wand.
5357%
5358%    o x: the chromaticity red primary x-point.
5359%
5360%    o y: the chromaticity red primary y-point.
5361%
5362%    o z: the chromaticity red primary z-point.
5363%
5364*/
5365WandExport MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,
5366  double *x,double *y,double *z)
5367{
5368  assert(wand != (MagickWand *) NULL);
5369  assert(wand->signature == MagickWandSignature);
5370  if (wand->debug != MagickFalse)
5371    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5372  if (wand->images == (Image *) NULL)
5373    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5374  *x=wand->images->chromaticity.red_primary.x;
5375  *y=wand->images->chromaticity.red_primary.y;
5376  *z=wand->images->chromaticity.red_primary.z;
5377  return(MagickTrue);
5378}
5379
5380/*
5381%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5382%                                                                             %
5383%                                                                             %
5384%                                                                             %
5385%   M a g i c k G e t I m a g e R e g i o n                                   %
5386%                                                                             %
5387%                                                                             %
5388%                                                                             %
5389%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5390%
5391%  MagickGetImageRegion() extracts a region of the image and returns it as a
5392%  a new wand.
5393%
5394%  The format of the MagickGetImageRegion method is:
5395%
5396%      MagickWand *MagickGetImageRegion(MagickWand *wand,
5397%        const size_t width,const size_t height,const ssize_t x,
5398%        const ssize_t y)
5399%
5400%  A description of each parameter follows:
5401%
5402%    o wand: the magick wand.
5403%
5404%    o width: the region width.
5405%
5406%    o height: the region height.
5407%
5408%    o x: the region x offset.
5409%
5410%    o y: the region y offset.
5411%
5412*/
5413WandExport MagickWand *MagickGetImageRegion(MagickWand *wand,
5414  const size_t width,const size_t height,const ssize_t x,
5415  const ssize_t y)
5416{
5417  Image
5418    *region_image;
5419
5420  RectangleInfo
5421    region;
5422
5423  assert(wand != (MagickWand *) NULL);
5424  assert(wand->signature == MagickWandSignature);
5425  if (wand->debug != MagickFalse)
5426    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5427  if (wand->images == (Image *) NULL)
5428    return((MagickWand *) NULL);
5429  region.width=width;
5430  region.height=height;
5431  region.x=x;
5432  region.y=y;
5433  region_image=CropImage(wand->images,&region,wand->exception);
5434  if (region_image == (Image *) NULL)
5435    return((MagickWand *) NULL);
5436  return(CloneMagickWandFromImages(wand,region_image));
5437}
5438
5439/*
5440%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5441%                                                                             %
5442%                                                                             %
5443%                                                                             %
5444%   M a g i c k G e t I m a g e R e n d e r i n g I n t e n t                 %
5445%                                                                             %
5446%                                                                             %
5447%                                                                             %
5448%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5449%
5450%  MagickGetImageRenderingIntent() gets the image rendering intent.
5451%
5452%  The format of the MagickGetImageRenderingIntent method is:
5453%
5454%      RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand)
5455%
5456%  A description of each parameter follows:
5457%
5458%    o wand: the magick wand.
5459%
5460*/
5461WandExport RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand)
5462{
5463  assert(wand != (MagickWand *) NULL);
5464  assert(wand->signature == MagickWandSignature);
5465  if (wand->debug != MagickFalse)
5466    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5467  if (wand->images == (Image *) NULL)
5468    {
5469      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5470        "ContainsNoImages","`%s'",wand->name);
5471      return(UndefinedIntent);
5472    }
5473  return((RenderingIntent) wand->images->rendering_intent);
5474}
5475
5476/*
5477%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5478%                                                                             %
5479%                                                                             %
5480%                                                                             %
5481%   M a g i c k G e t I m a g e R e s o l u t i o n                           %
5482%                                                                             %
5483%                                                                             %
5484%                                                                             %
5485%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5486%
5487%  MagickGetImageResolution() gets the image X and Y resolution.
5488%
5489%  The format of the MagickGetImageResolution method is:
5490%
5491%      MagickBooleanType MagickGetImageResolution(MagickWand *wand,double *x,
5492%        double *y)
5493%
5494%  A description of each parameter follows:
5495%
5496%    o wand: the magick wand.
5497%
5498%    o x: the image x-resolution.
5499%
5500%    o y: the image y-resolution.
5501%
5502*/
5503WandExport MagickBooleanType MagickGetImageResolution(MagickWand *wand,
5504  double *x,double *y)
5505{
5506  assert(wand != (MagickWand *) NULL);
5507  assert(wand->signature == MagickWandSignature);
5508  if (wand->debug != MagickFalse)
5509    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5510  if (wand->images == (Image *) NULL)
5511    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5512  *x=wand->images->resolution.x;
5513  *y=wand->images->resolution.y;
5514  return(MagickTrue);
5515}
5516
5517/*
5518%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5519%                                                                             %
5520%                                                                             %
5521%                                                                             %
5522%   M a g i c k G e t I m a g e S c e n e                                     %
5523%                                                                             %
5524%                                                                             %
5525%                                                                             %
5526%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5527%
5528%  MagickGetImageScene() gets the image scene.
5529%
5530%  The format of the MagickGetImageScene method is:
5531%
5532%      size_t MagickGetImageScene(MagickWand *wand)
5533%
5534%  A description of each parameter follows:
5535%
5536%    o wand: the magick wand.
5537%
5538*/
5539WandExport size_t MagickGetImageScene(MagickWand *wand)
5540{
5541  assert(wand != (MagickWand *) NULL);
5542  assert(wand->signature == MagickWandSignature);
5543  if (wand->debug != MagickFalse)
5544    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5545  if (wand->images == (Image *) NULL)
5546    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5547  return(wand->images->scene);
5548}
5549
5550/*
5551%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5552%                                                                             %
5553%                                                                             %
5554%                                                                             %
5555%   M a g i c k G e t I m a g e S i g n a t u r e                             %
5556%                                                                             %
5557%                                                                             %
5558%                                                                             %
5559%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5560%
5561%  MagickGetImageSignature() generates an SHA-256 message digest for the image
5562%  pixel stream.
5563%
5564%  The format of the MagickGetImageSignature method is:
5565%
5566%      char *MagickGetImageSignature(MagickWand *wand)
5567%
5568%  A description of each parameter follows:
5569%
5570%    o wand: the magick wand.
5571%
5572*/
5573WandExport char *MagickGetImageSignature(MagickWand *wand)
5574{
5575  const char
5576    *value;
5577
5578  MagickBooleanType
5579    status;
5580
5581  assert(wand != (MagickWand *) NULL);
5582  assert(wand->signature == MagickWandSignature);
5583  if (wand->debug != MagickFalse)
5584    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5585  if (wand->images == (Image *) NULL)
5586    {
5587      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5588        "ContainsNoImages","`%s'",wand->name);
5589      return((char *) NULL);
5590    }
5591  status=SignatureImage(wand->images,wand->exception);
5592  if (status == MagickFalse)
5593    return((char *) NULL);
5594  value=GetImageProperty(wand->images,"signature",wand->exception);
5595  if (value == (const char *) NULL)
5596    return((char *) NULL);
5597  return(AcquireString(value));
5598}
5599
5600/*
5601%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5602%                                                                             %
5603%                                                                             %
5604%                                                                             %
5605%   M a g i c k G e t I m a g e T i c k s P e r S e c o n d                   %
5606%                                                                             %
5607%                                                                             %
5608%                                                                             %
5609%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5610%
5611%  MagickGetImageTicksPerSecond() gets the image ticks-per-second.
5612%
5613%  The format of the MagickGetImageTicksPerSecond method is:
5614%
5615%      size_t MagickGetImageTicksPerSecond(MagickWand *wand)
5616%
5617%  A description of each parameter follows:
5618%
5619%    o wand: the magick wand.
5620%
5621*/
5622WandExport size_t MagickGetImageTicksPerSecond(MagickWand *wand)
5623{
5624  assert(wand != (MagickWand *) NULL);
5625  assert(wand->signature == MagickWandSignature);
5626  if (wand->debug != MagickFalse)
5627    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5628  if (wand->images == (Image *) NULL)
5629    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5630  return((size_t) wand->images->ticks_per_second);
5631}
5632
5633/*
5634%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5635%                                                                             %
5636%                                                                             %
5637%                                                                             %
5638%   M a g i c k G e t I m a g e T y p e                                       %
5639%                                                                             %
5640%                                                                             %
5641%                                                                             %
5642%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5643%
5644%  MagickGetImageType() gets the potential image type:
5645%
5646%        Bilevel        Grayscale       GrayscaleMatte
5647%        Palette        PaletteMatte    TrueColor
5648%        TrueColorMatte ColorSeparation ColorSeparationMatte
5649%
5650%  The format of the MagickGetImageType method is:
5651%
5652%      ImageType MagickGetImageType(MagickWand *wand)
5653%
5654%  A description of each parameter follows:
5655%
5656%    o wand: the magick wand.
5657%
5658*/
5659WandExport ImageType MagickGetImageType(MagickWand *wand)
5660{
5661  assert(wand != (MagickWand *) NULL);
5662  assert(wand->signature == MagickWandSignature);
5663  if (wand->debug != MagickFalse)
5664    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5665  if (wand->images == (Image *) NULL)
5666    {
5667      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5668        "ContainsNoImages","`%s'",wand->name);
5669      return(UndefinedType);
5670    }
5671  return(GetImageType(wand->images));
5672}
5673
5674/*
5675%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5676%                                                                             %
5677%                                                                             %
5678%                                                                             %
5679%   M a g i c k G e t I m a g e U n i t s                                     %
5680%                                                                             %
5681%                                                                             %
5682%                                                                             %
5683%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5684%
5685%  MagickGetImageUnits() gets the image units of resolution.
5686%
5687%  The format of the MagickGetImageUnits method is:
5688%
5689%      ResolutionType MagickGetImageUnits(MagickWand *wand)
5690%
5691%  A description of each parameter follows:
5692%
5693%    o wand: the magick wand.
5694%
5695*/
5696WandExport ResolutionType MagickGetImageUnits(MagickWand *wand)
5697{
5698  assert(wand != (MagickWand *) NULL);
5699  assert(wand->signature == MagickWandSignature);
5700  if (wand->debug != MagickFalse)
5701    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5702  if (wand->images == (Image *) NULL)
5703    {
5704      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5705        "ContainsNoImages","`%s'",wand->name);
5706      return(UndefinedResolution);
5707    }
5708  return(wand->images->units);
5709}
5710
5711/*
5712%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5713%                                                                             %
5714%                                                                             %
5715%                                                                             %
5716%   M a g i c k G e t I m a g e V i r t u a l P i x e l M e t h o d           %
5717%                                                                             %
5718%                                                                             %
5719%                                                                             %
5720%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5721%
5722%  MagickGetImageVirtualPixelMethod() returns the virtual pixel method for the
5723%  sepcified image.
5724%
5725%  The format of the MagickGetImageVirtualPixelMethod method is:
5726%
5727%      VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand)
5728%
5729%  A description of each parameter follows:
5730%
5731%    o wand: the magick wand.
5732%
5733*/
5734WandExport VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand)
5735{
5736  assert(wand != (MagickWand *) NULL);
5737  assert(wand->signature == MagickWandSignature);
5738  if (wand->debug != MagickFalse)
5739    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5740  if (wand->images == (Image *) NULL)
5741    {
5742      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5743        "ContainsNoImages","`%s'",wand->name);
5744      return(UndefinedVirtualPixelMethod);
5745    }
5746  return(GetImageVirtualPixelMethod(wand->images));
5747}
5748
5749/*
5750%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5751%                                                                             %
5752%                                                                             %
5753%                                                                             %
5754%   M a g i c k G e t I m a g e W h i t e P o i n t                           %
5755%                                                                             %
5756%                                                                             %
5757%                                                                             %
5758%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5759%
5760%  MagickGetImageWhitePoint() returns the chromaticy white point.
5761%
5762%  The format of the MagickGetImageWhitePoint method is:
5763%
5764%      MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,double *x,
5765%        double *y,double *z)
5766%
5767%  A description of each parameter follows:
5768%
5769%    o wand: the magick wand.
5770%
5771%    o x: the chromaticity white x-point.
5772%
5773%    o y: the chromaticity white y-point.
5774%
5775%    o z: the chromaticity white z-point.
5776%
5777*/
5778WandExport MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,
5779  double *x,double *y,double *z)
5780{
5781  assert(wand != (MagickWand *) NULL);
5782  assert(wand->signature == MagickWandSignature);
5783  if (wand->debug != MagickFalse)
5784    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5785  if (wand->images == (Image *) NULL)
5786    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5787  *x=wand->images->chromaticity.white_point.x;
5788  *y=wand->images->chromaticity.white_point.y;
5789  *z=wand->images->chromaticity.white_point.z;
5790  return(MagickTrue);
5791}
5792
5793/*
5794%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5795%                                                                             %
5796%                                                                             %
5797%                                                                             %
5798%   M a g i c k G e t I m a g e W i d t h                                     %
5799%                                                                             %
5800%                                                                             %
5801%                                                                             %
5802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5803%
5804%  MagickGetImageWidth() returns the image width.
5805%
5806%  The format of the MagickGetImageWidth method is:
5807%
5808%      size_t MagickGetImageWidth(MagickWand *wand)
5809%
5810%  A description of each parameter follows:
5811%
5812%    o wand: the magick wand.
5813%
5814*/
5815WandExport size_t MagickGetImageWidth(MagickWand *wand)
5816{
5817  assert(wand != (MagickWand *) NULL);
5818  assert(wand->signature == MagickWandSignature);
5819  if (wand->debug != MagickFalse)
5820    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5821  if (wand->images == (Image *) NULL)
5822    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5823  return(wand->images->columns);
5824}
5825
5826/*
5827%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5828%                                                                             %
5829%                                                                             %
5830%                                                                             %
5831%   M a g i c k G e t N u m b e r I m a g e s                                 %
5832%                                                                             %
5833%                                                                             %
5834%                                                                             %
5835%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5836%
5837%  MagickGetNumberImages() returns the number of images associated with a
5838%  magick wand.
5839%
5840%  The format of the MagickGetNumberImages method is:
5841%
5842%      size_t MagickGetNumberImages(MagickWand *wand)
5843%
5844%  A description of each parameter follows:
5845%
5846%    o wand: the magick wand.
5847%
5848*/
5849WandExport size_t MagickGetNumberImages(MagickWand *wand)
5850{
5851  assert(wand != (MagickWand *) NULL);
5852  assert(wand->signature == MagickWandSignature);
5853  if (wand->debug != MagickFalse)
5854    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5855  return(GetImageListLength(wand->images));
5856}
5857
5858/*
5859%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5860%                                                                             %
5861%                                                                             %
5862%                                                                             %
5863%   M a g i c k I m a g e G e t T o t a l I n k D e n s i t y                 %
5864%                                                                             %
5865%                                                                             %
5866%                                                                             %
5867%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5868%
5869%  MagickGetImageTotalInkDensity() gets the image total ink density.
5870%
5871%  The format of the MagickGetImageTotalInkDensity method is:
5872%
5873%      double MagickGetImageTotalInkDensity(MagickWand *wand)
5874%
5875%  A description of each parameter follows:
5876%
5877%    o wand: the magick wand.
5878%
5879*/
5880WandExport double MagickGetImageTotalInkDensity(MagickWand *wand)
5881{
5882  assert(wand != (MagickWand *) NULL);
5883  assert(wand->signature == MagickWandSignature);
5884  if (wand->debug != MagickFalse)
5885    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5886  if (wand->images == (Image *) NULL)
5887    {
5888      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5889        "ContainsNoImages","`%s'",wand->name);
5890      return(0.0);
5891    }
5892  return(GetImageTotalInkDensity(wand->images,wand->exception));
5893}
5894
5895/*
5896%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5897%                                                                             %
5898%                                                                             %
5899%                                                                             %
5900%   M a g i c k H a l d C l u t I m a g e                                     %
5901%                                                                             %
5902%                                                                             %
5903%                                                                             %
5904%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5905%
5906%  MagickHaldClutImage() replaces colors in the image from a Hald color lookup
5907%  table.   A Hald color lookup table is a 3-dimensional color cube mapped to 2
5908%  dimensions.  Create it with the HALD coder.  You can apply any color
5909%  transformation to the Hald image and then use this method to apply the
5910%  transform to the image.
5911%
5912%  The format of the MagickHaldClutImage method is:
5913%
5914%      MagickBooleanType MagickHaldClutImage(MagickWand *wand,
5915%        const MagickWand *hald_wand)
5916%
5917%  A description of each parameter follows:
5918%
5919%    o wand: the magick wand.
5920%
5921%    o hald_image: the hald CLUT image.
5922%
5923*/
5924WandExport MagickBooleanType MagickHaldClutImage(MagickWand *wand,
5925  const MagickWand *hald_wand)
5926{
5927  MagickBooleanType
5928    status;
5929
5930  assert(wand != (MagickWand *) NULL);
5931  assert(wand->signature == MagickWandSignature);
5932  if (wand->debug != MagickFalse)
5933    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5934  if ((wand->images == (Image *) NULL) || (hald_wand->images == (Image *) NULL))
5935    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5936  status=HaldClutImage(wand->images,hald_wand->images,wand->exception);
5937  return(status);
5938}
5939
5940/*
5941%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5942%                                                                             %
5943%                                                                             %
5944%                                                                             %
5945%   M a g i c k H a s N e x t I m a g e                                       %
5946%                                                                             %
5947%                                                                             %
5948%                                                                             %
5949%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5950%
5951%  MagickHasNextImage() returns MagickTrue if the wand has more images when
5952%  traversing the list in the forward direction
5953%
5954%  The format of the MagickHasNextImage method is:
5955%
5956%      MagickBooleanType MagickHasNextImage(MagickWand *wand)
5957%
5958%  A description of each parameter follows:
5959%
5960%    o wand: the magick wand.
5961%
5962*/
5963WandExport MagickBooleanType MagickHasNextImage(MagickWand *wand)
5964{
5965  assert(wand != (MagickWand *) NULL);
5966  assert(wand->signature == MagickWandSignature);
5967  if (wand->debug != MagickFalse)
5968    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5969  if (wand->images == (Image *) NULL)
5970    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5971  if (GetNextImageInList(wand->images) == (Image *) NULL)
5972    return(MagickFalse);
5973  return(MagickTrue);
5974}
5975
5976/*
5977%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5978%                                                                             %
5979%                                                                             %
5980%                                                                             %
5981%   M a g i c k H a s P r e v i o u s I m a g e                               %
5982%                                                                             %
5983%                                                                             %
5984%                                                                             %
5985%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5986%
5987%  MagickHasPreviousImage() returns MagickTrue if the wand has more images when
5988%  traversing the list in the reverse direction
5989%
5990%  The format of the MagickHasPreviousImage method is:
5991%
5992%      MagickBooleanType MagickHasPreviousImage(MagickWand *wand)
5993%
5994%  A description of each parameter follows:
5995%
5996%    o wand: the magick wand.
5997%
5998*/
5999WandExport MagickBooleanType MagickHasPreviousImage(MagickWand *wand)
6000{
6001  assert(wand != (MagickWand *) NULL);
6002  assert(wand->signature == MagickWandSignature);
6003  if (wand->debug != MagickFalse)
6004    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6005  if (wand->images == (Image *) NULL)
6006    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6007  if (GetPreviousImageInList(wand->images) == (Image *) NULL)
6008    return(MagickFalse);
6009  return(MagickTrue);
6010}
6011
6012/*
6013%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6014%                                                                             %
6015%                                                                             %
6016%                                                                             %
6017%   M a g i c k I d e n t i f y I m a g e                                     %
6018%                                                                             %
6019%                                                                             %
6020%                                                                             %
6021%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6022%
6023%  MagickIdentifyImage() identifies an image by printing its attributes to the
6024%  file.  Attributes include the image width, height, size, and others.
6025%
6026%  The format of the MagickIdentifyImage method is:
6027%
6028%      const char *MagickIdentifyImage(MagickWand *wand)
6029%
6030%  A description of each parameter follows:
6031%
6032%    o wand: the magick wand.
6033%
6034*/
6035WandExport char *MagickIdentifyImage(MagickWand *wand)
6036{
6037  char
6038    *description,
6039    filename[MagickPathExtent];
6040
6041  FILE
6042    *file;
6043
6044  int
6045    unique_file;
6046
6047  assert(wand != (MagickWand *) NULL);
6048  assert(wand->signature == MagickWandSignature);
6049  if (wand->debug != MagickFalse)
6050    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6051  if (wand->images == (Image *) NULL)
6052    {
6053      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
6054        "ContainsNoImages","`%s'",wand->name);
6055      return((char *) NULL);
6056    }
6057  description=(char *) NULL;
6058  unique_file=AcquireUniqueFileResource(filename);
6059  file=(FILE *) NULL;
6060  if (unique_file != -1)
6061    file=fdopen(unique_file,"wb");
6062  if ((unique_file == -1) || (file == (FILE *) NULL))
6063    {
6064      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
6065        "UnableToCreateTemporaryFile","`%s'",wand->name);
6066      return((char *) NULL);
6067    }
6068  (void) IdentifyImage(wand->images,file,MagickTrue,wand->exception);
6069  (void) fclose(file);
6070  description=FileToString(filename,~0UL,wand->exception);
6071  (void) RelinquishUniqueFileResource(filename);
6072  return(description);
6073}
6074
6075/*
6076%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6077%                                                                             %
6078%                                                                             %
6079%                                                                             %
6080%   M a g i c k I d e n t i f y I m a g e T y p e                             %
6081%                                                                             %
6082%                                                                             %
6083%                                                                             %
6084%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6085%
6086%  MagickIdentifyImageType() gets the potential image type:
6087%
6088%        Bilevel        Grayscale       GrayscaleMatte
6089%        Palette        PaletteMatte    TrueColor
6090%        TrueColorMatte ColorSeparation ColorSeparationMatte
6091%
6092%  To ensure the image type matches its potential, use MagickSetImageType():
6093%
6094%    (void) MagickSetImageType(wand,MagickIdentifyImageType(wand));
6095%
6096%  The format of the MagickIdentifyImageType method is:
6097%
6098%      ImageType MagickIdentifyImageType(MagickWand *wand)
6099%
6100%  A description of each parameter follows:
6101%
6102%    o wand: the magick wand.
6103%
6104*/
6105WandExport ImageType MagickIdentifyImageType(MagickWand *wand)
6106{
6107  assert(wand != (MagickWand *) NULL);
6108  assert(wand->signature == MagickWandSignature);
6109  if (wand->debug != MagickFalse)
6110    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6111  if (wand->images == (Image *) NULL)
6112    {
6113      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
6114        "ContainsNoImages","`%s'",wand->name);
6115      return(UndefinedType);
6116    }
6117  return(IdentifyImageType(wand->images,wand->exception));
6118}
6119
6120/*
6121%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6122%                                                                             %
6123%                                                                             %
6124%                                                                             %
6125%   M a g i c k I m p l o d e I m a g e                                       %
6126%                                                                             %
6127%                                                                             %
6128%                                                                             %
6129%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6130%
6131%  MagickImplodeImage() creates a new image that is a copy of an existing
6132%  one with the image pixels "implode" by the specified percentage.  It
6133%  allocates the memory necessary for the new Image structure and returns a
6134%  pointer to the new image.
6135%
6136%  The format of the MagickImplodeImage method is:
6137%
6138%      MagickBooleanType MagickImplodeImage(MagickWand *wand,
6139%        const double radius,const PixelInterpolateMethod method)
6140%
6141%  A description of each parameter follows:
6142%
6143%    o wand: the magick wand.
6144%
6145%    o amount: Define the extent of the implosion.
6146%
6147%    o method: the pixel interpolation method.
6148%
6149*/
6150WandExport MagickBooleanType MagickImplodeImage(MagickWand *wand,
6151  const double amount,const PixelInterpolateMethod method)
6152{
6153  Image
6154    *implode_image;
6155
6156  assert(wand != (MagickWand *) NULL);
6157  assert(wand->signature == MagickWandSignature);
6158  if (wand->debug != MagickFalse)
6159    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6160  if (wand->images == (Image *) NULL)
6161    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6162  implode_image=ImplodeImage(wand->images,amount,method,wand->exception);
6163  if (implode_image == (Image *) NULL)
6164    return(MagickFalse);
6165  ReplaceImageInList(&wand->images,implode_image);
6166  return(MagickTrue);
6167}
6168
6169/*
6170%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6171%                                                                             %
6172%                                                                             %
6173%                                                                             %
6174%   M a g i c k I m p o r t I m a g e P i x e l s                             %
6175%                                                                             %
6176%                                                                             %
6177%                                                                             %
6178%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6179%
6180%  MagickImportImagePixels() accepts pixel datand stores it in the image at the
6181%  location you specify.  The method returns MagickFalse on success otherwise
6182%  MagickTrue if an error is encountered.  The pixel data can be either char,
6183%  short int, int, ssize_t, float, or double in the order specified by map.
6184%
6185%  Suppose your want to upload the first scanline of a 640x480 image from
6186%  character data in red-green-blue order:
6187%
6188%      MagickImportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
6189%
6190%  The format of the MagickImportImagePixels method is:
6191%
6192%      MagickBooleanType MagickImportImagePixels(MagickWand *wand,
6193%        const ssize_t x,const ssize_t y,const size_t columns,
6194%        const size_t rows,const char *map,const StorageType storage,
6195%        const void *pixels)
6196%
6197%  A description of each parameter follows:
6198%
6199%    o wand: the magick wand.
6200%
6201%    o x, y, columns, rows:  These values define the perimeter of a region
6202%      of pixels you want to define.
6203%
6204%    o map:  This string reflects the expected ordering of the pixel array.
6205%      It can be any combination or order of R = red, G = green, B = blue,
6206%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
6207%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
6208%      P = pad.
6209%
6210%    o storage: Define the data type of the pixels.  Float and double types are
6211%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
6212%      these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel,
6213%      or DoublePixel.
6214%
6215%    o pixels: This array of values contain the pixel components as defined by
6216%      map and type.  You must preallocate this array where the expected
6217%      length varies depending on the values of width, height, map, and type.
6218%
6219*/
6220WandExport MagickBooleanType MagickImportImagePixels(MagickWand *wand,
6221  const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
6222  const char *map,const StorageType storage,const void *pixels)
6223{
6224  MagickBooleanType
6225    status;
6226
6227  assert(wand != (MagickWand *) NULL);
6228  assert(wand->signature == MagickWandSignature);
6229  if (wand->debug != MagickFalse)
6230    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6231  if (wand->images == (Image *) NULL)
6232    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6233  status=ImportImagePixels(wand->images,x,y,columns,rows,map,storage,pixels,
6234    wand->exception);
6235  return(status);
6236}
6237
6238/*
6239%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6240%                                                                             %
6241%                                                                             %
6242%                                                                             %
6243%   M a g i c k I n t e r p o l a t i v e R e s i z e I m a g e               %
6244%                                                                             %
6245%                                                                             %
6246%                                                                             %
6247%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6248%
6249%  MagickInterpolativeResizeImage() resize image using a interpolative
6250%  method.
6251%
6252%      MagickBooleanType MagickInterpolativeResizeImage(MagickWand *wand,
6253%        const size_t columns,const size_t rows,
6254%        const PixelInterpolateMethod method)
6255%
6256%  A description of each parameter follows:
6257%
6258%    o wand: the magick wand.
6259%
6260%    o columns: the number of columns in the scaled image.
6261%
6262%    o rows: the number of rows in the scaled image.
6263%
6264%    o interpolate: the pixel interpolation method.
6265%
6266*/
6267WandExport MagickBooleanType MagickInterpolativeResizeImage(MagickWand *wand,
6268  const size_t columns,const size_t rows,const PixelInterpolateMethod method)
6269{
6270  Image
6271    *resize_image;
6272
6273  assert(wand != (MagickWand *) NULL);
6274  assert(wand->signature == MagickWandSignature);
6275  if (wand->debug != MagickFalse)
6276    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6277  if (wand->images == (Image *) NULL)
6278    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6279  resize_image=InterpolativeResizeImage(wand->images,columns,rows,method,
6280    wand->exception);
6281  if (resize_image == (Image *) NULL)
6282    return(MagickFalse);
6283  ReplaceImageInList(&wand->images,resize_image);
6284  return(MagickTrue);
6285}
6286
6287/*
6288%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6289%                                                                             %
6290%                                                                             %
6291%                                                                             %
6292%   M a g i c k I n v e r s e F o u r i e r T r a n s f o r m I m a g e       %
6293%                                                                             %
6294%                                                                             %
6295%                                                                             %
6296%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6297%
6298%  MagickInverseFourierTransformImage() implements the inverse discrete
6299%  Fourier transform (DFT) of the image either as a magnitude / phase or real /
6300%  imaginary image pair.
6301%
6302%  The format of the MagickInverseFourierTransformImage method is:
6303%
6304%      MagickBooleanType MagickInverseFourierTransformImage(
6305%        MagickWand *magnitude_wand,MagickWand *phase_wand,
6306%        const MagickBooleanType magnitude)
6307%
6308%  A description of each parameter follows:
6309%
6310%    o magnitude_wand: the magnitude or real wand.
6311%
6312%    o phase_wand: the phase or imaginary wand.
6313%
6314%    o magnitude: if true, return as magnitude / phase pair otherwise a real /
6315%      imaginary image pair.
6316%
6317*/
6318WandExport MagickBooleanType MagickInverseFourierTransformImage(
6319  MagickWand *magnitude_wand,MagickWand *phase_wand,
6320  const MagickBooleanType magnitude)
6321{
6322  Image
6323    *inverse_image;
6324
6325  MagickWand
6326    *wand;
6327
6328  assert(magnitude_wand != (MagickWand *) NULL);
6329  assert(magnitude_wand->signature == MagickWandSignature);
6330  if (magnitude_wand->debug != MagickFalse)
6331    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",
6332      magnitude_wand->name);
6333  wand=magnitude_wand;
6334  if (magnitude_wand->images == (Image *) NULL)
6335    ThrowWandException(WandError,"ContainsNoImages",
6336      magnitude_wand->name);
6337  assert(phase_wand != (MagickWand *) NULL);
6338  assert(phase_wand->signature == MagickWandSignature);
6339  inverse_image=InverseFourierTransformImage(magnitude_wand->images,
6340    phase_wand->images,magnitude,wand->exception);
6341  if (inverse_image == (Image *) NULL)
6342    return(MagickFalse);
6343  ReplaceImageInList(&wand->images,inverse_image);
6344  return(MagickTrue);
6345}
6346
6347/*
6348%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6349%                                                                             %
6350%                                                                             %
6351%                                                                             %
6352%   M a g i c k L a b e l I m a g e                                           %
6353%                                                                             %
6354%                                                                             %
6355%                                                                             %
6356%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6357%
6358%  MagickLabelImage() adds a label to your image.
6359%
6360%  The format of the MagickLabelImage method is:
6361%
6362%      MagickBooleanType MagickLabelImage(MagickWand *wand,const char *label)
6363%
6364%  A description of each parameter follows:
6365%
6366%    o wand: the magick wand.
6367%
6368%    o label: the image label.
6369%
6370*/
6371WandExport MagickBooleanType MagickLabelImage(MagickWand *wand,
6372  const char *label)
6373{
6374  MagickBooleanType
6375    status;
6376
6377  assert(wand != (MagickWand *) NULL);
6378  assert(wand->signature == MagickWandSignature);
6379  if (wand->debug != MagickFalse)
6380    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6381  if (wand->images == (Image *) NULL)
6382    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6383  status=SetImageProperty(wand->images,"label",label,wand->exception);
6384  return(status);
6385}
6386
6387/*
6388%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6389%                                                                             %
6390%                                                                             %
6391%                                                                             %
6392%   M a g i c k L e v e l I m a g e                                           %
6393%                                                                             %
6394%                                                                             %
6395%                                                                             %
6396%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6397%
6398%  MagickLevelImage() adjusts the levels of an image by scaling the colors
6399%  falling between specified white and black points to the full available
6400%  quantum range. The parameters provided represent the black, mid, and white
6401%  points. The black point specifies the darkest color in the image. Colors
6402%  darker than the black point are set to zero. Mid point specifies a gamma
6403%  correction to apply to the image.  White point specifies the lightest color
6404%  in the image. Colors brighter than the white point are set to the maximum
6405%  quantum value.
6406%
6407%  The format of the MagickLevelImage method is:
6408%
6409%      MagickBooleanType MagickLevelImage(MagickWand *wand,
6410%        const double black_point,const double gamma,const double white_point)
6411%      MagickBooleanType MagickLevelImage(MagickWand *wand,
6412%        const ChannelType channel,const double black_point,const double gamma,
6413%        const double white_point)
6414%
6415%  A description of each parameter follows:
6416%
6417%    o wand: the magick wand.
6418%
6419%    o channel: Identify which channel to level: RedPixelChannel,
6420%      GreenPixelChannel, etc.
6421%
6422%    o black_point: the black point.
6423%
6424%    o gamma: the gamma.
6425%
6426%    o white_point: the white point.
6427%
6428*/
6429WandExport MagickBooleanType MagickLevelImage(MagickWand *wand,
6430  const double black_point,const double gamma,const double white_point)
6431{
6432  MagickBooleanType
6433    status;
6434
6435  assert(wand != (MagickWand *) NULL);
6436  assert(wand->signature == MagickWandSignature);
6437  if (wand->debug != MagickFalse)
6438    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6439  if (wand->images == (Image *) NULL)
6440    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6441  status=LevelImage(wand->images,black_point,white_point,gamma,
6442    wand->exception);
6443  return(status);
6444}
6445
6446/*
6447%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6448%                                                                             %
6449%                                                                             %
6450%                                                                             %
6451%   M a g i c k L i n e a r S t r e t c h I m a g e                           %
6452%                                                                             %
6453%                                                                             %
6454%                                                                             %
6455%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6456%
6457%  MagickLinearStretchImage() stretches with saturation the image intensity.
6458%
6459%  You can also reduce the influence of a particular channel with a gamma
6460%  value of 0.
6461%
6462%  The format of the MagickLinearStretchImage method is:
6463%
6464%      MagickBooleanType MagickLinearStretchImage(MagickWand *wand,
6465%        const double black_point,const double white_point)
6466%
6467%  A description of each parameter follows:
6468%
6469%    o wand: the magick wand.
6470%
6471%    o black_point: the black point.
6472%
6473%    o white_point: the white point.
6474%
6475*/
6476WandExport MagickBooleanType MagickLinearStretchImage(MagickWand *wand,
6477  const double black_point,const double white_point)
6478{
6479  MagickBooleanType
6480    status;
6481
6482  assert(wand != (MagickWand *) NULL);
6483  assert(wand->signature == MagickWandSignature);
6484  if (wand->debug != MagickFalse)
6485    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6486  if (wand->images == (Image *) NULL)
6487    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6488  status=LinearStretchImage(wand->images,black_point,white_point,
6489    wand->exception);
6490  return(status);
6491}
6492
6493/*
6494%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6495%                                                                             %
6496%                                                                             %
6497%                                                                             %
6498%   M a g i c k L i q u i d R e s c a l e I m a g e                           %
6499%                                                                             %
6500%                                                                             %
6501%                                                                             %
6502%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6503%
6504%  MagickLiquidRescaleImage() rescales image with seam carving.
6505%
6506%      MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand,
6507%        const size_t columns,const size_t rows,
6508%        const double delta_x,const double rigidity)
6509%
6510%  A description of each parameter follows:
6511%
6512%    o wand: the magick wand.
6513%
6514%    o columns: the number of columns in the scaled image.
6515%
6516%    o rows: the number of rows in the scaled image.
6517%
6518%    o delta_x: maximum seam transversal step (0 means straight seams).
6519%
6520%    o rigidity: introduce a bias for non-straight seams (typically 0).
6521%
6522*/
6523WandExport MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand,
6524  const size_t columns,const size_t rows,const double delta_x,
6525  const double rigidity)
6526{
6527  Image
6528    *rescale_image;
6529
6530  assert(wand != (MagickWand *) NULL);
6531  assert(wand->signature == MagickWandSignature);
6532  if (wand->debug != MagickFalse)
6533    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6534  if (wand->images == (Image *) NULL)
6535    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6536  rescale_image=LiquidRescaleImage(wand->images,columns,rows,delta_x,
6537    rigidity,wand->exception);
6538  if (rescale_image == (Image *) NULL)
6539    return(MagickFalse);
6540  ReplaceImageInList(&wand->images,rescale_image);
6541  return(MagickTrue);
6542}
6543
6544/*
6545%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6546%                                                                             %
6547%                                                                             %
6548%                                                                             %
6549%     M a g i c k L o c a l C o n t r a s t I m a g e                         %
6550%                                                                             %
6551%                                                                             %
6552%                                                                             %
6553%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6554%
6555%  MagickLocalContrastImage() attempts to increase the appearance of
6556%  large-scale light-dark transitions. Local contrast enhancement works
6557%  similarly to sharpening with an unsharp mask, however the mask is instead
6558%  created using an image with a greater blur distance.
6559%
6560%      MagickBooleanType MagickLocalContrastImage(MagickWand *wand,
6561%        const double radius,const double strength)
6562%
6563%  A description of each parameter follows:
6564%
6565%    o image: the image.
6566%
6567%    o radius: the radius of the Gaussian, in pixels, not counting
6568%      the center pixel.
6569%
6570%    o strength: the strength of the blur mask in percentage.
6571%
6572*/
6573WandExport MagickBooleanType MagickLocalContrastImage(MagickWand *wand,
6574  const double radius, const double strength)
6575{
6576  Image
6577    *contrast_image;
6578
6579  assert(wand != (MagickWand *)NULL);
6580  assert(wand->signature == MagickWandSignature);
6581  if (wand->debug != MagickFalse)
6582    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s", wand->name);
6583  if (wand->images == (Image *)NULL)
6584    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6585  contrast_image=LocalContrastImage(wand->images,radius,strength,
6586    wand->exception);
6587  if (contrast_image == (Image *)NULL)
6588    return(MagickFalse);
6589  ReplaceImageInList(&wand->images,contrast_image);
6590  return(MagickTrue);
6591}
6592
6593/*
6594%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6595%                                                                             %
6596%                                                                             %
6597%                                                                             %
6598%   M a g i c k M a g n i f y I m a g e                                       %
6599%                                                                             %
6600%                                                                             %
6601%                                                                             %
6602%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6603%
6604%  MagickMagnifyImage() is a convenience method that scales an image
6605%  proportionally to twice its original size.
6606%
6607%  The format of the MagickMagnifyImage method is:
6608%
6609%      MagickBooleanType MagickMagnifyImage(MagickWand *wand)
6610%
6611%  A description of each parameter follows:
6612%
6613%    o wand: the magick wand.
6614%
6615*/
6616WandExport MagickBooleanType MagickMagnifyImage(MagickWand *wand)
6617{
6618  Image
6619    *magnify_image;
6620
6621  assert(wand != (MagickWand *) NULL);
6622  assert(wand->signature == MagickWandSignature);
6623  if (wand->debug != MagickFalse)
6624    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6625  if (wand->images == (Image *) NULL)
6626    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6627  magnify_image=MagnifyImage(wand->images,wand->exception);
6628  if (magnify_image == (Image *) NULL)
6629    return(MagickFalse);
6630  ReplaceImageInList(&wand->images,magnify_image);
6631  return(MagickTrue);
6632}
6633
6634/*
6635%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6636%                                                                             %
6637%                                                                             %
6638%                                                                             %
6639%   M a g i c k M e r g e I m a g e L a y e r s                               %
6640%                                                                             %
6641%                                                                             %
6642%                                                                             %
6643%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6644%
6645%  MagickMergeImageLayers() composes all the image layers from the current
6646%  given image onward to produce a single image of the merged layers.
6647%
6648%  The inital canvas's size depends on the given LayerMethod, and is
6649%  initialized using the first images background color.  The images
6650%  are then compositied onto that image in sequence using the given
6651%  composition that has been assigned to each individual image.
6652%
6653%  The format of the MagickMergeImageLayers method is:
6654%
6655%      MagickWand *MagickMergeImageLayers(MagickWand *wand,
6656%        const LayerMethod method)
6657%
6658%  A description of each parameter follows:
6659%
6660%    o wand: the magick wand.
6661%
6662%    o method: the method of selecting the size of the initial canvas.
6663%
6664%        MergeLayer: Merge all layers onto a canvas just large enough
6665%           to hold all the actual images. The virtual canvas of the
6666%           first image is preserved but otherwise ignored.
6667%
6668%        FlattenLayer: Use the virtual canvas size of first image.
6669%           Images which fall outside this canvas is clipped.
6670%           This can be used to 'fill out' a given virtual canvas.
6671%
6672%        MosaicLayer: Start with the virtual canvas of the first image,
6673%           enlarging left and right edges to contain all images.
6674%           Images with negative offsets will be clipped.
6675%
6676*/
6677WandExport MagickWand *MagickMergeImageLayers(MagickWand *wand,
6678  const LayerMethod method)
6679{
6680  Image
6681    *mosaic_image;
6682
6683  assert(wand != (MagickWand *) NULL);
6684  assert(wand->signature == MagickWandSignature);
6685  if (wand->debug != MagickFalse)
6686    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6687  if (wand->images == (Image *) NULL)
6688    return((MagickWand *) NULL);
6689  mosaic_image=MergeImageLayers(wand->images,method,wand->exception);
6690  if (mosaic_image == (Image *) NULL)
6691    return((MagickWand *) NULL);
6692  return(CloneMagickWandFromImages(wand,mosaic_image));
6693}
6694
6695/*
6696%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6697%                                                                             %
6698%                                                                             %
6699%                                                                             %
6700%   M a g i c k M i n i f y I m a g e                                         %
6701%                                                                             %
6702%                                                                             %
6703%                                                                             %
6704%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6705%
6706%  MagickMinifyImage() is a convenience method that scales an image
6707%  proportionally to one-half its original size
6708%
6709%  The format of the MagickMinifyImage method is:
6710%
6711%      MagickBooleanType MagickMinifyImage(MagickWand *wand)
6712%
6713%  A description of each parameter follows:
6714%
6715%    o wand: the magick wand.
6716%
6717*/
6718WandExport MagickBooleanType MagickMinifyImage(MagickWand *wand)
6719{
6720  Image
6721    *minify_image;
6722
6723  assert(wand != (MagickWand *) NULL);
6724  assert(wand->signature == MagickWandSignature);
6725  if (wand->debug != MagickFalse)
6726    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6727  if (wand->images == (Image *) NULL)
6728    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6729  minify_image=MinifyImage(wand->images,wand->exception);
6730  if (minify_image == (Image *) NULL)
6731    return(MagickFalse);
6732  ReplaceImageInList(&wand->images,minify_image);
6733  return(MagickTrue);
6734}
6735
6736/*
6737%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6738%                                                                             %
6739%                                                                             %
6740%                                                                             %
6741%   M a g i c k M o d u l a t e I m a g e                                     %
6742%                                                                             %
6743%                                                                             %
6744%                                                                             %
6745%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6746%
6747%  MagickModulateImage() lets you control the brightness, saturation, and hue
6748%  of an image.  Hue is the percentage of absolute rotation from the current
6749%  position.  For example 50 results in a counter-clockwise rotation of 90
6750%  degrees, 150 results in a clockwise rotation of 90 degrees, with 0 and 200
6751%  both resulting in a rotation of 180 degrees.
6752%
6753%  To increase the color brightness by 20% and decrease the color saturation by
6754%  10% and leave the hue unchanged, use: 120,90,100.
6755%
6756%  The format of the MagickModulateImage method is:
6757%
6758%      MagickBooleanType MagickModulateImage(MagickWand *wand,
6759%        const double brightness,const double saturation,const double hue)
6760%
6761%  A description of each parameter follows:
6762%
6763%    o wand: the magick wand.
6764%
6765%    o brightness: the percent change in brighness.
6766%
6767%    o saturation: the percent change in saturation.
6768%
6769%    o hue: the percent change in hue.
6770%
6771*/
6772WandExport MagickBooleanType MagickModulateImage(MagickWand *wand,
6773  const double brightness,const double saturation,const double hue)
6774{
6775  char
6776    modulate[MagickPathExtent];
6777
6778  MagickBooleanType
6779    status;
6780
6781  assert(wand != (MagickWand *) NULL);
6782  assert(wand->signature == MagickWandSignature);
6783  if (wand->debug != MagickFalse)
6784    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6785  if (wand->images == (Image *) NULL)
6786    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6787  (void) FormatLocaleString(modulate,MagickPathExtent,"%g,%g,%g",
6788    brightness,saturation,hue);
6789  status=ModulateImage(wand->images,modulate,wand->exception);
6790  return(status);
6791}
6792
6793/*
6794%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6795%                                                                             %
6796%                                                                             %
6797%                                                                             %
6798%   M a g i c k M o n t a g e I m a g e                                       %
6799%                                                                             %
6800%                                                                             %
6801%                                                                             %
6802%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6803%
6804%  MagickMontageImage() creates a composite image by combining several
6805%  separate images. The images are tiled on the composite image with the name
6806%  of the image optionally appearing just below the individual tile.
6807%
6808%  The format of the MagickMontageImage method is:
6809%
6810%      MagickWand *MagickMontageImage(MagickWand *wand,
6811%        const DrawingWand drawing_wand,const char *tile_geometry,
6812%        const char *thumbnail_geometry,const MontageMode mode,
6813%        const char *frame)
6814%
6815%  A description of each parameter follows:
6816%
6817%    o wand: the magick wand.
6818%
6819%    o drawing_wand: the drawing wand.  The font name, size, and color are
6820%      obtained from this wand.
6821%
6822%    o tile_geometry: the number of tiles per row and page (e.g. 6x4+0+0).
6823%
6824%    o thumbnail_geometry: Preferred image size and border size of each
6825%      thumbnail (e.g. 120x120+4+3>).
6826%
6827%    o mode: Thumbnail framing mode: Frame, Unframe, or Concatenate.
6828%
6829%    o frame: Surround the image with an ornamental border (e.g. 15x15+3+3).
6830%      The frame color is that of the thumbnail's matte color.
6831%
6832*/
6833WandExport MagickWand *MagickMontageImage(MagickWand *wand,
6834  const DrawingWand *drawing_wand,const char *tile_geometry,
6835  const char *thumbnail_geometry,const MontageMode mode,const char *frame)
6836{
6837  char
6838    *font;
6839
6840  Image
6841    *montage_image;
6842
6843  MontageInfo
6844    *montage_info;
6845
6846  PixelWand
6847    *pixel_wand;
6848
6849  assert(wand != (MagickWand *) NULL);
6850  assert(wand->signature == MagickWandSignature);
6851  if (wand->debug != MagickFalse)
6852    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6853  if (wand->images == (Image *) NULL)
6854    return((MagickWand *) NULL);
6855  montage_info=CloneMontageInfo(wand->image_info,(MontageInfo *) NULL);
6856  switch (mode)
6857  {
6858    case FrameMode:
6859    {
6860      (void) CloneString(&montage_info->frame,"15x15+3+3");
6861      montage_info->shadow=MagickTrue;
6862      break;
6863    }
6864    case UnframeMode:
6865    {
6866      montage_info->frame=(char *) NULL;
6867      montage_info->shadow=MagickFalse;
6868      montage_info->border_width=0;
6869      break;
6870    }
6871    case ConcatenateMode:
6872    {
6873      montage_info->frame=(char *) NULL;
6874      montage_info->shadow=MagickFalse;
6875      (void) CloneString(&montage_info->geometry,"+0+0");
6876      montage_info->border_width=0;
6877      break;
6878    }
6879    default:
6880      break;
6881  }
6882  font=DrawGetFont(drawing_wand);
6883  if (font != (char *) NULL)
6884    (void) CloneString(&montage_info->font,font);
6885  if (frame != (char *) NULL)
6886    (void) CloneString(&montage_info->frame,frame);
6887  montage_info->pointsize=DrawGetFontSize(drawing_wand);
6888  pixel_wand=NewPixelWand();
6889  DrawGetFillColor(drawing_wand,pixel_wand);
6890  PixelGetQuantumPacket(pixel_wand,&montage_info->fill);
6891  DrawGetStrokeColor(drawing_wand,pixel_wand);
6892  PixelGetQuantumPacket(pixel_wand,&montage_info->stroke);
6893  pixel_wand=DestroyPixelWand(pixel_wand);
6894  if (thumbnail_geometry != (char *) NULL)
6895    (void) CloneString(&montage_info->geometry,thumbnail_geometry);
6896  if (tile_geometry != (char *) NULL)
6897    (void) CloneString(&montage_info->tile,tile_geometry);
6898  montage_image=MontageImageList(wand->image_info,montage_info,wand->images,
6899    wand->exception);
6900  montage_info=DestroyMontageInfo(montage_info);
6901  if (montage_image == (Image *) NULL)
6902    return((MagickWand *) NULL);
6903  return(CloneMagickWandFromImages(wand,montage_image));
6904}
6905
6906/*
6907%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6908%                                                                             %
6909%                                                                             %
6910%                                                                             %
6911%   M a g i c k M o r p h I m a g e s                                         %
6912%                                                                             %
6913%                                                                             %
6914%                                                                             %
6915%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6916%
6917%  MagickMorphImages() method morphs a set of images.  Both the image pixels
6918%  and size are linearly interpolated to give the appearance of a
6919%  meta-morphosis from one image to the next.
6920%
6921%  The format of the MagickMorphImages method is:
6922%
6923%      MagickWand *MagickMorphImages(MagickWand *wand,
6924%        const size_t number_frames)
6925%
6926%  A description of each parameter follows:
6927%
6928%    o wand: the magick wand.
6929%
6930%    o number_frames: the number of in-between images to generate.
6931%
6932*/
6933WandExport MagickWand *MagickMorphImages(MagickWand *wand,
6934  const size_t number_frames)
6935{
6936  Image
6937    *morph_image;
6938
6939  assert(wand != (MagickWand *) NULL);
6940  assert(wand->signature == MagickWandSignature);
6941  if (wand->debug != MagickFalse)
6942    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6943  if (wand->images == (Image *) NULL)
6944    return((MagickWand *) NULL);
6945  morph_image=MorphImages(wand->images,number_frames,wand->exception);
6946  if (morph_image == (Image *) NULL)
6947    return((MagickWand *) NULL);
6948  return(CloneMagickWandFromImages(wand,morph_image));
6949}
6950
6951/*
6952%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6953%                                                                             %
6954%                                                                             %
6955%                                                                             %
6956%   M a g i c k M o r p h o l o g y I m a g e                                 %
6957%                                                                             %
6958%                                                                             %
6959%                                                                             %
6960%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6961%
6962%  MagickMorphologyImage() applies a user supplied kernel to the image
6963%  according to the given mophology method.
6964%
6965%  The format of the MagickMorphologyImage method is:
6966%
6967%      MagickBooleanType MagickMorphologyImage(MagickWand *wand,
6968%        MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
6969%
6970%  A description of each parameter follows:
6971%
6972%    o wand: the magick wand.
6973%
6974%    o method: the morphology method to be applied.
6975%
6976%    o iterations: apply the operation this many times (or no change).
6977%      A value of -1 means loop until no change found.  How this is applied
6978%      may depend on the morphology method.  Typically this is a value of 1.
6979%
6980%    o kernel: An array of doubles representing the morphology kernel.
6981%
6982*/
6983WandExport MagickBooleanType MagickMorphologyImage(MagickWand *wand,
6984  MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
6985{
6986  Image
6987    *morphology_image;
6988
6989  assert(wand != (MagickWand *) NULL);
6990  assert(wand->signature == MagickWandSignature);
6991  if (wand->debug != MagickFalse)
6992    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6993  if (kernel == (const KernelInfo *) NULL)
6994    return(MagickFalse);
6995  if (wand->images == (Image *) NULL)
6996    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6997  morphology_image=MorphologyImage(wand->images,method,iterations,kernel,
6998    wand->exception);
6999  if (morphology_image == (Image *) NULL)
7000    return(MagickFalse);
7001  ReplaceImageInList(&wand->images,morphology_image);
7002  return(MagickTrue);
7003}
7004
7005/*
7006%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7007%                                                                             %
7008%                                                                             %
7009%                                                                             %
7010%   M a g i c k M o t i o n B l u r I m a g e                                 %
7011%                                                                             %
7012%                                                                             %
7013%                                                                             %
7014%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7015%
7016%  MagickMotionBlurImage() simulates motion blur.  We convolve the image with a
7017%  Gaussian operator of the given radius and standard deviation (sigma).
7018%  For reasonable results, radius should be larger than sigma.  Use a
7019%  radius of 0 and MotionBlurImage() selects a suitable radius for you.
7020%  Angle gives the angle of the blurring motion.
7021%
7022%  The format of the MagickMotionBlurImage method is:
7023%
7024%      MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
7025%        const double radius,const double sigma,const double angle)
7026%
7027%  A description of each parameter follows:
7028%
7029%    o wand: the magick wand.
7030%
7031%    o radius: the radius of the Gaussian, in pixels, not counting
7032%      the center pixel.
7033%
7034%    o sigma: the standard deviation of the Gaussian, in pixels.
7035%
7036%    o angle: Apply the effect along this angle.
7037%
7038*/
7039WandExport MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
7040  const double radius,const double sigma,const double angle)
7041{
7042  Image
7043    *blur_image;
7044
7045  assert(wand != (MagickWand *) NULL);
7046  assert(wand->signature == MagickWandSignature);
7047  if (wand->debug != MagickFalse)
7048    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7049  if (wand->images == (Image *) NULL)
7050    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7051  blur_image=MotionBlurImage(wand->images,radius,sigma,angle,wand->exception);
7052  if (blur_image == (Image *) NULL)
7053    return(MagickFalse);
7054  ReplaceImageInList(&wand->images,blur_image);
7055  return(MagickTrue);
7056}
7057
7058/*
7059%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7060%                                                                             %
7061%                                                                             %
7062%                                                                             %
7063%   M a g i c k N e g a t e I m a g e                                         %
7064%                                                                             %
7065%                                                                             %
7066%                                                                             %
7067%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7068%
7069%  MagickNegateImage() negates the colors in the reference image.  The
7070%  Grayscale option means that only grayscale values within the image are
7071%  negated.
7072%
7073%  You can also reduce the influence of a particular channel with a gamma
7074%  value of 0.
7075%
7076%  The format of the MagickNegateImage method is:
7077%
7078%      MagickBooleanType MagickNegateImage(MagickWand *wand,
7079%        const MagickBooleanType gray)
7080%
7081%  A description of each parameter follows:
7082%
7083%    o wand: the magick wand.
7084%
7085%    o gray: If MagickTrue, only negate grayscale pixels within the image.
7086%
7087*/
7088WandExport MagickBooleanType MagickNegateImage(MagickWand *wand,
7089  const MagickBooleanType gray)
7090{
7091  MagickBooleanType
7092    status;
7093
7094  assert(wand != (MagickWand *) NULL);
7095  assert(wand->signature == MagickWandSignature);
7096  if (wand->debug != MagickFalse)
7097    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7098  if (wand->images == (Image *) NULL)
7099    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7100  status=NegateImage(wand->images,gray,wand->exception);
7101  return(status);
7102}
7103
7104/*
7105%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7106%                                                                             %
7107%                                                                             %
7108%                                                                             %
7109%   M a g i c k N e w I m a g e                                               %
7110%                                                                             %
7111%                                                                             %
7112%                                                                             %
7113%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7114%
7115%  MagickNewImage() adds a blank image canvas of the specified size and
7116%  background color to the wand.
7117%
7118%  The format of the MagickNewImage method is:
7119%
7120%      MagickBooleanType MagickNewImage(MagickWand *wand,
7121%        const size_t columns,const size_t rows,
7122%        const PixelWand *background)
7123%
7124%  A description of each parameter follows:
7125%
7126%    o wand: the magick wand.
7127%
7128%    o width: the image width.
7129%
7130%    o height: the image height.
7131%
7132%    o background: the image color.
7133%
7134*/
7135WandExport MagickBooleanType MagickNewImage(MagickWand *wand,const size_t width,
7136  const size_t height,const PixelWand *background)
7137{
7138  Image
7139    *images;
7140
7141  PixelInfo
7142    pixel;
7143
7144  assert(wand != (MagickWand *) NULL);
7145  assert(wand->signature == MagickWandSignature);
7146  if (wand->debug != MagickFalse)
7147    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7148  PixelGetMagickColor(background,&pixel);
7149  images=NewMagickImage(wand->image_info,width,height,&pixel,wand->exception);
7150  if (images == (Image *) NULL)
7151    return(MagickFalse);
7152  return(InsertImageInWand(wand,images));
7153}
7154
7155/*
7156%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7157%                                                                             %
7158%                                                                             %
7159%                                                                             %
7160%   M a g i c k N e x t I m a g e                                             %
7161%                                                                             %
7162%                                                                             %
7163%                                                                             %
7164%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7165%
7166%  MagickNextImage() sets the next image in the wand as the current image.
7167%
7168%  It is typically used after MagickResetIterator(), after which its first use
7169%  will set the first image as the current image (unless the wand is empty).
7170%
7171%  It will return MagickFalse when no more images are left to be returned
7172%  which happens when the wand is empty, or the current image is the last
7173%  image.
7174%
7175%  When the above condition (end of image list) is reached, the iterator is
7176%  automaticall set so that you can start using MagickPreviousImage() to
7177%  again iterate over the images in the reverse direction, starting with the
7178%  last image (again).  You can jump to this condition immeditally using
7179%  MagickSetLastIterator().
7180%
7181%  The format of the MagickNextImage method is:
7182%
7183%      MagickBooleanType MagickNextImage(MagickWand *wand)
7184%
7185%  A description of each parameter follows:
7186%
7187%    o wand: the magick wand.
7188%
7189*/
7190WandExport MagickBooleanType MagickNextImage(MagickWand *wand)
7191{
7192  assert(wand != (MagickWand *) NULL);
7193  assert(wand->signature == MagickWandSignature);
7194  if (wand->debug != MagickFalse)
7195    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7196  if (wand->images == (Image *) NULL)
7197    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7198  wand->insert_before=MagickFalse; /* Inserts is now appended */
7199  if (wand->image_pending != MagickFalse)
7200    {
7201      wand->image_pending=MagickFalse;
7202      return(MagickTrue);
7203    }
7204  if (GetNextImageInList(wand->images) == (Image *) NULL)
7205    {
7206      wand->image_pending=MagickTrue; /* No image, PreviousImage re-gets */
7207      return(MagickFalse);
7208    }
7209  wand->images=GetNextImageInList(wand->images);
7210  return(MagickTrue);
7211}
7212
7213/*
7214%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7215%                                                                             %
7216%                                                                             %
7217%                                                                             %
7218%   M a g i c k N o r m a l i z e I m a g e                                   %
7219%                                                                             %
7220%                                                                             %
7221%                                                                             %
7222%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7223%
7224%  MagickNormalizeImage() enhances the contrast of a color image by adjusting
7225%  the pixels color to span the entire range of colors available
7226%
7227%  You can also reduce the influence of a particular channel with a gamma
7228%  value of 0.
7229%
7230%  The format of the MagickNormalizeImage method is:
7231%
7232%      MagickBooleanType MagickNormalizeImage(MagickWand *wand)
7233%
7234%  A description of each parameter follows:
7235%
7236%    o wand: the magick wand.
7237%
7238*/
7239WandExport MagickBooleanType MagickNormalizeImage(MagickWand *wand)
7240{
7241  MagickBooleanType
7242    status;
7243
7244  assert(wand != (MagickWand *) NULL);
7245  assert(wand->signature == MagickWandSignature);
7246  if (wand->debug != MagickFalse)
7247    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7248  if (wand->images == (Image *) NULL)
7249    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7250  status=NormalizeImage(wand->images,wand->exception);
7251  return(status);
7252}
7253
7254/*
7255%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7256%                                                                             %
7257%                                                                             %
7258%                                                                             %
7259%   M a g i c k O i l P a i n t I m a g e                                     %
7260%                                                                             %
7261%                                                                             %
7262%                                                                             %
7263%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7264%
7265%  MagickOilPaintImage() applies a special effect filter that simulates an oil
7266%  painting.  Each pixel is replaced by the most frequent color occurring
7267%  in a circular region defined by radius.
7268%
7269%  The format of the MagickOilPaintImage method is:
7270%
7271%      MagickBooleanType MagickOilPaintImage(MagickWand *wand,
7272%        const double radius,const double sigma)
7273%
7274%  A description of each parameter follows:
7275%
7276%    o wand: the magick wand.
7277%
7278%    o radius: the radius of the circular neighborhood.
7279%
7280%    o sigma: the standard deviation of the Gaussian, in pixels.
7281%
7282*/
7283WandExport MagickBooleanType MagickOilPaintImage(MagickWand *wand,
7284  const double radius,const double sigma)
7285{
7286  Image
7287    *paint_image;
7288
7289  assert(wand != (MagickWand *) NULL);
7290  assert(wand->signature == MagickWandSignature);
7291  if (wand->debug != MagickFalse)
7292    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7293  if (wand->images == (Image *) NULL)
7294    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7295  paint_image=OilPaintImage(wand->images,radius,sigma,wand->exception);
7296  if (paint_image == (Image *) NULL)
7297    return(MagickFalse);
7298  ReplaceImageInList(&wand->images,paint_image);
7299  return(MagickTrue);
7300}
7301
7302/*
7303%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7304%                                                                             %
7305%                                                                             %
7306%                                                                             %
7307%   M a g i c k O p a q u e P a i n t I m a g e                               %
7308%                                                                             %
7309%                                                                             %
7310%                                                                             %
7311%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7312%
7313%  MagickOpaquePaintImage() changes any pixel that matches color with the color
7314%  defined by fill.
7315%
7316%  The format of the MagickOpaquePaintImage method is:
7317%
7318%      MagickBooleanType MagickOpaquePaintImage(MagickWand *wand,
7319%        const PixelWand *target,const PixelWand *fill,const double fuzz,
7320%        const MagickBooleanType invert)
7321%
7322%  A description of each parameter follows:
7323%
7324%    o wand: the magick wand.
7325%
7326%    o target: Change this target color to the fill color within the image.
7327%
7328%    o fill: the fill pixel wand.
7329%
7330%    o fuzz: By default target must match a particular pixel color
7331%      exactly.  However, in many cases two colors may differ by a small amount.
7332%      The fuzz member of image defines how much tolerance is acceptable to
7333%      consider two colors as the same.  For example, set fuzz to 10 and the
7334%      color red at intensities of 100 and 102 respectively are now interpreted
7335%      as the same color for the purposes of the floodfill.
7336%
7337%    o invert: paint any pixel that does not match the target color.
7338%
7339*/
7340WandExport MagickBooleanType MagickOpaquePaintImage(MagickWand *wand,
7341  const PixelWand *target,const PixelWand *fill,const double fuzz,
7342  const MagickBooleanType invert)
7343{
7344  MagickBooleanType
7345    status;
7346
7347  PixelInfo
7348    fill_pixel,
7349    target_pixel;
7350
7351  assert(wand != (MagickWand *) NULL);
7352  assert(wand->signature == MagickWandSignature);
7353  if (wand->debug != MagickFalse)
7354    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7355  if (wand->images == (Image *) NULL)
7356    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7357  PixelGetMagickColor(target,&target_pixel);
7358  PixelGetMagickColor(fill,&fill_pixel);
7359  wand->images->fuzz=fuzz;
7360  status=OpaquePaintImage(wand->images,&target_pixel,&fill_pixel,invert,
7361    wand->exception);
7362  return(status);
7363}
7364
7365/*
7366%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7367%                                                                             %
7368%                                                                             %
7369%                                                                             %
7370%   M a g i c k O p t i m i z e I m a g e L a y e r s                         %
7371%                                                                             %
7372%                                                                             %
7373%                                                                             %
7374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7375%
7376%  MagickOptimizeImageLayers() compares each image the GIF disposed forms of the
7377%  previous image in the sequence.  From this it attempts to select the
7378%  smallest cropped image to replace each frame, while preserving the results
7379%  of the animation.
7380%
7381%  The format of the MagickOptimizeImageLayers method is:
7382%
7383%      MagickWand *MagickOptimizeImageLayers(MagickWand *wand)
7384%
7385%  A description of each parameter follows:
7386%
7387%    o wand: the magick wand.
7388%
7389*/
7390WandExport MagickWand *MagickOptimizeImageLayers(MagickWand *wand)
7391{
7392  Image
7393    *optimize_image;
7394
7395  assert(wand != (MagickWand *) NULL);
7396  assert(wand->signature == MagickWandSignature);
7397  if (wand->debug != MagickFalse)
7398    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7399  if (wand->images == (Image *) NULL)
7400    return((MagickWand *) NULL);
7401  optimize_image=OptimizeImageLayers(wand->images,wand->exception);
7402  if (optimize_image == (Image *) NULL)
7403    return((MagickWand *) NULL);
7404  return(CloneMagickWandFromImages(wand,optimize_image));
7405}
7406
7407/*
7408%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7409%                                                                             %
7410%                                                                             %
7411%                                                                             %
7412%   M a g i c k O p t i m i z e I m a g e T r a n s p a r e n c y             %
7413%                                                                             %
7414%                                                                             %
7415%                                                                             %
7416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7417%
7418%  MagickOptimizeImageTransparency() takes a frame optimized GIF animation, and
7419%  compares the overlayed pixels against the disposal image resulting from all
7420%  the previous frames in the animation.  Any pixel that does not change the
7421%  disposal image (and thus does not effect the outcome of an overlay) is made
7422%  transparent.
7423%
7424%  WARNING: This modifies the current images directly, rather than generate
7425%  a new image sequence.
7426%  The format of the MagickOptimizeImageTransparency method is:
7427%
7428%      MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand)
7429%
7430%  A description of each parameter follows:
7431%
7432%    o wand: the magick wand.
7433%
7434*/
7435WandExport MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand)
7436{
7437  assert(wand != (MagickWand *) NULL);
7438  assert(wand->signature == MagickWandSignature);
7439  if (wand->debug != MagickFalse)
7440    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7441  if (wand->images == (Image *) NULL)
7442    return(MagickFalse);
7443  OptimizeImageTransparency(wand->images,wand->exception);
7444  return(MagickTrue);
7445}
7446
7447/*
7448%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7449%                                                                             %
7450%                                                                             %
7451%                                                                             %
7452%     M a g i c k O r d e r e d P o s t e r i z e I m a g e                   %
7453%                                                                             %
7454%                                                                             %
7455%                                                                             %
7456%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7457%
7458%  MagickOrderedPosterizeImage() performs an ordered dither based on a number
7459%  of pre-defined dithering threshold maps, but over multiple intensity levels,
7460%  which can be different for different channels, according to the input
7461%  arguments.
7462%
7463%  The format of the MagickOrderedPosterizeImage method is:
7464%
7465%      MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand,
7466%        const char *threshold_map)
7467%
7468%  A description of each parameter follows:
7469%
7470%    o image: the image.
7471%
7472%    o threshold_map: A string containing the name of the threshold dither
7473%      map to use, followed by zero or more numbers representing the number of
7474%      color levels tho dither between.
7475%
7476%      Any level number less than 2 is equivalent to 2, and means only binary
7477%      dithering will be applied to each color channel.
7478%
7479%      No numbers also means a 2 level (bitmap) dither will be applied to all
7480%      channels, while a single number is the number of levels applied to each
7481%      channel in sequence.  More numbers will be applied in turn to each of
7482%      the color channels.
7483%
7484%      For example: "o3x3,6" generates a 6 level posterization of the image
7485%      with a ordered 3x3 diffused pixel dither being applied between each
7486%      level. While checker,8,8,4 will produce a 332 colormaped image with
7487%      only a single checkerboard hash pattern (50% grey) between each color
7488%      level, to basically double the number of color levels with a bare
7489%      minimim of dithering.
7490%
7491*/
7492WandExport MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand,
7493  const char *threshold_map)
7494{
7495  MagickBooleanType
7496    status;
7497
7498  assert(wand != (MagickWand *) NULL);
7499  assert(wand->signature == MagickWandSignature);
7500  if (wand->debug != MagickFalse)
7501    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7502  if (wand->images == (Image *) NULL)
7503    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7504  status=OrderedPosterizeImage(wand->images,threshold_map,wand->exception);
7505  return(status);
7506}
7507
7508/*
7509%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7510%                                                                             %
7511%                                                                             %
7512%                                                                             %
7513%   M a g i c k P i n g I m a g e                                             %
7514%                                                                             %
7515%                                                                             %
7516%                                                                             %
7517%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7518%
7519%  MagickPingImage() is the same as MagickReadImage() except the only valid
7520%  information returned is the image width, height, size, and format.  It
7521%  is designed to efficiently obtain this information from a file without
7522%  reading the entire image sequence into memory.
7523%
7524%  The format of the MagickPingImage method is:
7525%
7526%      MagickBooleanType MagickPingImage(MagickWand *wand,const char *filename)
7527%
7528%  A description of each parameter follows:
7529%
7530%    o wand: the magick wand.
7531%
7532%    o filename: the image filename.
7533%
7534*/
7535WandExport MagickBooleanType MagickPingImage(MagickWand *wand,
7536  const char *filename)
7537{
7538  Image
7539    *images;
7540
7541  ImageInfo
7542    *ping_info;
7543
7544  assert(wand != (MagickWand *) NULL);
7545  assert(wand->signature == MagickWandSignature);
7546  if (wand->debug != MagickFalse)
7547    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7548  ping_info=CloneImageInfo(wand->image_info);
7549  if (filename != (const char *) NULL)
7550    (void) CopyMagickString(ping_info->filename,filename,MagickPathExtent);
7551  images=PingImage(ping_info,wand->exception);
7552  ping_info=DestroyImageInfo(ping_info);
7553  if (images == (Image *) NULL)
7554    return(MagickFalse);
7555  return(InsertImageInWand(wand,images));
7556}
7557
7558/*
7559%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7560%                                                                             %
7561%                                                                             %
7562%                                                                             %
7563%   M a g i c k P i n g I m a g e B l o b                                     %
7564%                                                                             %
7565%                                                                             %
7566%                                                                             %
7567%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7568%
7569%  MagickPingImageBlob() pings an image or image sequence from a blob.
7570%
7571%  The format of the MagickPingImageBlob method is:
7572%
7573%      MagickBooleanType MagickPingImageBlob(MagickWand *wand,
7574%        const void *blob,const size_t length)
7575%
7576%  A description of each parameter follows:
7577%
7578%    o wand: the magick wand.
7579%
7580%    o blob: the blob.
7581%
7582%    o length: the blob length.
7583%
7584*/
7585WandExport MagickBooleanType MagickPingImageBlob(MagickWand *wand,
7586  const void *blob,const size_t length)
7587{
7588  Image
7589    *images;
7590
7591  ImageInfo
7592    *read_info;
7593
7594  assert(wand != (MagickWand *) NULL);
7595  assert(wand->signature == MagickWandSignature);
7596  if (wand->debug != MagickFalse)
7597    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7598  read_info=CloneImageInfo(wand->image_info);
7599  SetImageInfoBlob(read_info,blob,length);
7600  images=PingImage(read_info,wand->exception);
7601  read_info=DestroyImageInfo(read_info);
7602  if (images == (Image *) NULL)
7603    return(MagickFalse);
7604  return(InsertImageInWand(wand,images));
7605}
7606
7607/*
7608%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7609%                                                                             %
7610%                                                                             %
7611%                                                                             %
7612%   M a g i c k P i n g I m a g e F i l e                                     %
7613%                                                                             %
7614%                                                                             %
7615%                                                                             %
7616%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7617%
7618%  MagickPingImageFile() pings an image or image sequence from an open file
7619%  descriptor.
7620%
7621%  The format of the MagickPingImageFile method is:
7622%
7623%      MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file)
7624%
7625%  A description of each parameter follows:
7626%
7627%    o wand: the magick wand.
7628%
7629%    o file: the file descriptor.
7630%
7631*/
7632WandExport MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file)
7633{
7634  Image
7635    *images;
7636
7637  ImageInfo
7638    *read_info;
7639
7640  assert(wand != (MagickWand *) NULL);
7641  assert(wand->signature == MagickWandSignature);
7642  assert(file != (FILE *) NULL);
7643  if (wand->debug != MagickFalse)
7644    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7645  read_info=CloneImageInfo(wand->image_info);
7646  SetImageInfoFile(read_info,file);
7647  images=PingImage(read_info,wand->exception);
7648  read_info=DestroyImageInfo(read_info);
7649  if (images == (Image *) NULL)
7650    return(MagickFalse);
7651  return(InsertImageInWand(wand,images));
7652}
7653
7654/*
7655%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7656%                                                                             %
7657%                                                                             %
7658%                                                                             %
7659%   M a g i c k P o l a r o i d I m a g e                                     %
7660%                                                                             %
7661%                                                                             %
7662%                                                                             %
7663%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7664%
7665%  MagickPolaroidImage() simulates a Polaroid picture.
7666%
7667%  The format of the MagickPolaroidImage method is:
7668%
7669%      MagickBooleanType MagickPolaroidImage(MagickWand *wand,
7670%        const DrawingWand *drawing_wand,const char *caption,const double angle,
7671%        const PixelInterpolateMethod method)
7672%
7673%  A description of each parameter follows:
7674%
7675%    o wand: the magick wand.
7676%
7677%    o drawing_wand: the draw wand.
7678%
7679%    o caption: the Polaroid caption.
7680%
7681%    o angle: Apply the effect along this angle.
7682%
7683%    o method: the pixel interpolation method.
7684%
7685*/
7686WandExport MagickBooleanType MagickPolaroidImage(MagickWand *wand,
7687  const DrawingWand *drawing_wand,const char *caption,const double angle,
7688  const PixelInterpolateMethod method)
7689{
7690  DrawInfo
7691    *draw_info;
7692
7693  Image
7694    *polaroid_image;
7695
7696  assert(wand != (MagickWand *) NULL);
7697  assert(wand->signature == MagickWandSignature);
7698  if (wand->debug != MagickFalse)
7699    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7700  if (wand->images == (Image *) NULL)
7701    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7702  draw_info=PeekDrawingWand(drawing_wand);
7703  if (draw_info == (DrawInfo *) NULL)
7704    return(MagickFalse);
7705  polaroid_image=PolaroidImage(wand->images,draw_info,caption,angle,method,
7706    wand->exception);
7707  if (polaroid_image == (Image *) NULL)
7708    return(MagickFalse);
7709  ReplaceImageInList(&wand->images,polaroid_image);
7710  return(MagickTrue);
7711}
7712
7713/*
7714%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7715%                                                                             %
7716%                                                                             %
7717%                                                                             %
7718%   M a g i c k P o s t e r i z e I m a g e                                   %
7719%                                                                             %
7720%                                                                             %
7721%                                                                             %
7722%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7723%
7724%  MagickPosterizeImage() reduces the image to a limited number of color level.
7725%
7726%  The format of the MagickPosterizeImage method is:
7727%
7728%      MagickBooleanType MagickPosterizeImage(MagickWand *wand,
7729%        const size_t levels,const DitherMethod method)
7730%
7731%  A description of each parameter follows:
7732%
7733%    o wand: the magick wand.
7734%
7735%    o levels: Number of color levels allowed in each channel.  Very low values
7736%      (2, 3, or 4) have the most visible effect.
7737%
7738%    o method: choose the dither method: UndefinedDitherMethod,
7739%      NoDitherMethod, RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
7740%
7741*/
7742WandExport MagickBooleanType MagickPosterizeImage(MagickWand *wand,
7743  const size_t levels,const DitherMethod dither)
7744{
7745  MagickBooleanType
7746    status;
7747
7748  assert(wand != (MagickWand *) NULL);
7749  assert(wand->signature == MagickWandSignature);
7750  if (wand->debug != MagickFalse)
7751    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7752  if (wand->images == (Image *) NULL)
7753    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7754  status=PosterizeImage(wand->images,levels,dither,wand->exception);
7755  return(status);
7756}
7757
7758/*
7759%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7760%                                                                             %
7761%                                                                             %
7762%                                                                             %
7763%   M a g i c k P r e v i e w I m a g e s                                     %
7764%                                                                             %
7765%                                                                             %
7766%                                                                             %
7767%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7768%
7769%  MagickPreviewImages() tiles 9 thumbnails of the specified image with an
7770%  image processing operation applied at varying strengths.  This helpful
7771%  to quickly pin-point an appropriate parameter for an image processing
7772%  operation.
7773%
7774%  The format of the MagickPreviewImages method is:
7775%
7776%      MagickWand *MagickPreviewImages(MagickWand *wand,
7777%        const PreviewType preview)
7778%
7779%  A description of each parameter follows:
7780%
7781%    o wand: the magick wand.
7782%
7783%    o preview: the preview type.
7784%
7785*/
7786WandExport MagickWand *MagickPreviewImages(MagickWand *wand,
7787  const PreviewType preview)
7788{
7789  Image
7790    *preview_image;
7791
7792  assert(wand != (MagickWand *) NULL);
7793  assert(wand->signature == MagickWandSignature);
7794  if (wand->debug != MagickFalse)
7795    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7796  if (wand->images == (Image *) NULL)
7797    return((MagickWand *) NULL);
7798  preview_image=PreviewImage(wand->images,preview,wand->exception);
7799  if (preview_image == (Image *) NULL)
7800    return((MagickWand *) NULL);
7801  return(CloneMagickWandFromImages(wand,preview_image));
7802}
7803
7804/*
7805%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7806%                                                                             %
7807%                                                                             %
7808%                                                                             %
7809%   M a g i c k P r e v i o u s I m a g e                                     %
7810%                                                                             %
7811%                                                                             %
7812%                                                                             %
7813%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7814%
7815%  MagickPreviousImage() sets the previous image in the wand as the current
7816%  image.
7817%
7818%  It is typically used after MagickSetLastIterator(), after which its first
7819%  use will set the last image as the current image (unless the wand is empty).
7820%
7821%  It will return MagickFalse when no more images are left to be returned
7822%  which happens when the wand is empty, or the current image is the first
7823%  image.  At that point the iterator is than reset to again process images in
7824%  the forward direction, again starting with the first image in list. Images
7825%  added at this point are prepended.
7826%
7827%  Also at that point any images added to the wand using MagickAddImages() or
7828%  MagickReadImages() will be prepended before the first image. In this sense
7829%  the condition is not quite exactly the same as MagickResetIterator().
7830%
7831%  The format of the MagickPreviousImage method is:
7832%
7833%      MagickBooleanType MagickPreviousImage(MagickWand *wand)
7834%
7835%  A description of each parameter follows:
7836%
7837%    o wand: the magick wand.
7838%
7839*/
7840WandExport MagickBooleanType MagickPreviousImage(MagickWand *wand)
7841{
7842  assert(wand != (MagickWand *) NULL);
7843  assert(wand->signature == MagickWandSignature);
7844  if (wand->debug != MagickFalse)
7845    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7846  if (wand->images == (Image *) NULL)
7847    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7848  if (wand->image_pending != MagickFalse)
7849    {
7850      wand->image_pending=MagickFalse;  /* image returned no longer pending */
7851      return(MagickTrue);
7852    }
7853  if (GetPreviousImageInList(wand->images) == (Image *) NULL)
7854    {
7855      wand->image_pending=MagickTrue;   /* Next now re-gets first image */
7856      wand->insert_before=MagickTrue;   /* insert/add prepends new images */
7857      return(MagickFalse);
7858    }
7859  wand->images=GetPreviousImageInList(wand->images);
7860  return(MagickTrue);
7861}
7862
7863/*
7864%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7865%                                                                             %
7866%                                                                             %
7867%                                                                             %
7868%   M a g i c k Q u a n t i z e I m a g e                                     %
7869%                                                                             %
7870%                                                                             %
7871%                                                                             %
7872%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7873%
7874%  MagickQuantizeImage() analyzes the colors within a reference image and
7875%  chooses a fixed number of colors to represent the image.  The goal of the
7876%  algorithm is to minimize the color difference between the input and output
7877%  image while minimizing the processing time.
7878%
7879%  The format of the MagickQuantizeImage method is:
7880%
7881%      MagickBooleanType MagickQuantizeImage(MagickWand *wand,
7882%        const size_t number_colors,const ColorspaceType colorspace,
7883%        const size_t treedepth,const DitherMethod dither_method,
7884%        const MagickBooleanType measure_error)
7885%
7886%  A description of each parameter follows:
7887%
7888%    o wand: the magick wand.
7889%
7890%    o number_colors: the number of colors.
7891%
7892%    o colorspace: Perform color reduction in this colorspace, typically
7893%      RGBColorspace.
7894%
7895%    o treedepth: Normally, this integer value is zero or one.  A zero or
7896%      one tells Quantize to choose a optimal tree depth of Log4(number_colors).%      A tree of this depth generally allows the best representation of the
7897%      reference image with the least amount of memory and the fastest
7898%      computational speed.  In some cases, such as an image with low color
7899%      dispersion (a few number of colors), a value other than
7900%      Log4(number_colors) is required.  To expand the color tree completely,
7901%      use a value of 8.
7902%
7903%    o dither_method: choose from UndefinedDitherMethod, NoDitherMethod,
7904%      RiemersmaDitherMethod, FloydSteinbergDitherMethod.
7905%
7906%    o measure_error: A value other than zero measures the difference between
7907%      the original and quantized images.  This difference is the total
7908%      quantization error.  The error is computed by summing over all pixels
7909%      in an image the distance squared in RGB space between each reference
7910%      pixel value and its quantized value.
7911%
7912*/
7913WandExport MagickBooleanType MagickQuantizeImage(MagickWand *wand,
7914  const size_t number_colors,const ColorspaceType colorspace,
7915  const size_t treedepth,const DitherMethod dither_method,
7916  const MagickBooleanType measure_error)
7917{
7918  MagickBooleanType
7919    status;
7920
7921  QuantizeInfo
7922    *quantize_info;
7923
7924  assert(wand != (MagickWand *) NULL);
7925  assert(wand->signature == MagickWandSignature);
7926  if (wand->debug != MagickFalse)
7927    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7928  if (wand->images == (Image *) NULL)
7929    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7930  quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
7931  quantize_info->number_colors=number_colors;
7932  quantize_info->dither_method=dither_method;
7933  quantize_info->tree_depth=treedepth;
7934  quantize_info->colorspace=colorspace;
7935  quantize_info->measure_error=measure_error;
7936  status=QuantizeImage(quantize_info,wand->images,wand->exception);
7937  quantize_info=DestroyQuantizeInfo(quantize_info);
7938  return(status);
7939}
7940
7941/*
7942%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7943%                                                                             %
7944%                                                                             %
7945%                                                                             %
7946%   M a g i c k Q u a n t i z e I m a g e s                                   %
7947%                                                                             %
7948%                                                                             %
7949%                                                                             %
7950%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7951%
7952%  MagickQuantizeImages() analyzes the colors within a sequence of images and
7953%  chooses a fixed number of colors to represent the image.  The goal of the
7954%  algorithm is to minimize the color difference between the input and output
7955%  image while minimizing the processing time.
7956%
7957%  The format of the MagickQuantizeImages method is:
7958%
7959%      MagickBooleanType MagickQuantizeImages(MagickWand *wand,
7960%        const size_t number_colors,const ColorspaceType colorspace,
7961%        const size_t treedepth,const DitherMethod dither_method,
7962%        const MagickBooleanType measure_error)
7963%
7964%  A description of each parameter follows:
7965%
7966%    o wand: the magick wand.
7967%
7968%    o number_colors: the number of colors.
7969%
7970%    o colorspace: Perform color reduction in this colorspace, typically
7971%      RGBColorspace.
7972%
7973%    o treedepth: Normally, this integer value is zero or one.  A zero or
7974%      one tells Quantize to choose a optimal tree depth of Log4(number_colors).%      A tree of this depth generally allows the best representation of the
7975%      reference image with the least amount of memory and the fastest
7976%      computational speed.  In some cases, such as an image with low color
7977%      dispersion (a few number of colors), a value other than
7978%      Log4(number_colors) is required.  To expand the color tree completely,
7979%      use a value of 8.
7980%
7981%    o dither_method: choose from these dither methods: NoDitherMethod,
7982%      RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
7983%
7984%    o measure_error: A value other than zero measures the difference between
7985%      the original and quantized images.  This difference is the total
7986%      quantization error.  The error is computed by summing over all pixels
7987%      in an image the distance squared in RGB space between each reference
7988%      pixel value and its quantized value.
7989%
7990*/
7991WandExport MagickBooleanType MagickQuantizeImages(MagickWand *wand,
7992  const size_t number_colors,const ColorspaceType colorspace,
7993  const size_t treedepth,const DitherMethod dither_method,
7994  const MagickBooleanType measure_error)
7995{
7996  MagickBooleanType
7997    status;
7998
7999  QuantizeInfo
8000    *quantize_info;
8001
8002  assert(wand != (MagickWand *) NULL);
8003  assert(wand->signature == MagickWandSignature);
8004  if (wand->debug != MagickFalse)
8005    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8006  if (wand->images == (Image *) NULL)
8007    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8008  quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
8009  quantize_info->number_colors=number_colors;
8010  quantize_info->dither_method=dither_method;
8011  quantize_info->tree_depth=treedepth;
8012  quantize_info->colorspace=colorspace;
8013  quantize_info->measure_error=measure_error;
8014  status=QuantizeImages(quantize_info,wand->images,wand->exception);
8015  quantize_info=DestroyQuantizeInfo(quantize_info);
8016  return(status);
8017}
8018
8019/*
8020%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8021%                                                                             %
8022%                                                                             %
8023%                                                                             %
8024%   M a g i c k R o t a t i o n a l B l u r I m a g e                         %
8025%                                                                             %
8026%                                                                             %
8027%                                                                             %
8028%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8029%
8030%  MagickRotationalBlurImage() rotational blurs an image.
8031%
8032%  The format of the MagickRotationalBlurImage method is:
8033%
8034%      MagickBooleanType MagickRotationalBlurImage(MagickWand *wand,
8035%        const double angle)
8036%
8037%  A description of each parameter follows:
8038%
8039%    o wand: the magick wand.
8040%
8041%    o angle: the angle of the blur in degrees.
8042%
8043*/
8044WandExport MagickBooleanType MagickRotationalBlurImage(MagickWand *wand,
8045  const double angle)
8046{
8047  Image
8048    *blur_image;
8049
8050  assert(wand != (MagickWand *) NULL);
8051  assert(wand->signature == MagickWandSignature);
8052  if (wand->debug != MagickFalse)
8053    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8054  if (wand->images == (Image *) NULL)
8055    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8056  blur_image=RotationalBlurImage(wand->images,angle,wand->exception);
8057  if (blur_image == (Image *) NULL)
8058    return(MagickFalse);
8059  ReplaceImageInList(&wand->images,blur_image);
8060  return(MagickTrue);
8061}
8062
8063/*
8064%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8065%                                                                             %
8066%                                                                             %
8067%                                                                             %
8068%   M a g i c k R a i s e I m a g e                                           %
8069%                                                                             %
8070%                                                                             %
8071%                                                                             %
8072%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8073%
8074%  MagickRaiseImage() creates a simulated three-dimensional button-like effect
8075%  by lightening and darkening the edges of the image.  Members width and
8076%  height of raise_info define the width of the vertical and horizontal
8077%  edge of the effect.
8078%
8079%  The format of the MagickRaiseImage method is:
8080%
8081%      MagickBooleanType MagickRaiseImage(MagickWand *wand,
8082%        const size_t width,const size_t height,const ssize_t x,
8083%        const ssize_t y,const MagickBooleanType raise)
8084%
8085%  A description of each parameter follows:
8086%
8087%    o wand: the magick wand.
8088%
8089%    o width,height,x,y:  Define the dimensions of the area to raise.
8090%
8091%    o raise: A value other than zero creates a 3-D raise effect,
8092%      otherwise it has a lowered effect.
8093%
8094*/
8095WandExport MagickBooleanType MagickRaiseImage(MagickWand *wand,
8096  const size_t width,const size_t height,const ssize_t x,
8097  const ssize_t y,const MagickBooleanType raise)
8098{
8099  MagickBooleanType
8100    status;
8101
8102  RectangleInfo
8103    raise_info;
8104
8105  assert(wand != (MagickWand *) NULL);
8106  assert(wand->signature == MagickWandSignature);
8107  if (wand->debug != MagickFalse)
8108    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8109  if (wand->images == (Image *) NULL)
8110    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8111  raise_info.width=width;
8112  raise_info.height=height;
8113  raise_info.x=x;
8114  raise_info.y=y;
8115  status=RaiseImage(wand->images,&raise_info,raise,wand->exception);
8116  return(status);
8117}
8118
8119/*
8120%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8121%                                                                             %
8122%                                                                             %
8123%                                                                             %
8124%   M a g i c k R a n d o m T h r e s h o l d I m a g e                       %
8125%                                                                             %
8126%                                                                             %
8127%                                                                             %
8128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8129%
8130%  MagickRandomThresholdImage() changes the value of individual pixels based on
8131%  the intensity of each pixel compared to threshold.  The result is a
8132%  high-contrast, two color image.
8133%
8134%  The format of the MagickRandomThresholdImage method is:
8135%
8136%      MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
8137%        const double low,const double high)
8138%
8139%  A description of each parameter follows:
8140%
8141%    o wand: the magick wand.
8142%
8143%    o low,high: Specify the high and low thresholds.  These values range from
8144%      0 to QuantumRange.
8145%
8146*/
8147WandExport MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
8148  const double low,const double high)
8149{
8150  char
8151    threshold[MagickPathExtent];
8152
8153  assert(wand != (MagickWand *) NULL);
8154  assert(wand->signature == MagickWandSignature);
8155  if (wand->debug != MagickFalse)
8156    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8157  if (wand->images == (Image *) NULL)
8158    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8159  (void) FormatLocaleString(threshold,MagickPathExtent,"%gx%g",low,high);
8160  return(RandomThresholdImage(wand->images,threshold,wand->exception));
8161}
8162
8163/*
8164%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8165%                                                                             %
8166%                                                                             %
8167%                                                                             %
8168%   M a g i c k R e a d I m a g e                                             %
8169%                                                                             %
8170%                                                                             %
8171%                                                                             %
8172%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8173%
8174%  MagickReadImage() reads an image or image sequence.  The images are inserted
8175%  jjust before the current image pointer position.
8176%
8177%  Use MagickSetFirstIterator(), to insert new images before all the current
8178%  images in the wand, MagickSetLastIterator() to append add to the end,
8179%  MagickSetIteratorIndex() to place images just after the given index.
8180%
8181%  The format of the MagickReadImage method is:
8182%
8183%      MagickBooleanType MagickReadImage(MagickWand *wand,const char *filename)
8184%
8185%  A description of each parameter follows:
8186%
8187%    o wand: the magick wand.
8188%
8189%    o filename: the image filename.
8190%
8191*/
8192WandExport MagickBooleanType MagickReadImage(MagickWand *wand,
8193  const char *filename)
8194{
8195  Image
8196    *images;
8197
8198  ImageInfo
8199    *read_info;
8200
8201  assert(wand != (MagickWand *) NULL);
8202  assert(wand->signature == MagickWandSignature);
8203  if (wand->debug != MagickFalse)
8204    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8205  read_info=CloneImageInfo(wand->image_info);
8206  if (filename != (const char *) NULL)
8207    (void) CopyMagickString(read_info->filename,filename,MagickPathExtent);
8208  images=ReadImage(read_info,wand->exception);
8209  read_info=DestroyImageInfo(read_info);
8210  if (images == (Image *) NULL)
8211    return(MagickFalse);
8212  return(InsertImageInWand(wand,images));
8213}
8214
8215/*
8216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8217%                                                                             %
8218%                                                                             %
8219%                                                                             %
8220%   M a g i c k R e a d I m a g e B l o b                                     %
8221%                                                                             %
8222%                                                                             %
8223%                                                                             %
8224%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8225%
8226%  MagickReadImageBlob() reads an image or image sequence from a blob.
8227%  In all other respects it is like MagickReadImage().
8228%
8229%  The format of the MagickReadImageBlob method is:
8230%
8231%      MagickBooleanType MagickReadImageBlob(MagickWand *wand,
8232%        const void *blob,const size_t length)
8233%
8234%  A description of each parameter follows:
8235%
8236%    o wand: the magick wand.
8237%
8238%    o blob: the blob.
8239%
8240%    o length: the blob length.
8241%
8242*/
8243WandExport MagickBooleanType MagickReadImageBlob(MagickWand *wand,
8244  const void *blob,const size_t length)
8245{
8246  Image
8247    *images;
8248
8249  assert(wand != (MagickWand *) NULL);
8250  assert(wand->signature == MagickWandSignature);
8251  if (wand->debug != MagickFalse)
8252    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8253  images=BlobToImage(wand->image_info,blob,length,wand->exception);
8254  if (images == (Image *) NULL)
8255    return(MagickFalse);
8256  return(InsertImageInWand(wand,images));
8257}
8258
8259/*
8260%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8261%                                                                             %
8262%                                                                             %
8263%                                                                             %
8264%   M a g i c k R e a d I m a g e F i l e                                     %
8265%                                                                             %
8266%                                                                             %
8267%                                                                             %
8268%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8269%
8270%  MagickReadImageFile() reads an image or image sequence from an already
8271%  opened file descriptor.  Otherwise it is like MagickReadImage().
8272%
8273%  The format of the MagickReadImageFile method is:
8274%
8275%      MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file)
8276%
8277%  A description of each parameter follows:
8278%
8279%    o wand: the magick wand.
8280%
8281%    o file: the file descriptor.
8282%
8283*/
8284WandExport MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file)
8285{
8286  Image
8287    *images;
8288
8289  ImageInfo
8290    *read_info;
8291
8292  assert(wand != (MagickWand *) NULL);
8293  assert(wand->signature == MagickWandSignature);
8294  assert(file != (FILE *) NULL);
8295  if (wand->debug != MagickFalse)
8296    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8297  read_info=CloneImageInfo(wand->image_info);
8298  SetImageInfoFile(read_info,file);
8299  images=ReadImage(read_info,wand->exception);
8300  read_info=DestroyImageInfo(read_info);
8301  if (images == (Image *) NULL)
8302    return(MagickFalse);
8303  return(InsertImageInWand(wand,images));
8304}
8305
8306/*
8307%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8308%                                                                             %
8309%                                                                             %
8310%                                                                             %
8311%   M a g i c k R e m a p I m a g e                                           %
8312%                                                                             %
8313%                                                                             %
8314%                                                                             %
8315%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8316%
8317%  MagickRemapImage() replaces the colors of an image with the closest color
8318%  from a reference image.
8319%
8320%  The format of the MagickRemapImage method is:
8321%
8322%      MagickBooleanType MagickRemapImage(MagickWand *wand,
8323%        const MagickWand *remap_wand,const DitherMethod method)
8324%
8325%  A description of each parameter follows:
8326%
8327%    o wand: the magick wand.
8328%
8329%    o affinity: the affinity wand.
8330%
8331%    o method: choose from these dither methods: NoDitherMethod,
8332%      RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
8333%
8334*/
8335WandExport MagickBooleanType MagickRemapImage(MagickWand *wand,
8336  const MagickWand *remap_wand,const DitherMethod dither_method)
8337{
8338  MagickBooleanType
8339    status;
8340
8341  QuantizeInfo
8342    *quantize_info;
8343
8344  assert(wand != (MagickWand *) NULL);
8345  assert(wand->signature == MagickWandSignature);
8346  if (wand->debug != MagickFalse)
8347    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8348  if ((wand->images == (Image *) NULL) ||
8349      (remap_wand->images == (Image *) NULL))
8350    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8351  quantize_info=AcquireQuantizeInfo(wand->image_info);
8352  quantize_info->dither_method=dither_method;
8353  status=RemapImage(quantize_info,wand->images,remap_wand->images,
8354    wand->exception);
8355  quantize_info=DestroyQuantizeInfo(quantize_info);
8356  return(status);
8357}
8358
8359/*
8360%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8361%                                                                             %
8362%                                                                             %
8363%                                                                             %
8364%   M a g i c k R e m o v e I m a g e                                         %
8365%                                                                             %
8366%                                                                             %
8367%                                                                             %
8368%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8369%
8370%  MagickRemoveImage() removes an image from the image list.
8371%
8372%  The format of the MagickRemoveImage method is:
8373%
8374%      MagickBooleanType MagickRemoveImage(MagickWand *wand)
8375%
8376%  A description of each parameter follows:
8377%
8378%    o wand: the magick wand.
8379%
8380%    o insert: the splice wand.
8381%
8382*/
8383WandExport MagickBooleanType MagickRemoveImage(MagickWand *wand)
8384{
8385  assert(wand != (MagickWand *) NULL);
8386  assert(wand->signature == MagickWandSignature);
8387  if (wand->debug != MagickFalse)
8388    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8389  if (wand->images == (Image *) NULL)
8390    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8391  DeleteImageFromList(&wand->images);
8392  return(MagickTrue);
8393}
8394
8395/*
8396%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8397%                                                                             %
8398%                                                                             %
8399%                                                                             %
8400%   M a g i c k R e s a m p l e I m a g e                                     %
8401%                                                                             %
8402%                                                                             %
8403%                                                                             %
8404%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8405%
8406%  MagickResampleImage() resample image to desired resolution.
8407%
8408%    Bessel   Blackman   Box
8409%    Catrom   Cubic      Gaussian
8410%    Hanning  Hermite    Lanczos
8411%    Mitchell Point      Quandratic
8412%    Sinc     Triangle
8413%
8414%  Most of the filters are FIR (finite impulse response), however, Bessel,
8415%  Gaussian, and Sinc are IIR (infinite impulse response).  Bessel and Sinc
8416%  are windowed (brought down to zero) with the Blackman filter.
8417%
8418%  The format of the MagickResampleImage method is:
8419%
8420%      MagickBooleanType MagickResampleImage(MagickWand *wand,
8421%        const double x_resolution,const double y_resolution,
8422%        const FilterType filter)
8423%
8424%  A description of each parameter follows:
8425%
8426%    o wand: the magick wand.
8427%
8428%    o x_resolution: the new image x resolution.
8429%
8430%    o y_resolution: the new image y resolution.
8431%
8432%    o filter: Image filter to use.
8433%
8434*/
8435WandExport MagickBooleanType MagickResampleImage(MagickWand *wand,
8436  const double x_resolution,const double y_resolution,const FilterType filter)
8437{
8438  Image
8439    *resample_image;
8440
8441  assert(wand != (MagickWand *) NULL);
8442  assert(wand->signature == MagickWandSignature);
8443  if (wand->debug != MagickFalse)
8444    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8445  if (wand->images == (Image *) NULL)
8446    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8447  resample_image=ResampleImage(wand->images,x_resolution,y_resolution,filter,
8448    wand->exception);
8449  if (resample_image == (Image *) NULL)
8450    return(MagickFalse);
8451  ReplaceImageInList(&wand->images,resample_image);
8452  return(MagickTrue);
8453}
8454
8455/*
8456%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8457%                                                                             %
8458%                                                                             %
8459%                                                                             %
8460%   M a g i c k R e s e t I m a g e P a g e                                   %
8461%                                                                             %
8462%                                                                             %
8463%                                                                             %
8464%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8465%
8466%  MagickResetImagePage() resets the Wand page canvas and position.
8467%
8468%  The format of the MagickResetImagePage method is:
8469%
8470%      MagickBooleanType MagickResetImagePage(MagickWand *wand,
8471%        const char *page)
8472%
8473%  A description of each parameter follows:
8474%
8475%    o wand: the magick wand.
8476%
8477%    o page: the relative page specification.
8478%
8479*/
8480WandExport MagickBooleanType MagickResetImagePage(MagickWand *wand,
8481  const char *page)
8482{
8483  assert(wand != (MagickWand *) NULL);
8484  assert(wand->signature == MagickWandSignature);
8485  if (wand->debug != MagickFalse)
8486    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8487  if (wand->images == (Image *) NULL)
8488    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8489  if ((page == (char *) NULL) || (*page == '\0'))
8490    {
8491      (void) ParseAbsoluteGeometry("0x0+0+0",&wand->images->page);
8492      return(MagickTrue);
8493    }
8494  return(ResetImagePage(wand->images,page));
8495}
8496
8497/*
8498%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8499%                                                                             %
8500%                                                                             %
8501%                                                                             %
8502%   M a g i c k R e s i z e I m a g e                                         %
8503%                                                                             %
8504%                                                                             %
8505%                                                                             %
8506%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8507%
8508%  MagickResizeImage() scales an image to the desired dimensions with one of
8509%  these filters:
8510%
8511%    Bessel   Blackman   Box
8512%    Catrom   Cubic      Gaussian
8513%    Hanning  Hermite    Lanczos
8514%    Mitchell Point      Quandratic
8515%    Sinc     Triangle
8516%
8517%  Most of the filters are FIR (finite impulse response), however, Bessel,
8518%  Gaussian, and Sinc are IIR (infinite impulse response).  Bessel and Sinc
8519%  are windowed (brought down to zero) with the Blackman filter.
8520%
8521%  The format of the MagickResizeImage method is:
8522%
8523%      MagickBooleanType MagickResizeImage(MagickWand *wand,
8524%        const size_t columns,const size_t rows,const FilterType filter)
8525%
8526%  A description of each parameter follows:
8527%
8528%    o wand: the magick wand.
8529%
8530%    o columns: the number of columns in the scaled image.
8531%
8532%    o rows: the number of rows in the scaled image.
8533%
8534%    o filter: Image filter to use.
8535%
8536*/
8537WandExport MagickBooleanType MagickResizeImage(MagickWand *wand,
8538  const size_t columns,const size_t rows,const FilterType filter)
8539{
8540  Image
8541    *resize_image;
8542
8543  assert(wand != (MagickWand *) NULL);
8544  assert(wand->signature == MagickWandSignature);
8545  if (wand->debug != MagickFalse)
8546    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8547  if (wand->images == (Image *) NULL)
8548    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8549  resize_image=ResizeImage(wand->images,columns,rows,filter,wand->exception);
8550  if (resize_image == (Image *) NULL)
8551    return(MagickFalse);
8552  ReplaceImageInList(&wand->images,resize_image);
8553  return(MagickTrue);
8554}
8555
8556/*
8557%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8558%                                                                             %
8559%                                                                             %
8560%                                                                             %
8561%   M a g i c k R o l l I m a g e                                             %
8562%                                                                             %
8563%                                                                             %
8564%                                                                             %
8565%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8566%
8567%  MagickRollImage() offsets an image as defined by x and y.
8568%
8569%  The format of the MagickRollImage method is:
8570%
8571%      MagickBooleanType MagickRollImage(MagickWand *wand,const ssize_t x,
8572%        const size_t y)
8573%
8574%  A description of each parameter follows:
8575%
8576%    o wand: the magick wand.
8577%
8578%    o x: the x offset.
8579%
8580%    o y: the y offset.
8581%
8582%
8583*/
8584WandExport MagickBooleanType MagickRollImage(MagickWand *wand,
8585  const ssize_t x,const ssize_t y)
8586{
8587  Image
8588    *roll_image;
8589
8590  assert(wand != (MagickWand *) NULL);
8591  assert(wand->signature == MagickWandSignature);
8592  if (wand->debug != MagickFalse)
8593    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8594  if (wand->images == (Image *) NULL)
8595    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8596  roll_image=RollImage(wand->images,x,y,wand->exception);
8597  if (roll_image == (Image *) NULL)
8598    return(MagickFalse);
8599  ReplaceImageInList(&wand->images,roll_image);
8600  return(MagickTrue);
8601}
8602
8603/*
8604%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8605%                                                                             %
8606%                                                                             %
8607%                                                                             %
8608%   M a g i c k R o t a t e I m a g e                                         %
8609%                                                                             %
8610%                                                                             %
8611%                                                                             %
8612%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8613%
8614%  MagickRotateImage() rotates an image the specified number of degrees. Empty
8615%  triangles left over from rotating the image are filled with the
8616%  background color.
8617%
8618%  The format of the MagickRotateImage method is:
8619%
8620%      MagickBooleanType MagickRotateImage(MagickWand *wand,
8621%        const PixelWand *background,const double degrees)
8622%
8623%  A description of each parameter follows:
8624%
8625%    o wand: the magick wand.
8626%
8627%    o background: the background pixel wand.
8628%
8629%    o degrees: the number of degrees to rotate the image.
8630%
8631%
8632*/
8633WandExport MagickBooleanType MagickRotateImage(MagickWand *wand,
8634  const PixelWand *background,const double degrees)
8635{
8636  Image
8637    *rotate_image;
8638
8639  assert(wand != (MagickWand *) NULL);
8640  assert(wand->signature == MagickWandSignature);
8641  if (wand->debug != MagickFalse)
8642    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8643  if (wand->images == (Image *) NULL)
8644    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8645  PixelGetQuantumPacket(background,&wand->images->background_color);
8646  rotate_image=RotateImage(wand->images,degrees,wand->exception);
8647  if (rotate_image == (Image *) NULL)
8648    return(MagickFalse);
8649  ReplaceImageInList(&wand->images,rotate_image);
8650  return(MagickTrue);
8651}
8652
8653/*
8654%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8655%                                                                             %
8656%                                                                             %
8657%                                                                             %
8658%   M a g i c k S a m p l e I m a g e                                         %
8659%                                                                             %
8660%                                                                             %
8661%                                                                             %
8662%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8663%
8664%  MagickSampleImage() scales an image to the desired dimensions with pixel
8665%  sampling.  Unlike other scaling methods, this method does not introduce
8666%  any additional color into the scaled image.
8667%
8668%  The format of the MagickSampleImage method is:
8669%
8670%      MagickBooleanType MagickSampleImage(MagickWand *wand,
8671%        const size_t columns,const size_t rows)
8672%
8673%  A description of each parameter follows:
8674%
8675%    o wand: the magick wand.
8676%
8677%    o columns: the number of columns in the scaled image.
8678%
8679%    o rows: the number of rows in the scaled image.
8680%
8681%
8682*/
8683WandExport MagickBooleanType MagickSampleImage(MagickWand *wand,
8684  const size_t columns,const size_t rows)
8685{
8686  Image
8687    *sample_image;
8688
8689  assert(wand != (MagickWand *) NULL);
8690  assert(wand->signature == MagickWandSignature);
8691  if (wand->debug != MagickFalse)
8692    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8693  if (wand->images == (Image *) NULL)
8694    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8695  sample_image=SampleImage(wand->images,columns,rows,wand->exception);
8696  if (sample_image == (Image *) NULL)
8697    return(MagickFalse);
8698  ReplaceImageInList(&wand->images,sample_image);
8699  return(MagickTrue);
8700}
8701
8702/*
8703%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8704%                                                                             %
8705%                                                                             %
8706%                                                                             %
8707%   M a g i c k S c a l e I m a g e                                           %
8708%                                                                             %
8709%                                                                             %
8710%                                                                             %
8711%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8712%
8713%  MagickScaleImage() scales the size of an image to the given dimensions.
8714%
8715%  The format of the MagickScaleImage method is:
8716%
8717%      MagickBooleanType MagickScaleImage(MagickWand *wand,
8718%        const size_t columns,const size_t rows)
8719%
8720%  A description of each parameter follows:
8721%
8722%    o wand: the magick wand.
8723%
8724%    o columns: the number of columns in the scaled image.
8725%
8726%    o rows: the number of rows in the scaled image.
8727%
8728%
8729*/
8730WandExport MagickBooleanType MagickScaleImage(MagickWand *wand,
8731  const size_t columns,const size_t rows)
8732{
8733  Image
8734    *scale_image;
8735
8736  assert(wand != (MagickWand *) NULL);
8737  assert(wand->signature == MagickWandSignature);
8738  if (wand->debug != MagickFalse)
8739    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8740  if (wand->images == (Image *) NULL)
8741    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8742  scale_image=ScaleImage(wand->images,columns,rows,wand->exception);
8743  if (scale_image == (Image *) NULL)
8744    return(MagickFalse);
8745  ReplaceImageInList(&wand->images,scale_image);
8746  return(MagickTrue);
8747}
8748
8749/*
8750%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8751%                                                                             %
8752%                                                                             %
8753%                                                                             %
8754%   M a g i c k S e g m e n t I m a g e                                       %
8755%                                                                             %
8756%                                                                             %
8757%                                                                             %
8758%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8759%
8760%  MagickSegmentImage() segments an image by analyzing the histograms of the
8761%  color components and identifying units that are homogeneous with the fuzzy
8762%  C-means technique.
8763%
8764%  The format of the SegmentImage method is:
8765%
8766%      MagickBooleanType MagickSegmentImage(MagickWand *wand,
8767%        const ColorspaceType colorspace,const MagickBooleanType verbose,
8768%        const double cluster_threshold,const double smooth_threshold)
8769%
8770%  A description of each parameter follows.
8771%
8772%    o wand: the wand.
8773%
8774%    o colorspace: the image colorspace.
8775%
8776%    o verbose:  Set to MagickTrue to print detailed information about the
8777%      identified classes.
8778%
8779%    o cluster_threshold:  This represents the minimum number of pixels
8780%      contained in a hexahedra before it can be considered valid (expressed as
8781%      a percentage).
8782%
8783%    o smooth_threshold: the smoothing threshold eliminates noise in the second
8784%      derivative of the histogram.  As the value is increased, you can expect a
8785%      smoother second derivative.
8786%
8787*/
8788MagickExport MagickBooleanType MagickSegmentImage(MagickWand *wand,
8789  const ColorspaceType colorspace,const MagickBooleanType verbose,
8790  const double cluster_threshold,const double smooth_threshold)
8791{
8792  MagickBooleanType
8793    status;
8794
8795  assert(wand != (MagickWand *) NULL);
8796  assert(wand->signature == MagickWandSignature);
8797  if (wand->debug != MagickFalse)
8798    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8799  if (wand->images == (Image *) NULL)
8800    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8801  status=SegmentImage(wand->images,colorspace,verbose,cluster_threshold,
8802    smooth_threshold,wand->exception);
8803  return(status);
8804}
8805
8806/*
8807%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8808%                                                                             %
8809%                                                                             %
8810%                                                                             %
8811%   M a g i c k S e l e c t i v e B l u r I m a g e                           %
8812%                                                                             %
8813%                                                                             %
8814%                                                                             %
8815%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8816%
8817%  MagickSelectiveBlurImage() selectively blur an image within a contrast
8818%  threshold. It is similar to the unsharpen mask that sharpens everything with
8819%  contrast above a certain threshold.
8820%
8821%  The format of the MagickSelectiveBlurImage method is:
8822%
8823%      MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
8824%        const double radius,const double sigma,const double threshold)
8825%
8826%  A description of each parameter follows:
8827%
8828%    o wand: the magick wand.
8829%
8830%    o radius: the radius of the gaussian, in pixels, not counting the center
8831%      pixel.
8832%
8833%    o sigma: the standard deviation of the gaussian, in pixels.
8834%
8835%    o threshold: only pixels within this contrast threshold are included
8836%      in the blur operation.
8837%
8838*/
8839WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
8840  const double radius,const double sigma,const double threshold)
8841{
8842  Image
8843    *blur_image;
8844
8845  assert(wand != (MagickWand *) NULL);
8846  assert(wand->signature == MagickWandSignature);
8847  if (wand->debug != MagickFalse)
8848    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8849  if (wand->images == (Image *) NULL)
8850    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8851  blur_image=SelectiveBlurImage(wand->images,radius,sigma,threshold,
8852    wand->exception);
8853  if (blur_image == (Image *) NULL)
8854    return(MagickFalse);
8855  ReplaceImageInList(&wand->images,blur_image);
8856  return(MagickTrue);
8857}
8858
8859/*
8860%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8861%                                                                             %
8862%                                                                             %
8863%                                                                             %
8864%   M a g i c k S e p a r a t e I m a g e C h a n n e l                       %
8865%                                                                             %
8866%                                                                             %
8867%                                                                             %
8868%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8869%
8870%  MagickSeparateImage() separates a channel from the image and returns a
8871%  grayscale image.  A channel is a particular color component of each pixel
8872%  in the image.
8873%
8874%  The format of the MagickSeparateImage method is:
8875%
8876%      MagickBooleanType MagickSeparateImage(MagickWand *wand,
8877%        const ChannelType channel)
8878%
8879%  A description of each parameter follows:
8880%
8881%    o wand: the magick wand.
8882%
8883%    o channel: the channel.
8884%
8885*/
8886WandExport MagickBooleanType MagickSeparateImage(MagickWand *wand,
8887  const ChannelType channel)
8888{
8889  Image
8890    *separate_image;
8891
8892  assert(wand != (MagickWand *) NULL);
8893  assert(wand->signature == MagickWandSignature);
8894  if (wand->debug != MagickFalse)
8895    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8896  if (wand->images == (Image *) NULL)
8897    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8898  separate_image=SeparateImage(wand->images,channel,wand->exception);
8899  if (separate_image == (Image *) NULL)
8900    return(MagickFalse);
8901  ReplaceImageInList(&wand->images,separate_image);
8902  return(MagickTrue);
8903}
8904
8905/*
8906%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8907%                                                                             %
8908%                                                                             %
8909%                                                                             %
8910%     M a g i c k S e p i a T o n e I m a g e                                 %
8911%                                                                             %
8912%                                                                             %
8913%                                                                             %
8914%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8915%
8916%  MagickSepiaToneImage() applies a special effect to the image, similar to the
8917%  effect achieved in a photo darkroom by sepia toning.  Threshold ranges from
8918%  0 to QuantumRange and is a measure of the extent of the sepia toning.  A
8919%  threshold of 80% is a good starting point for a reasonable tone.
8920%
8921%  The format of the MagickSepiaToneImage method is:
8922%
8923%      MagickBooleanType MagickSepiaToneImage(MagickWand *wand,
8924%        const double threshold)
8925%
8926%  A description of each parameter follows:
8927%
8928%    o wand: the magick wand.
8929%
8930%    o threshold:  Define the extent of the sepia toning.
8931%
8932*/
8933WandExport MagickBooleanType MagickSepiaToneImage(MagickWand *wand,
8934  const double threshold)
8935{
8936  Image
8937    *sepia_image;
8938
8939  assert(wand != (MagickWand *) NULL);
8940  assert(wand->signature == MagickWandSignature);
8941  if (wand->debug != MagickFalse)
8942    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8943  if (wand->images == (Image *) NULL)
8944    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8945  sepia_image=SepiaToneImage(wand->images,threshold,wand->exception);
8946  if (sepia_image == (Image *) NULL)
8947    return(MagickFalse);
8948  ReplaceImageInList(&wand->images,sepia_image);
8949  return(MagickTrue);
8950}
8951
8952/*
8953%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8954%                                                                             %
8955%                                                                             %
8956%                                                                             %
8957%   M a g i c k S e t I m a g e                                               %
8958%                                                                             %
8959%                                                                             %
8960%                                                                             %
8961%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8962%
8963%  MagickSetImage() replaces the last image returned by MagickSetIteratorIndex(),
8964%  MagickNextImage(), MagickPreviousImage() with the images from the specified
8965%  wand.
8966%
8967%  The format of the MagickSetImage method is:
8968%
8969%      MagickBooleanType MagickSetImage(MagickWand *wand,
8970%        const MagickWand *set_wand)
8971%
8972%  A description of each parameter follows:
8973%
8974%    o wand: the magick wand.
8975%
8976%    o set_wand: the set_wand wand.
8977%
8978*/
8979WandExport MagickBooleanType MagickSetImage(MagickWand *wand,
8980  const MagickWand *set_wand)
8981{
8982  Image
8983    *images;
8984
8985  assert(wand != (MagickWand *) NULL);
8986  assert(wand->signature == MagickWandSignature);
8987  if (wand->debug != MagickFalse)
8988    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8989  assert(set_wand != (MagickWand *) NULL);
8990  assert(set_wand->signature == MagickWandSignature);
8991  if (wand->debug != MagickFalse)
8992    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",set_wand->name);
8993  if (set_wand->images == (Image *) NULL)
8994    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8995  images=CloneImageList(set_wand->images,wand->exception);
8996  if (images == (Image *) NULL)
8997    return(MagickFalse);
8998  ReplaceImageInList(&wand->images,images);
8999  return(MagickTrue);
9000}
9001
9002/*
9003%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9004%                                                                             %
9005%                                                                             %
9006%                                                                             %
9007%   M a g i c k S e t I m a g e A l p h a C h a n n e l                       %
9008%                                                                             %
9009%                                                                             %
9010%                                                                             %
9011%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9012%
9013%  MagickSetImageAlphaChannel() activates, deactivates, resets, or sets the
9014%  alpha channel.
9015%
9016%  The format of the MagickSetImageAlphaChannel method is:
9017%
9018%      MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand,
9019%        const AlphaChannelOption alpha_type)
9020%
9021%  A description of each parameter follows:
9022%
9023%    o wand: the magick wand.
9024%
9025%    o alpha_type: the alpha channel type: ActivateAlphaChannel,
9026%      DeactivateAlphaChannel, OpaqueAlphaChannel, or SetAlphaChannel.
9027%
9028*/
9029WandExport MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand,
9030  const AlphaChannelOption alpha_type)
9031{
9032  assert(wand != (MagickWand *) NULL);
9033  assert(wand->signature == MagickWandSignature);
9034  if (wand->debug != MagickFalse)
9035    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9036  if (wand->images == (Image *) NULL)
9037    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9038  return(SetImageAlphaChannel(wand->images,alpha_type,wand->exception));
9039}
9040
9041/*
9042%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9043%                                                                             %
9044%                                                                             %
9045%                                                                             %
9046%   M a g i c k S e t I m a g e A l p h a C o l o r                           %
9047%                                                                             %
9048%                                                                             %
9049%                                                                             %
9050%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9051%
9052%  MagickSetImageAlphaColor() sets the image alpha color.
9053%
9054%  The format of the MagickSetImageAlphaColor method is:
9055%
9056%      MagickBooleanType MagickSetImageAlphaColor(MagickWand *wand,
9057%        const PixelWand *matte)
9058%
9059%  A description of each parameter follows:
9060%
9061%    o wand: the magick wand.
9062%
9063%    o matte: the alpha pixel wand.
9064%
9065*/
9066WandExport MagickBooleanType MagickSetImageAlphaColor(MagickWand *wand,
9067  const PixelWand *alpha)
9068{
9069  assert(wand != (MagickWand *)NULL);
9070  assert(wand->signature == MagickWandSignature);
9071  if (wand->debug != MagickFalse)
9072    (void) LogMagickEvent(WandEvent, GetMagickModule(), "%s", wand->name);
9073  if (wand->images == (Image *)NULL)
9074    ThrowWandException(WandError, "ContainsNoImages", wand->name);
9075  PixelGetQuantumPacket(alpha, &wand->images->alpha_color);
9076  return(MagickTrue);
9077}
9078
9079/*
9080%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9081%                                                                             %
9082%                                                                             %
9083%                                                                             %
9084%   M a g i c k S e t I m a g e B a c k g r o u n d C o l o r                 %
9085%                                                                             %
9086%                                                                             %
9087%                                                                             %
9088%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9089%
9090%  MagickSetImageBackgroundColor() sets the image background color.
9091%
9092%  The format of the MagickSetImageBackgroundColor method is:
9093%
9094%      MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand,
9095%        const PixelWand *background)
9096%
9097%  A description of each parameter follows:
9098%
9099%    o wand: the magick wand.
9100%
9101%    o background: the background pixel wand.
9102%
9103*/
9104WandExport MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand,
9105  const PixelWand *background)
9106{
9107  assert(wand != (MagickWand *) NULL);
9108  assert(wand->signature == MagickWandSignature);
9109  if (wand->debug != MagickFalse)
9110    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9111  if (wand->images == (Image *) NULL)
9112    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9113  PixelGetQuantumPacket(background,&wand->images->background_color);
9114  return(MagickTrue);
9115}
9116
9117/*
9118%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9119%                                                                             %
9120%                                                                             %
9121%                                                                             %
9122%   M a g i c k S e t I m a g e B l u e P r i m a r y                         %
9123%                                                                             %
9124%                                                                             %
9125%                                                                             %
9126%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9127%
9128%  MagickSetImageBluePrimary() sets the image chromaticity blue primary point.
9129%
9130%  The format of the MagickSetImageBluePrimary method is:
9131%
9132%      MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand,
9133%        const double x,const double y,const double z)
9134%
9135%  A description of each parameter follows:
9136%
9137%    o wand: the magick wand.
9138%
9139%    o x: the blue primary x-point.
9140%
9141%    o y: the blue primary y-point.
9142%
9143%    o z: the blue primary z-point.
9144%
9145*/
9146WandExport MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand,
9147  const double x,const double y,const double z)
9148{
9149  assert(wand != (MagickWand *) NULL);
9150  assert(wand->signature == MagickWandSignature);
9151  if (wand->debug != MagickFalse)
9152    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9153  if (wand->images == (Image *) NULL)
9154    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9155  wand->images->chromaticity.blue_primary.x=x;
9156  wand->images->chromaticity.blue_primary.y=y;
9157  wand->images->chromaticity.blue_primary.z=z;
9158  return(MagickTrue);
9159}
9160
9161/*
9162%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9163%                                                                             %
9164%                                                                             %
9165%                                                                             %
9166%   M a g i c k S e t I m a g e B o r d e r C o l o r                         %
9167%                                                                             %
9168%                                                                             %
9169%                                                                             %
9170%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9171%
9172%  MagickSetImageBorderColor() sets the image border color.
9173%
9174%  The format of the MagickSetImageBorderColor method is:
9175%
9176%      MagickBooleanType MagickSetImageBorderColor(MagickWand *wand,
9177%        const PixelWand *border)
9178%
9179%  A description of each parameter follows:
9180%
9181%    o wand: the magick wand.
9182%
9183%    o border: the border pixel wand.
9184%
9185*/
9186WandExport MagickBooleanType MagickSetImageBorderColor(MagickWand *wand,
9187  const PixelWand *border)
9188{
9189  assert(wand != (MagickWand *) NULL);
9190  assert(wand->signature == MagickWandSignature);
9191  if (wand->debug != MagickFalse)
9192    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9193  if (wand->images == (Image *) NULL)
9194    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9195  PixelGetQuantumPacket(border,&wand->images->border_color);
9196  return(MagickTrue);
9197}
9198
9199/*
9200%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9201%                                                                             %
9202%                                                                             %
9203%                                                                             %
9204%   M a g i c k S e t I m a g e C h a n n e l M a s k                         %
9205%                                                                             %
9206%                                                                             %
9207%                                                                             %
9208%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9209%
9210%  MagickSetImageChannelMask() sets image channel mask.
9211%
9212%  The format of the MagickSetImageChannelMask method is:
9213%
9214%      ChannelType MagickSetImageChannelMask(MagickWand *wand,
9215%        const ChannelType channel_mask)
9216%
9217%  A description of each parameter follows:
9218%
9219%    o wand: the magick wand.
9220%
9221%    o channel_mask: the channel_mask wand.
9222%
9223*/
9224WandExport ChannelType MagickSetImageChannelMask(MagickWand *wand,
9225  const ChannelType channel_mask)
9226{
9227  assert(wand != (MagickWand *) NULL);
9228  assert(wand->signature == MagickWandSignature);
9229  if (wand->debug != MagickFalse)
9230    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9231  return(SetImageChannelMask(wand->images,channel_mask));
9232}
9233
9234/*
9235%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9236%                                                                             %
9237%                                                                             %
9238%                                                                             %
9239%   M a g i c k S e t I m a g e M a s k                                       %
9240%                                                                             %
9241%                                                                             %
9242%                                                                             %
9243%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9244%
9245%  MagickSetImageMask() sets image clip mask.
9246%
9247%  The format of the MagickSetImageMask method is:
9248%
9249%      MagickBooleanType MagickSetImageMask(MagickWand *wand,
9250%        const PixelMask type,const MagickWand *clip_mask)
9251%
9252%  A description of each parameter follows:
9253%
9254%    o wand: the magick wand.
9255%
9256%    o type: type of mask, ReadPixelMask or WritePixelMask.
9257%
9258%    o clip_mask: the clip_mask wand.
9259%
9260*/
9261WandExport MagickBooleanType MagickSetImageMask(MagickWand *wand,
9262  const PixelMask type,const MagickWand *clip_mask)
9263{
9264  assert(wand != (MagickWand *) NULL);
9265  assert(wand->signature == MagickWandSignature);
9266  if (wand->debug != MagickFalse)
9267    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9268  assert(clip_mask != (MagickWand *) NULL);
9269  assert(clip_mask->signature == MagickWandSignature);
9270  if (clip_mask->debug != MagickFalse)
9271    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clip_mask->name);
9272  if (clip_mask->images == (Image *) NULL)
9273    ThrowWandException(WandError,"ContainsNoImages",clip_mask->name);
9274  return(SetImageMask(wand->images,type,clip_mask->images,wand->exception));
9275}
9276
9277/*
9278%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9279%                                                                             %
9280%                                                                             %
9281%                                                                             %
9282%   M a g i c k S e t I m a g e C o l o r                                     %
9283%                                                                             %
9284%                                                                             %
9285%                                                                             %
9286%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9287%
9288%  MagickSetImageColor() set the entire wand canvas to the specified color.
9289%
9290%  The format of the MagickSetImageColor method is:
9291%
9292%      MagickBooleanType MagickSetImageColor(MagickWand *wand,
9293%        const PixelWand *color)
9294%
9295%  A description of each parameter follows:
9296%
9297%    o wand: the magick wand.
9298%
9299%    o background: the image color.
9300%
9301*/
9302WandExport MagickBooleanType MagickSetImageColor(MagickWand *wand,
9303  const PixelWand *color)
9304{
9305  PixelInfo
9306    pixel;
9307
9308  assert(wand != (MagickWand *) NULL);
9309  assert(wand->signature == MagickWandSignature);
9310  if (wand->debug != MagickFalse)
9311    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9312  PixelGetMagickColor(color,&pixel);
9313  return(SetImageColor(wand->images,&pixel,wand->exception));
9314}
9315
9316/*
9317%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9318%                                                                             %
9319%                                                                             %
9320%                                                                             %
9321%   M a g i c k S e t I m a g e C o l o r m a p C o l o r                     %
9322%                                                                             %
9323%                                                                             %
9324%                                                                             %
9325%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9326%
9327%  MagickSetImageColormapColor() sets the color of the specified colormap
9328%  index.
9329%
9330%  The format of the MagickSetImageColormapColor method is:
9331%
9332%      MagickBooleanType MagickSetImageColormapColor(MagickWand *wand,
9333%        const size_t index,const PixelWand *color)
9334%
9335%  A description of each parameter follows:
9336%
9337%    o wand: the magick wand.
9338%
9339%    o index: the offset into the image colormap.
9340%
9341%    o color: Return the colormap color in this wand.
9342%
9343*/
9344WandExport MagickBooleanType MagickSetImageColormapColor(MagickWand *wand,
9345  const size_t index,const PixelWand *color)
9346{
9347  assert(wand != (MagickWand *) NULL);
9348  assert(wand->signature == MagickWandSignature);
9349  if (wand->debug != MagickFalse)
9350    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9351  if (wand->images == (Image *) NULL)
9352    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9353  if ((wand->images->colormap == (PixelInfo *) NULL) ||
9354      (index >= wand->images->colors))
9355    ThrowWandException(WandError,"InvalidColormapIndex",wand->name);
9356  PixelGetQuantumPacket(color,wand->images->colormap+index);
9357  return(SyncImage(wand->images,wand->exception));
9358}
9359
9360/*
9361%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9362%                                                                             %
9363%                                                                             %
9364%                                                                             %
9365%   M a g i c k S e t I m a g e C o l o r s p a c e                           %
9366%                                                                             %
9367%                                                                             %
9368%                                                                             %
9369%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9370%
9371%  MagickSetImageColorspace() sets the image colorspace. But does not modify
9372%  the image data.
9373%
9374%  The format of the MagickSetImageColorspace method is:
9375%
9376%      MagickBooleanType MagickSetImageColorspace(MagickWand *wand,
9377%        const ColorspaceType colorspace)
9378%
9379%  A description of each parameter follows:
9380%
9381%    o wand: the magick wand.
9382%
9383%    o colorspace: the image colorspace:   UndefinedColorspace, RGBColorspace,
9384%      GRAYColorspace, TransparentColorspace, OHTAColorspace, XYZColorspace,
9385%      YCbCrColorspace, YCCColorspace, YIQColorspace, YPbPrColorspace,
9386%      YPbPrColorspace, YUVColorspace, CMYKColorspace, sRGBColorspace,
9387%      HSLColorspace, or HWBColorspace.
9388%
9389*/
9390WandExport MagickBooleanType MagickSetImageColorspace(MagickWand *wand,
9391  const ColorspaceType colorspace)
9392{
9393  assert(wand != (MagickWand *) NULL);
9394  assert(wand->signature == MagickWandSignature);
9395  if (wand->debug != MagickFalse)
9396    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9397  if (wand->images == (Image *) NULL)
9398    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9399  return(SetImageColorspace(wand->images,colorspace,wand->exception));
9400}
9401
9402/*
9403%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9404%                                                                             %
9405%                                                                             %
9406%                                                                             %
9407%   M a g i c k S e t I m a g e C o m p o s e                                 %
9408%                                                                             %
9409%                                                                             %
9410%                                                                             %
9411%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9412%
9413%  MagickSetImageCompose() sets the image composite operator, useful for
9414%  specifying how to composite the image thumbnail when using the
9415%  MagickMontageImage() method.
9416%
9417%  The format of the MagickSetImageCompose method is:
9418%
9419%      MagickBooleanType MagickSetImageCompose(MagickWand *wand,
9420%        const CompositeOperator compose)
9421%
9422%  A description of each parameter follows:
9423%
9424%    o wand: the magick wand.
9425%
9426%    o compose: the image composite operator.
9427%
9428*/
9429WandExport MagickBooleanType MagickSetImageCompose(MagickWand *wand,
9430  const CompositeOperator compose)
9431{
9432  assert(wand != (MagickWand *) NULL);
9433  assert(wand->signature == MagickWandSignature);
9434  if (wand->debug != MagickFalse)
9435    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9436  if (wand->images == (Image *) NULL)
9437    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9438  wand->images->compose=compose;
9439  return(MagickTrue);
9440}
9441
9442/*
9443%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9444%                                                                             %
9445%                                                                             %
9446%                                                                             %
9447%   M a g i c k S e t I m a g e C o m p r e s s i o n                         %
9448%                                                                             %
9449%                                                                             %
9450%                                                                             %
9451%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9452%
9453%  MagickSetImageCompression() sets the image compression.
9454%
9455%  The format of the MagickSetImageCompression method is:
9456%
9457%      MagickBooleanType MagickSetImageCompression(MagickWand *wand,
9458%        const CompressionType compression)
9459%
9460%  A description of each parameter follows:
9461%
9462%    o wand: the magick wand.
9463%
9464%    o compression: the image compression type.
9465%
9466*/
9467WandExport MagickBooleanType MagickSetImageCompression(MagickWand *wand,
9468  const CompressionType compression)
9469{
9470  assert(wand != (MagickWand *) NULL);
9471  assert(wand->signature == MagickWandSignature);
9472  if (wand->debug != MagickFalse)
9473    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9474  if (wand->images == (Image *) NULL)
9475    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9476  wand->images->compression=compression;
9477  return(MagickTrue);
9478}
9479
9480/*
9481%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9482%                                                                             %
9483%                                                                             %
9484%                                                                             %
9485%   M a g i c k S e t I m a g e C o m p r e s s i o n Q u a l i t y           %
9486%                                                                             %
9487%                                                                             %
9488%                                                                             %
9489%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9490%
9491%  MagickSetImageCompressionQuality() sets the image compression quality.
9492%
9493%  The format of the MagickSetImageCompressionQuality method is:
9494%
9495%      MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
9496%        const size_t quality)
9497%
9498%  A description of each parameter follows:
9499%
9500%    o wand: the magick wand.
9501%
9502%    o quality: the image compression tlityype.
9503%
9504*/
9505WandExport MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
9506  const size_t quality)
9507{
9508  assert(wand != (MagickWand *) NULL);
9509  assert(wand->signature == MagickWandSignature);
9510  if (wand->debug != MagickFalse)
9511    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9512  if (wand->images == (Image *) NULL)
9513    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9514  wand->images->quality=quality;
9515  return(MagickTrue);
9516}
9517
9518/*
9519%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9520%                                                                             %
9521%                                                                             %
9522%                                                                             %
9523%   M a g i c k S e t I m a g e D e l a y                                     %
9524%                                                                             %
9525%                                                                             %
9526%                                                                             %
9527%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9528%
9529%  MagickSetImageDelay() sets the image delay.
9530%
9531%  The format of the MagickSetImageDelay method is:
9532%
9533%      MagickBooleanType MagickSetImageDelay(MagickWand *wand,
9534%        const size_t delay)
9535%
9536%  A description of each parameter follows:
9537%
9538%    o wand: the magick wand.
9539%
9540%    o delay: the image delay in ticks-per-second units.
9541%
9542*/
9543WandExport MagickBooleanType MagickSetImageDelay(MagickWand *wand,
9544  const size_t delay)
9545{
9546  assert(wand != (MagickWand *) NULL);
9547  assert(wand->signature == MagickWandSignature);
9548  if (wand->debug != MagickFalse)
9549    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9550  if (wand->images == (Image *) NULL)
9551    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9552  wand->images->delay=delay;
9553  return(MagickTrue);
9554}
9555
9556/*
9557%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9558%                                                                             %
9559%                                                                             %
9560%                                                                             %
9561%   M a g i c k S e t I m a g e D e p t h                                     %
9562%                                                                             %
9563%                                                                             %
9564%                                                                             %
9565%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9566%
9567%  MagickSetImageDepth() sets the image depth.
9568%
9569%  The format of the MagickSetImageDepth method is:
9570%
9571%      MagickBooleanType MagickSetImageDepth(MagickWand *wand,
9572%        const size_t depth)
9573%
9574%  A description of each parameter follows:
9575%
9576%    o wand: the magick wand.
9577%
9578%    o depth: the image depth in bits: 8, 16, or 32.
9579%
9580*/
9581WandExport MagickBooleanType MagickSetImageDepth(MagickWand *wand,
9582  const size_t depth)
9583{
9584  assert(wand != (MagickWand *) NULL);
9585  assert(wand->signature == MagickWandSignature);
9586  if (wand->debug != MagickFalse)
9587    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9588  if (wand->images == (Image *) NULL)
9589    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9590  return(SetImageDepth(wand->images,depth,wand->exception));
9591}
9592
9593/*
9594%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9595%                                                                             %
9596%                                                                             %
9597%                                                                             %
9598%   M a g i c k S e t I m a g e D i s p o s e                                 %
9599%                                                                             %
9600%                                                                             %
9601%                                                                             %
9602%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9603%
9604%  MagickSetImageDispose() sets the image disposal method.
9605%
9606%  The format of the MagickSetImageDispose method is:
9607%
9608%      MagickBooleanType MagickSetImageDispose(MagickWand *wand,
9609%        const DisposeType dispose)
9610%
9611%  A description of each parameter follows:
9612%
9613%    o wand: the magick wand.
9614%
9615%    o dispose: the image disposeal type.
9616%
9617*/
9618WandExport MagickBooleanType MagickSetImageDispose(MagickWand *wand,
9619  const DisposeType dispose)
9620{
9621  assert(wand != (MagickWand *) NULL);
9622  assert(wand->signature == MagickWandSignature);
9623  if (wand->debug != MagickFalse)
9624    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9625  if (wand->images == (Image *) NULL)
9626    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9627  wand->images->dispose=dispose;
9628  return(MagickTrue);
9629}
9630
9631/*
9632%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9633%                                                                             %
9634%                                                                             %
9635%                                                                             %
9636%   M a g i c k S e t I m a g e E n d i a n                                   %
9637%                                                                             %
9638%                                                                             %
9639%                                                                             %
9640%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9641%
9642%  MagickSetImageEndian() sets the image endian method.
9643%
9644%  The format of the MagickSetImageEndian method is:
9645%
9646%      MagickBooleanType MagickSetImageEndian(MagickWand *wand,
9647%        const EndianType endian)
9648%
9649%  A description of each parameter follows:
9650%
9651%    o wand: the magick wand.
9652%
9653%    o endian: the image endian type.
9654%
9655*/
9656WandExport MagickBooleanType MagickSetImageEndian(MagickWand *wand,
9657  const EndianType endian)
9658{
9659  assert(wand != (MagickWand *) NULL);
9660  assert(wand->signature == MagickWandSignature);
9661  if (wand->debug != MagickFalse)
9662    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9663  if (wand->images == (Image *) NULL)
9664    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9665  wand->images->endian=endian;
9666  return(MagickTrue);
9667}
9668
9669/*
9670%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9671%                                                                             %
9672%                                                                             %
9673%                                                                             %
9674%   M a g i c k S e t I m a g e E x t e n t                                   %
9675%                                                                             %
9676%                                                                             %
9677%                                                                             %
9678%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9679%
9680%  MagickSetImageExtent() sets the image size (i.e. columns & rows).
9681%
9682%  The format of the MagickSetImageExtent method is:
9683%
9684%      MagickBooleanType MagickSetImageExtent(MagickWand *wand,
9685%        const size_t columns,const unsigned rows)
9686%
9687%  A description of each parameter follows:
9688%
9689%    o wand: the magick wand.
9690%
9691%    o columns:  The image width in pixels.
9692%
9693%    o rows:  The image height in pixels.
9694%
9695*/
9696WandExport MagickBooleanType MagickSetImageExtent(MagickWand *wand,
9697  const size_t columns,const size_t rows)
9698{
9699  assert(wand != (MagickWand *) NULL);
9700  assert(wand->signature == MagickWandSignature);
9701  if (wand->debug != MagickFalse)
9702    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9703  if (wand->images == (Image *) NULL)
9704    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9705  return(SetImageExtent(wand->images,columns,rows,wand->exception));
9706}
9707
9708/*
9709%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9710%                                                                             %
9711%                                                                             %
9712%                                                                             %
9713%   M a g i c k S e t I m a g e F i l e n a m e                               %
9714%                                                                             %
9715%                                                                             %
9716%                                                                             %
9717%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9718%
9719%  MagickSetImageFilename() sets the filename of a particular image in a
9720%  sequence.
9721%
9722%  The format of the MagickSetImageFilename method is:
9723%
9724%      MagickBooleanType MagickSetImageFilename(MagickWand *wand,
9725%        const char *filename)
9726%
9727%  A description of each parameter follows:
9728%
9729%    o wand: the magick wand.
9730%
9731%    o filename: the image filename.
9732%
9733*/
9734WandExport MagickBooleanType MagickSetImageFilename(MagickWand *wand,
9735  const char *filename)
9736{
9737  assert(wand != (MagickWand *) NULL);
9738  assert(wand->signature == MagickWandSignature);
9739  if (wand->debug != MagickFalse)
9740    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9741  if (wand->images == (Image *) NULL)
9742    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9743  if (filename != (const char *) NULL)
9744    (void) CopyMagickString(wand->images->filename,filename,MagickPathExtent);
9745  return(MagickTrue);
9746}
9747
9748/*
9749%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9750%                                                                             %
9751%                                                                             %
9752%                                                                             %
9753%   M a g i c k S e t I m a g e F o r m a t                                   %
9754%                                                                             %
9755%                                                                             %
9756%                                                                             %
9757%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9758%
9759%  MagickSetImageFormat() sets the format of a particular image in a
9760%  sequence.
9761%
9762%  The format of the MagickSetImageFormat method is:
9763%
9764%      MagickBooleanType MagickSetImageFormat(MagickWand *wand,
9765%        const char *format)
9766%
9767%  A description of each parameter follows:
9768%
9769%    o wand: the magick wand.
9770%
9771%    o format: the image format.
9772%
9773*/
9774WandExport MagickBooleanType MagickSetImageFormat(MagickWand *wand,
9775  const char *format)
9776{
9777  const MagickInfo
9778    *magick_info;
9779
9780  assert(wand != (MagickWand *) NULL);
9781  assert(wand->signature == MagickWandSignature);
9782  if (wand->debug != MagickFalse)
9783    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9784  if (wand->images == (Image *) NULL)
9785    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9786  if ((format == (char *) NULL) || (*format == '\0'))
9787    {
9788      *wand->images->magick='\0';
9789      return(MagickTrue);
9790    }
9791  magick_info=GetMagickInfo(format,wand->exception);
9792  if (magick_info == (const MagickInfo *) NULL)
9793    return(MagickFalse);
9794  ClearMagickException(wand->exception);
9795  (void) CopyMagickString(wand->images->magick,format,MagickPathExtent);
9796  return(MagickTrue);
9797}
9798
9799/*
9800%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9801%                                                                             %
9802%                                                                             %
9803%                                                                             %
9804%   M a g i c k S e t I m a g e F u z z                                       %
9805%                                                                             %
9806%                                                                             %
9807%                                                                             %
9808%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9809%
9810%  MagickSetImageFuzz() sets the image fuzz.
9811%
9812%  The format of the MagickSetImageFuzz method is:
9813%
9814%      MagickBooleanType MagickSetImageFuzz(MagickWand *wand,
9815%        const double fuzz)
9816%
9817%  A description of each parameter follows:
9818%
9819%    o wand: the magick wand.
9820%
9821%    o fuzz: the image fuzz.
9822%
9823*/
9824WandExport MagickBooleanType MagickSetImageFuzz(MagickWand *wand,
9825  const double fuzz)
9826{
9827  assert(wand != (MagickWand *) NULL);
9828  assert(wand->signature == MagickWandSignature);
9829  if (wand->debug != MagickFalse)
9830    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9831  if (wand->images == (Image *) NULL)
9832    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9833  wand->images->fuzz=fuzz;
9834  return(MagickTrue);
9835}
9836
9837/*
9838%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9839%                                                                             %
9840%                                                                             %
9841%                                                                             %
9842%   M a g i c k S e t I m a g e G a m m a                                     %
9843%                                                                             %
9844%                                                                             %
9845%                                                                             %
9846%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9847%
9848%  MagickSetImageGamma() sets the image gamma.
9849%
9850%  The format of the MagickSetImageGamma method is:
9851%
9852%      MagickBooleanType MagickSetImageGamma(MagickWand *wand,
9853%        const double gamma)
9854%
9855%  A description of each parameter follows:
9856%
9857%    o wand: the magick wand.
9858%
9859%    o gamma: the image gamma.
9860%
9861*/
9862WandExport MagickBooleanType MagickSetImageGamma(MagickWand *wand,
9863  const double gamma)
9864{
9865  assert(wand != (MagickWand *) NULL);
9866  assert(wand->signature == MagickWandSignature);
9867  if (wand->debug != MagickFalse)
9868    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9869  if (wand->images == (Image *) NULL)
9870    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9871  wand->images->gamma=gamma;
9872  return(MagickTrue);
9873}
9874
9875/*
9876%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9877%                                                                             %
9878%                                                                             %
9879%                                                                             %
9880%   M a g i c k S e t I m a g e G r a v i t y                                 %
9881%                                                                             %
9882%                                                                             %
9883%                                                                             %
9884%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9885%
9886%  MagickSetImageGravity() sets the image gravity type.
9887%
9888%  The format of the MagickSetImageGravity method is:
9889%
9890%      MagickBooleanType MagickSetImageGravity(MagickWand *wand,
9891%        const GravityType gravity)
9892%
9893%  A description of each parameter follows:
9894%
9895%    o wand: the magick wand.
9896%
9897%    o gravity: positioning gravity (NorthWestGravity, NorthGravity,
9898%               NorthEastGravity, WestGravity, CenterGravity,
9899%               EastGravity, SouthWestGravity, SouthGravity,
9900%               SouthEastGravity)
9901%
9902*/
9903WandExport MagickBooleanType MagickSetImageGravity(MagickWand *wand,
9904  const GravityType gravity)
9905{
9906  assert(wand != (MagickWand *) NULL);
9907  assert(wand->signature == MagickWandSignature);
9908  if (wand->debug != MagickFalse)
9909    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9910  if (wand->images == (Image *) NULL)
9911    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9912  wand->images->gravity=gravity;
9913  return(MagickTrue);
9914}
9915
9916/*
9917%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9918%                                                                             %
9919%                                                                             %
9920%                                                                             %
9921%   M a g i c k S e t I m a g e G r e e n P r i m a r y                       %
9922%                                                                             %
9923%                                                                             %
9924%                                                                             %
9925%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9926%
9927%  MagickSetImageGreenPrimary() sets the image chromaticity green primary
9928%  point.
9929%
9930%  The format of the MagickSetImageGreenPrimary method is:
9931%
9932%      MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand,
9933%        const double x,const double y,const double z)
9934%
9935%  A description of each parameter follows:
9936%
9937%    o wand: the magick wand.
9938%
9939%    o x: the green primary x-point.
9940%
9941%    o y: the green primary y-point.
9942%
9943%    o z: the green primary z-point.
9944%
9945*/
9946WandExport MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand,
9947  const double x,const double y,const double z)
9948{
9949  assert(wand != (MagickWand *) NULL);
9950  assert(wand->signature == MagickWandSignature);
9951  if (wand->debug != MagickFalse)
9952    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9953  if (wand->images == (Image *) NULL)
9954    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9955  wand->images->chromaticity.green_primary.x=x;
9956  wand->images->chromaticity.green_primary.y=y;
9957  wand->images->chromaticity.green_primary.z=z;
9958  return(MagickTrue);
9959}
9960
9961/*
9962%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9963%                                                                             %
9964%                                                                             %
9965%                                                                             %
9966%   M a g i c k S e t I m a g e I n t e r l a c e S c h e m e                 %
9967%                                                                             %
9968%                                                                             %
9969%                                                                             %
9970%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9971%
9972%  MagickSetImageInterlaceScheme() sets the image interlace scheme.
9973%
9974%  The format of the MagickSetImageInterlaceScheme method is:
9975%
9976%      MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand,
9977%        const InterlaceType interlace)
9978%
9979%  A description of each parameter follows:
9980%
9981%    o wand: the magick wand.
9982%
9983%    o interlace: the image interlace scheme: NoInterlace, LineInterlace,
9984%      PlaneInterlace, PartitionInterlace.
9985%
9986*/
9987WandExport MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand,
9988  const InterlaceType interlace)
9989{
9990  assert(wand != (MagickWand *) NULL);
9991  assert(wand->signature == MagickWandSignature);
9992  if (wand->debug != MagickFalse)
9993    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9994  if (wand->images == (Image *) NULL)
9995    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9996  wand->images->interlace=interlace;
9997  return(MagickTrue);
9998}
9999
10000/*
10001%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10002%                                                                             %
10003%                                                                             %
10004%                                                                             %
10005%   M a g i c k S e t I m a g e I n t e r p o l a t e M e t h o d             %
10006%                                                                             %
10007%                                                                             %
10008%                                                                             %
10009%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10010%
10011%  MagickSetImagePixelInterpolateMethod() sets the image interpolate pixel
10012%  method.
10013%
10014%  The format of the MagickSetImagePixelInterpolateMethod method is:
10015%
10016%      MagickBooleanType MagickSetImagePixelInterpolateMethod(MagickWand *wand,
10017%        const PixelInterpolateMethod method)
10018%
10019%  A description of each parameter follows:
10020%
10021%    o wand: the magick wand.
10022%
10023%    o method: the image interpole pixel methods: choose from Undefined,
10024%      Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor.
10025%
10026*/
10027WandExport MagickBooleanType MagickSetImagePixelInterpolateMethod(
10028  MagickWand *wand,const PixelInterpolateMethod method)
10029{
10030  assert(wand != (MagickWand *) NULL);
10031  assert(wand->signature == MagickWandSignature);
10032  if (wand->debug != MagickFalse)
10033    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10034  if (wand->images == (Image *) NULL)
10035    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10036  wand->images->interpolate=method;
10037  return(MagickTrue);
10038}
10039
10040/*
10041%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10042%                                                                             %
10043%                                                                             %
10044%                                                                             %
10045%   M a g i c k S e t I m a g e I t e r a t i o n s                           %
10046%                                                                             %
10047%                                                                             %
10048%                                                                             %
10049%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10050%
10051%  MagickSetImageIterations() sets the image iterations.
10052%
10053%  The format of the MagickSetImageIterations method is:
10054%
10055%      MagickBooleanType MagickSetImageIterations(MagickWand *wand,
10056%        const size_t iterations)
10057%
10058%  A description of each parameter follows:
10059%
10060%    o wand: the magick wand.
10061%
10062%    o delay: the image delay in 1/100th of a second.
10063%
10064*/
10065WandExport MagickBooleanType MagickSetImageIterations(MagickWand *wand,
10066  const size_t iterations)
10067{
10068  assert(wand != (MagickWand *) NULL);
10069  assert(wand->signature == MagickWandSignature);
10070  if (wand->debug != MagickFalse)
10071    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10072  if (wand->images == (Image *) NULL)
10073    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10074  wand->images->iterations=iterations;
10075  return(MagickTrue);
10076}
10077
10078/*
10079%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10080%                                                                             %
10081%                                                                             %
10082%                                                                             %
10083%   M a g i c k S e t I m a g e M a t t e                                     %
10084%                                                                             %
10085%                                                                             %
10086%                                                                             %
10087%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10088%
10089%  MagickSetImageMatte() sets the image matte channel.
10090%
10091%  The format of the MagickSetImageMatte method is:
10092%
10093%      MagickBooleanType MagickSetImageMatte(MagickWand *wand,
10094%        const MagickBooleanType *matte)
10095%
10096%  A description of each parameter follows:
10097%
10098%    o wand: the magick wand.
10099%
10100%    o matte: Set to MagickTrue to enable the image matte channel otherwise
10101%      MagickFalse.
10102%
10103*/
10104WandExport MagickBooleanType MagickSetImageMatte(MagickWand *wand,
10105  const MagickBooleanType matte)
10106{
10107  assert(wand != (MagickWand *) NULL);
10108  assert(wand->signature == MagickWandSignature);
10109  if (wand->debug != MagickFalse)
10110    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10111  if (wand->images == (Image *) NULL)
10112    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10113  if (matte == MagickFalse)
10114    wand->images->alpha_trait=UndefinedPixelTrait;
10115  else
10116    {
10117      if (wand->images->alpha_trait == UndefinedPixelTrait)
10118        (void) SetImageAlpha(wand->images,OpaqueAlpha,wand->exception);
10119      wand->images->alpha_trait=BlendPixelTrait;
10120    }
10121  return(MagickTrue);
10122}
10123
10124/*
10125%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10126%                                                                             %
10127%                                                                             %
10128%                                                                             %
10129%   M a g i c k S e t I m a g e O p a c i t y                                 %
10130%                                                                             %
10131%                                                                             %
10132%                                                                             %
10133%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10134%
10135%  MagickSetImageAlpha() sets the image to the specified alpha level.
10136%
10137%  The format of the MagickSetImageAlpha method is:
10138%
10139%      MagickBooleanType MagickSetImageAlpha(MagickWand *wand,
10140%        const double alpha)
10141%
10142%  A description of each parameter follows:
10143%
10144%    o wand: the magick wand.
10145%
10146%    o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
10147%      transparent.
10148%
10149*/
10150WandExport MagickBooleanType MagickSetImageAlpha(MagickWand *wand,
10151  const double alpha)
10152{
10153  MagickBooleanType
10154    status;
10155
10156  assert(wand != (MagickWand *) NULL);
10157  assert(wand->signature == MagickWandSignature);
10158  if (wand->debug != MagickFalse)
10159    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10160  if (wand->images == (Image *) NULL)
10161    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10162  status=SetImageAlpha(wand->images,ClampToQuantum(QuantumRange*alpha),
10163    wand->exception);
10164  return(status);
10165}
10166
10167/*
10168%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10169%                                                                             %
10170%                                                                             %
10171%                                                                             %
10172%   M a g i c k S e t I m a g e O r i e n t a t i o n                         %
10173%                                                                             %
10174%                                                                             %
10175%                                                                             %
10176%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10177%
10178%  MagickSetImageOrientation() sets the image orientation.
10179%
10180%  The format of the MagickSetImageOrientation method is:
10181%
10182%      MagickBooleanType MagickSetImageOrientation(MagickWand *wand,
10183%        const OrientationType orientation)
10184%
10185%  A description of each parameter follows:
10186%
10187%    o wand: the magick wand.
10188%
10189%    o orientation: the image orientation type.
10190%
10191*/
10192WandExport MagickBooleanType MagickSetImageOrientation(MagickWand *wand,
10193  const OrientationType orientation)
10194{
10195  assert(wand != (MagickWand *) NULL);
10196  assert(wand->signature == MagickWandSignature);
10197  if (wand->debug != MagickFalse)
10198    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10199  if (wand->images == (Image *) NULL)
10200    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10201  wand->images->orientation=orientation;
10202  return(MagickTrue);
10203}
10204
10205/*
10206%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10207%                                                                             %
10208%                                                                             %
10209%                                                                             %
10210%   M a g i c k S e t I m a g e P a g e                                       %
10211%                                                                             %
10212%                                                                             %
10213%                                                                             %
10214%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10215%
10216%  MagickSetImagePage() sets the page geometry of the image.
10217%
10218%  The format of the MagickSetImagePage method is:
10219%
10220%      MagickBooleanType MagickSetImagePage(MagickWand *wand,const size_t width,%        const size_t height,const ssize_t x,const ssize_t y)
10221%
10222%  A description of each parameter follows:
10223%
10224%    o wand: the magick wand.
10225%
10226%    o width: the page width.
10227%
10228%    o height: the page height.
10229%
10230%    o x: the page x-offset.
10231%
10232%    o y: the page y-offset.
10233%
10234*/
10235WandExport MagickBooleanType MagickSetImagePage(MagickWand *wand,
10236  const size_t width,const size_t height,const ssize_t x,
10237  const ssize_t y)
10238{
10239  assert(wand != (MagickWand *) NULL);
10240  assert(wand->signature == MagickWandSignature);
10241  if (wand->debug != MagickFalse)
10242    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10243  if (wand->images == (Image *) NULL)
10244    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10245  wand->images->page.width=width;
10246  wand->images->page.height=height;
10247  wand->images->page.x=x;
10248  wand->images->page.y=y;
10249  return(MagickTrue);
10250}
10251
10252/*
10253%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10254%                                                                             %
10255%                                                                             %
10256%                                                                             %
10257%   M a g i c k S e t I m a g e P r o g r e s s M o n i t o r                 %
10258%                                                                             %
10259%                                                                             %
10260%                                                                             %
10261%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10262%
10263%  MagickSetImageProgressMonitor() sets the wand image progress monitor to the
10264%  specified method and returns the previous progress monitor if any.  The
10265%  progress monitor method looks like this:
10266%
10267%    MagickBooleanType MagickProgressMonitor(const char *text,
10268%      const MagickOffsetType offset,const MagickSizeType span,
10269%      void *client_data)
10270%
10271%  If the progress monitor returns MagickFalse, the current operation is
10272%  interrupted.
10273%
10274%  The format of the MagickSetImageProgressMonitor method is:
10275%
10276%      MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand
10277%        const MagickProgressMonitor progress_monitor,void *client_data)
10278%
10279%  A description of each parameter follows:
10280%
10281%    o wand: the magick wand.
10282%
10283%    o progress_monitor: Specifies a pointer to a method to monitor progress
10284%      of an image operation.
10285%
10286%    o client_data: Specifies a pointer to any client data.
10287%
10288*/
10289WandExport MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand,
10290  const MagickProgressMonitor progress_monitor,void *client_data)
10291{
10292  MagickProgressMonitor
10293    previous_monitor;
10294
10295  assert(wand != (MagickWand *) NULL);
10296  assert(wand->signature == MagickWandSignature);
10297  if (wand->debug != MagickFalse)
10298    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10299  if (wand->images == (Image *) NULL)
10300    {
10301      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
10302        "ContainsNoImages","`%s'",wand->name);
10303      return((MagickProgressMonitor) NULL);
10304    }
10305  previous_monitor=SetImageProgressMonitor(wand->images,
10306    progress_monitor,client_data);
10307  return(previous_monitor);
10308}
10309
10310/*
10311%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10312%                                                                             %
10313%                                                                             %
10314%                                                                             %
10315%   M a g i c k S e t I m a g e R e d P r i m a r y                           %
10316%                                                                             %
10317%                                                                             %
10318%                                                                             %
10319%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10320%
10321%  MagickSetImageRedPrimary() sets the image chromaticity red primary point.
10322%
10323%  The format of the MagickSetImageRedPrimary method is:
10324%
10325%      MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand,
10326%        const double x,const double y,const double z)
10327%
10328%  A description of each parameter follows:
10329%
10330%    o wand: the magick wand.
10331%
10332%    o x: the red primary x-point.
10333%
10334%    o y: the red primary y-point.
10335%
10336%    o z: the red primary z-point.
10337%
10338*/
10339WandExport MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand,
10340  const double x,const double y,const double z)
10341{
10342  assert(wand != (MagickWand *) NULL);
10343  assert(wand->signature == MagickWandSignature);
10344  if (wand->debug != MagickFalse)
10345    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10346  if (wand->images == (Image *) NULL)
10347    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10348  wand->images->chromaticity.red_primary.x=x;
10349  wand->images->chromaticity.red_primary.y=y;
10350  wand->images->chromaticity.red_primary.z=z;
10351  return(MagickTrue);
10352}
10353
10354/*
10355%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10356%                                                                             %
10357%                                                                             %
10358%                                                                             %
10359%   M a g i c k S e t I m a g e R e n d e r i n g I n t e n t                 %
10360%                                                                             %
10361%                                                                             %
10362%                                                                             %
10363%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10364%
10365%  MagickSetImageRenderingIntent() sets the image rendering intent.
10366%
10367%  The format of the MagickSetImageRenderingIntent method is:
10368%
10369%      MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand,
10370%        const RenderingIntent rendering_intent)
10371%
10372%  A description of each parameter follows:
10373%
10374%    o wand: the magick wand.
10375%
10376%    o rendering_intent: the image rendering intent: UndefinedIntent,
10377%      SaturationIntent, PerceptualIntent, AbsoluteIntent, or RelativeIntent.
10378%
10379*/
10380WandExport MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand,
10381  const RenderingIntent rendering_intent)
10382{
10383  assert(wand != (MagickWand *) NULL);
10384  assert(wand->signature == MagickWandSignature);
10385  if (wand->debug != MagickFalse)
10386    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10387  if (wand->images == (Image *) NULL)
10388    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10389  wand->images->rendering_intent=rendering_intent;
10390  return(MagickTrue);
10391}
10392
10393/*
10394%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10395%                                                                             %
10396%                                                                             %
10397%                                                                             %
10398%   M a g i c k S e t I m a g e R e s o l u t i o n                           %
10399%                                                                             %
10400%                                                                             %
10401%                                                                             %
10402%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10403%
10404%  MagickSetImageResolution() sets the image resolution.
10405%
10406%  The format of the MagickSetImageResolution method is:
10407%
10408%      MagickBooleanType MagickSetImageResolution(MagickWand *wand,
10409%        const double x_resolution,const double y_resolution)
10410%
10411%  A description of each parameter follows:
10412%
10413%    o wand: the magick wand.
10414%
10415%    o x_resolution: the image x resolution.
10416%
10417%    o y_resolution: the image y resolution.
10418%
10419*/
10420WandExport MagickBooleanType MagickSetImageResolution(MagickWand *wand,
10421  const double x_resolution,const double y_resolution)
10422{
10423  assert(wand != (MagickWand *) NULL);
10424  assert(wand->signature == MagickWandSignature);
10425  if (wand->debug != MagickFalse)
10426    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10427  if (wand->images == (Image *) NULL)
10428    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10429  wand->images->resolution.x=x_resolution;
10430  wand->images->resolution.y=y_resolution;
10431  return(MagickTrue);
10432}
10433
10434/*
10435%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10436%                                                                             %
10437%                                                                             %
10438%                                                                             %
10439%   M a g i c k S e t I m a g e S c e n e                                     %
10440%                                                                             %
10441%                                                                             %
10442%                                                                             %
10443%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10444%
10445%  MagickSetImageScene() sets the image scene.
10446%
10447%  The format of the MagickSetImageScene method is:
10448%
10449%      MagickBooleanType MagickSetImageScene(MagickWand *wand,
10450%        const size_t scene)
10451%
10452%  A description of each parameter follows:
10453%
10454%    o wand: the magick wand.
10455%
10456%    o delay: the image scene number.
10457%
10458*/
10459WandExport MagickBooleanType MagickSetImageScene(MagickWand *wand,
10460  const size_t scene)
10461{
10462  assert(wand != (MagickWand *) NULL);
10463  assert(wand->signature == MagickWandSignature);
10464  if (wand->debug != MagickFalse)
10465    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10466  if (wand->images == (Image *) NULL)
10467    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10468  wand->images->scene=scene;
10469  return(MagickTrue);
10470}
10471
10472/*
10473%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10474%                                                                             %
10475%                                                                             %
10476%                                                                             %
10477%   M a g i c k S e t I m a g e T i c k s P e r S e c o n d                   %
10478%                                                                             %
10479%                                                                             %
10480%                                                                             %
10481%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10482%
10483%  MagickSetImageTicksPerSecond() sets the image ticks-per-second.
10484%
10485%  The format of the MagickSetImageTicksPerSecond method is:
10486%
10487%      MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand,
10488%        const ssize_t ticks_per-second)
10489%
10490%  A description of each parameter follows:
10491%
10492%    o wand: the magick wand.
10493%
10494%    o ticks_per_second: the units to use for the image delay.
10495%
10496*/
10497WandExport MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand,
10498  const ssize_t ticks_per_second)
10499{
10500  assert(wand != (MagickWand *) NULL);
10501  assert(wand->signature == MagickWandSignature);
10502  if (wand->debug != MagickFalse)
10503    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10504  if (wand->images == (Image *) NULL)
10505    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10506  wand->images->ticks_per_second=ticks_per_second;
10507  return(MagickTrue);
10508}
10509
10510/*
10511%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10512%                                                                             %
10513%                                                                             %
10514%                                                                             %
10515%   M a g i c k S e t I m a g e T y p e                                       %
10516%                                                                             %
10517%                                                                             %
10518%                                                                             %
10519%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10520%
10521%  MagickSetImageType() sets the image type.
10522%
10523%  The format of the MagickSetImageType method is:
10524%
10525%      MagickBooleanType MagickSetImageType(MagickWand *wand,
10526%        const ImageType image_type)
10527%
10528%  A description of each parameter follows:
10529%
10530%    o wand: the magick wand.
10531%
10532%    o image_type: the image type:   UndefinedType, BilevelType, GrayscaleType,
10533%      GrayscaleAlphaType, PaletteType, PaletteAlphaType, TrueColorType,
10534%      TrueColorAlphaType, ColorSeparationType, ColorSeparationAlphaType,
10535%      or OptimizeType.
10536%
10537*/
10538WandExport MagickBooleanType MagickSetImageType(MagickWand *wand,
10539  const ImageType image_type)
10540{
10541  assert(wand != (MagickWand *) NULL);
10542  assert(wand->signature == MagickWandSignature);
10543  if (wand->debug != MagickFalse)
10544    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10545  if (wand->images == (Image *) NULL)
10546    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10547  return(SetImageType(wand->images,image_type,wand->exception));
10548}
10549
10550/*
10551%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10552%                                                                             %
10553%                                                                             %
10554%                                                                             %
10555%   M a g i c k S e t I m a g e U n i t s                                     %
10556%                                                                             %
10557%                                                                             %
10558%                                                                             %
10559%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10560%
10561%  MagickSetImageUnits() sets the image units of resolution.
10562%
10563%  The format of the MagickSetImageUnits method is:
10564%
10565%      MagickBooleanType MagickSetImageUnits(MagickWand *wand,
10566%        const ResolutionType units)
10567%
10568%  A description of each parameter follows:
10569%
10570%    o wand: the magick wand.
10571%
10572%    o units: the image units of resolution : UndefinedResolution,
10573%      PixelsPerInchResolution, or PixelsPerCentimeterResolution.
10574%
10575*/
10576WandExport MagickBooleanType MagickSetImageUnits(MagickWand *wand,
10577  const ResolutionType units)
10578{
10579  assert(wand != (MagickWand *) NULL);
10580  assert(wand->signature == MagickWandSignature);
10581  if (wand->debug != MagickFalse)
10582    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10583  if (wand->images == (Image *) NULL)
10584    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10585  wand->images->units=units;
10586  return(MagickTrue);
10587}
10588
10589/*
10590%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10591%                                                                             %
10592%                                                                             %
10593%                                                                             %
10594%   M a g i c k S e t I m a g e V i r t u a l P i x e l M e t h o d           %
10595%                                                                             %
10596%                                                                             %
10597%                                                                             %
10598%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10599%
10600%  MagickSetImageVirtualPixelMethod() sets the image virtual pixel method.
10601%
10602%  The format of the MagickSetImageVirtualPixelMethod method is:
10603%
10604%      VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand,
10605%        const VirtualPixelMethod method)
10606%
10607%  A description of each parameter follows:
10608%
10609%    o wand: the magick wand.
10610%
10611%    o method: the image virtual pixel method : UndefinedVirtualPixelMethod,
10612%      ConstantVirtualPixelMethod,  EdgeVirtualPixelMethod,
10613%      MirrorVirtualPixelMethod, or TileVirtualPixelMethod.
10614%
10615*/
10616WandExport VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand,
10617  const VirtualPixelMethod method)
10618{
10619  assert(wand != (MagickWand *) NULL);
10620  assert(wand->signature == MagickWandSignature);
10621  if (wand->debug != MagickFalse)
10622    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10623  if (wand->images == (Image *) NULL)
10624    return(UndefinedVirtualPixelMethod);
10625  return(SetImageVirtualPixelMethod(wand->images,method,wand->exception));
10626}
10627
10628/*
10629%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10630%                                                                             %
10631%                                                                             %
10632%                                                                             %
10633%   M a g i c k S e t I m a g e W h i t e P o i n t                           %
10634%                                                                             %
10635%                                                                             %
10636%                                                                             %
10637%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10638%
10639%  MagickSetImageWhitePoint() sets the image chromaticity white point.
10640%
10641%  The format of the MagickSetImageWhitePoint method is:
10642%
10643%      MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand,
10644%        const double x,const double y,const double z)
10645%
10646%  A description of each parameter follows:
10647%
10648%    o wand: the magick wand.
10649%
10650%    o x: the white x-point.
10651%
10652%    o y: the white y-point.
10653%
10654%    o z: the white z-point.
10655%
10656*/
10657WandExport MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand,
10658  const double x,const double y,const double z)
10659{
10660  assert(wand != (MagickWand *) NULL);
10661  assert(wand->signature == MagickWandSignature);
10662  if (wand->debug != MagickFalse)
10663    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10664  if (wand->images == (Image *) NULL)
10665    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10666  wand->images->chromaticity.white_point.x=x;
10667  wand->images->chromaticity.white_point.y=y;
10668  wand->images->chromaticity.white_point.z=z;
10669  return(MagickTrue);
10670}
10671
10672/*
10673%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10674%                                                                             %
10675%                                                                             %
10676%                                                                             %
10677%   M a g i c k S h a d e I m a g e C h a n n e l                             %
10678%                                                                             %
10679%                                                                             %
10680%                                                                             %
10681%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10682%
10683%  MagickShadeImage() shines a distant light on an image to create a
10684%  three-dimensional effect. You control the positioning of the light with
10685%  azimuth and elevation; azimuth is measured in degrees off the x axis
10686%  and elevation is measured in pixels above the Z axis.
10687%
10688%  The format of the MagickShadeImage method is:
10689%
10690%      MagickBooleanType MagickShadeImage(MagickWand *wand,
10691%        const MagickBooleanType gray,const double azimuth,
10692%        const double elevation)
10693%
10694%  A description of each parameter follows:
10695%
10696%    o wand: the magick wand.
10697%
10698%    o gray: A value other than zero shades the intensity of each pixel.
10699%
10700%    o azimuth, elevation:  Define the light source direction.
10701%
10702*/
10703WandExport MagickBooleanType MagickShadeImage(MagickWand *wand,
10704  const MagickBooleanType gray,const double asimuth,const double elevation)
10705{
10706  Image
10707    *shade_image;
10708
10709  assert(wand != (MagickWand *) NULL);
10710  assert(wand->signature == MagickWandSignature);
10711  if (wand->debug != MagickFalse)
10712    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10713  if (wand->images == (Image *) NULL)
10714    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10715  shade_image=ShadeImage(wand->images,gray,asimuth,elevation,wand->exception);
10716  if (shade_image == (Image *) NULL)
10717    return(MagickFalse);
10718  ReplaceImageInList(&wand->images,shade_image);
10719  return(MagickTrue);
10720}
10721
10722/*
10723%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10724%                                                                             %
10725%                                                                             %
10726%                                                                             %
10727%   M a g i c k S h a d o w I m a g e                                         %
10728%                                                                             %
10729%                                                                             %
10730%                                                                             %
10731%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10732%
10733%  MagickShadowImage() simulates an image shadow.
10734%
10735%  The format of the MagickShadowImage method is:
10736%
10737%      MagickBooleanType MagickShadowImage(MagickWand *wand,const double alpha,
10738%        const double sigma,const ssize_t x,const ssize_t y)
10739%
10740%  A description of each parameter follows:
10741%
10742%    o wand: the magick wand.
10743%
10744%    o alpha: percentage transparency.
10745%
10746%    o sigma: the standard deviation of the Gaussian, in pixels.
10747%
10748%    o x: the shadow x-offset.
10749%
10750%    o y: the shadow y-offset.
10751%
10752*/
10753WandExport MagickBooleanType MagickShadowImage(MagickWand *wand,
10754  const double alpha,const double sigma,const ssize_t x,const ssize_t y)
10755{
10756  Image
10757    *shadow_image;
10758
10759  assert(wand != (MagickWand *) NULL);
10760  assert(wand->signature == MagickWandSignature);
10761  if (wand->debug != MagickFalse)
10762    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10763  if (wand->images == (Image *) NULL)
10764    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10765  shadow_image=ShadowImage(wand->images,alpha,sigma,x,y,wand->exception);
10766  if (shadow_image == (Image *) NULL)
10767    return(MagickFalse);
10768  ReplaceImageInList(&wand->images,shadow_image);
10769  return(MagickTrue);
10770}
10771
10772/*
10773%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10774%                                                                             %
10775%                                                                             %
10776%                                                                             %
10777%   M a g i c k S h a r p e n I m a g e                                       %
10778%                                                                             %
10779%                                                                             %
10780%                                                                             %
10781%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10782%
10783%  MagickSharpenImage() sharpens an image.  We convolve the image with a
10784%  Gaussian operator of the given radius and standard deviation (sigma).
10785%  For reasonable results, the radius should be larger than sigma.  Use a
10786%  radius of 0 and MagickSharpenImage() selects a suitable radius for you.
10787%
10788%  The format of the MagickSharpenImage method is:
10789%
10790%      MagickBooleanType MagickSharpenImage(MagickWand *wand,
10791%        const double radius,const double sigma)
10792%
10793%  A description of each parameter follows:
10794%
10795%    o wand: the magick wand.
10796%
10797%    o radius: the radius of the Gaussian, in pixels, not counting the center
10798%      pixel.
10799%
10800%    o sigma: the standard deviation of the Gaussian, in pixels.
10801%
10802*/
10803WandExport MagickBooleanType MagickSharpenImage(MagickWand *wand,
10804  const double radius,const double sigma)
10805{
10806  Image
10807    *sharp_image;
10808
10809  assert(wand != (MagickWand *) NULL);
10810  assert(wand->signature == MagickWandSignature);
10811  if (wand->debug != MagickFalse)
10812    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10813  if (wand->images == (Image *) NULL)
10814    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10815  sharp_image=SharpenImage(wand->images,radius,sigma,wand->exception);
10816  if (sharp_image == (Image *) NULL)
10817    return(MagickFalse);
10818  ReplaceImageInList(&wand->images,sharp_image);
10819  return(MagickTrue);
10820}
10821
10822/*
10823%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10824%                                                                             %
10825%                                                                             %
10826%                                                                             %
10827%   M a g i c k S h a v e I m a g e                                           %
10828%                                                                             %
10829%                                                                             %
10830%                                                                             %
10831%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10832%
10833%  MagickShaveImage() shaves pixels from the image edges.  It allocates the
10834%  memory necessary for the new Image structure and returns a pointer to the
10835%  new image.
10836%
10837%  The format of the MagickShaveImage method is:
10838%
10839%      MagickBooleanType MagickShaveImage(MagickWand *wand,
10840%        const size_t columns,const size_t rows)
10841%
10842%  A description of each parameter follows:
10843%
10844%    o wand: the magick wand.
10845%
10846%    o columns: the number of columns in the scaled image.
10847%
10848%    o rows: the number of rows in the scaled image.
10849%
10850%
10851*/
10852WandExport MagickBooleanType MagickShaveImage(MagickWand *wand,
10853  const size_t columns,const size_t rows)
10854{
10855  Image
10856    *shave_image;
10857
10858  RectangleInfo
10859    shave_info;
10860
10861  assert(wand != (MagickWand *) NULL);
10862  assert(wand->signature == MagickWandSignature);
10863  if (wand->debug != MagickFalse)
10864    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10865  if (wand->images == (Image *) NULL)
10866    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10867  shave_info.width=columns;
10868  shave_info.height=rows;
10869  shave_info.x=0;
10870  shave_info.y=0;
10871  shave_image=ShaveImage(wand->images,&shave_info,wand->exception);
10872  if (shave_image == (Image *) NULL)
10873    return(MagickFalse);
10874  ReplaceImageInList(&wand->images,shave_image);
10875  return(MagickTrue);
10876}
10877
10878/*
10879%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10880%                                                                             %
10881%                                                                             %
10882%                                                                             %
10883%   M a g i c k S h e a r I m a g e                                           %
10884%                                                                             %
10885%                                                                             %
10886%                                                                             %
10887%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10888%
10889%  MagickShearImage() slides one edge of an image along the X or Y axis,
10890%  creating a parallelogram.  An X direction shear slides an edge along the X
10891%  axis, while a Y direction shear slides an edge along the Y axis.  The amount
10892%  of the shear is controlled by a shear angle.  For X direction shears, x_shear
10893%  is measured relative to the Y axis, and similarly, for Y direction shears
10894%  y_shear is measured relative to the X axis.  Empty triangles left over from
10895%  shearing the image are filled with the background color.
10896%
10897%  The format of the MagickShearImage method is:
10898%
10899%      MagickBooleanType MagickShearImage(MagickWand *wand,
10900%        const PixelWand *background,const double x_shear,const double y_shear)
10901%
10902%  A description of each parameter follows:
10903%
10904%    o wand: the magick wand.
10905%
10906%    o background: the background pixel wand.
10907%
10908%    o x_shear: the number of degrees to shear the image.
10909%
10910%    o y_shear: the number of degrees to shear the image.
10911%
10912*/
10913WandExport MagickBooleanType MagickShearImage(MagickWand *wand,
10914  const PixelWand *background,const double x_shear,const double y_shear)
10915{
10916  Image
10917    *shear_image;
10918
10919  assert(wand != (MagickWand *) NULL);
10920  assert(wand->signature == MagickWandSignature);
10921  if (wand->debug != MagickFalse)
10922    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10923  if (wand->images == (Image *) NULL)
10924    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10925  PixelGetQuantumPacket(background,&wand->images->background_color);
10926  shear_image=ShearImage(wand->images,x_shear,y_shear,wand->exception);
10927  if (shear_image == (Image *) NULL)
10928    return(MagickFalse);
10929  ReplaceImageInList(&wand->images,shear_image);
10930  return(MagickTrue);
10931}
10932
10933/*
10934%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10935%                                                                             %
10936%                                                                             %
10937%                                                                             %
10938%   M a g i c k S i g m o i d a l C o n t r a s t I m a g e                   %
10939%                                                                             %
10940%                                                                             %
10941%                                                                             %
10942%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10943%
10944%  MagickSigmoidalContrastImage() adjusts the contrast of an image with a
10945%  non-linear sigmoidal contrast algorithm.  Increase the contrast of the
10946%  image using a sigmoidal transfer function without saturating highlights or
10947%  shadows.  Contrast indicates how much to increase the contrast (0 is none;
10948%  3 is typical; 20 is pushing it); mid-point indicates where midtones fall in
10949%  the resultant image (0 is white; 50% is middle-gray; 100% is black).  Set
10950%  sharpen to MagickTrue to increase the image contrast otherwise the contrast
10951%  is reduced.
10952%
10953%  The format of the MagickSigmoidalContrastImage method is:
10954%
10955%      MagickBooleanType MagickSigmoidalContrastImage(MagickWand *wand,
10956%        const MagickBooleanType sharpen,const double alpha,const double beta)
10957%
10958%  A description of each parameter follows:
10959%
10960%    o wand: the magick wand.
10961%
10962%    o sharpen: Increase or decrease image contrast.
10963%
10964%    o alpha: strength of the contrast, the larger the number the more
10965%      'threshold-like' it becomes.
10966%
10967%    o beta: midpoint of the function as a color value 0 to QuantumRange.
10968%
10969*/
10970WandExport MagickBooleanType MagickSigmoidalContrastImage(
10971  MagickWand *wand,const MagickBooleanType sharpen,const double alpha,
10972  const double beta)
10973{
10974  MagickBooleanType
10975    status;
10976
10977  assert(wand != (MagickWand *) NULL);
10978  assert(wand->signature == MagickWandSignature);
10979  if (wand->debug != MagickFalse)
10980    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10981  if (wand->images == (Image *) NULL)
10982    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10983  status=SigmoidalContrastImage(wand->images,sharpen,alpha,beta,
10984    wand->exception);
10985  return(status);
10986}
10987
10988/*
10989%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10990%                                                                             %
10991%                                                                             %
10992%                                                                             %
10993%   M a g i c k S i m i l a r i t y I m a g e                                 %
10994%                                                                             %
10995%                                                                             %
10996%                                                                             %
10997%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10998%
10999%  MagickSimilarityImage() compares the reference image of the image and
11000%  returns the best match offset.  In addition, it returns a similarity image
11001%  such that an exact match location is completely white and if none of the
11002%  pixels match, black, otherwise some gray level in-between.
11003%
11004%  The format of the MagickSimilarityImage method is:
11005%
11006%      MagickWand *MagickSimilarityImage(MagickWand *wand,
11007%        const MagickWand *reference,const MetricType metric,
11008%        const double similarity_threshold,RectangeInfo *offset,
11009%        double *similarity)
11010%
11011%  A description of each parameter follows:
11012%
11013%    o wand: the magick wand.
11014%
11015%    o reference: the reference wand.
11016%
11017%    o metric: the metric.
11018%
11019%    o similarity_threshold: minimum distortion for (sub)image match.
11020%
11021%    o offset: the best match offset of the reference image within the image.
11022%
11023%    o similarity: the computed similarity between the images.
11024%
11025*/
11026WandExport MagickWand *MagickSimilarityImage(MagickWand *wand,
11027  const MagickWand *reference,const MetricType metric,
11028  const double similarity_threshold,RectangleInfo *offset,double *similarity)
11029{
11030  Image
11031    *similarity_image;
11032
11033  assert(wand != (MagickWand *) NULL);
11034  assert(wand->signature == MagickWandSignature);
11035  if (wand->debug != MagickFalse)
11036    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11037  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
11038    {
11039      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11040        "ContainsNoImages","`%s'",wand->name);
11041      return((MagickWand *) NULL);
11042    }
11043  similarity_image=SimilarityImage(wand->images,reference->images,metric,
11044    similarity_threshold,offset,similarity,wand->exception);
11045  if (similarity_image == (Image *) NULL)
11046    return((MagickWand *) NULL);
11047  return(CloneMagickWandFromImages(wand,similarity_image));
11048}
11049
11050/*
11051%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11052%                                                                             %
11053%                                                                             %
11054%                                                                             %
11055%   M a g i c k S k e t c h I m a g e                                         %
11056%                                                                             %
11057%                                                                             %
11058%                                                                             %
11059%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11060%
11061%  MagickSketchImage() simulates a pencil sketch.  We convolve the image with
11062%  a Gaussian operator of the given radius and standard deviation (sigma).
11063%  For reasonable results, radius should be larger than sigma.  Use a
11064%  radius of 0 and SketchImage() selects a suitable radius for you.
11065%  Angle gives the angle of the blurring motion.
11066%
11067%  The format of the MagickSketchImage method is:
11068%
11069%      MagickBooleanType MagickSketchImage(MagickWand *wand,
11070%        const double radius,const double sigma,const double angle)
11071%
11072%  A description of each parameter follows:
11073%
11074%    o wand: the magick wand.
11075%
11076%    o radius: the radius of the Gaussian, in pixels, not counting
11077%      the center pixel.
11078%
11079%    o sigma: the standard deviation of the Gaussian, in pixels.
11080%
11081%    o angle: apply the effect along this angle.
11082%
11083*/
11084WandExport MagickBooleanType MagickSketchImage(MagickWand *wand,
11085  const double radius,const double sigma,const double angle)
11086{
11087  Image
11088    *sketch_image;
11089
11090  assert(wand != (MagickWand *) NULL);
11091  assert(wand->signature == MagickWandSignature);
11092  if (wand->debug != MagickFalse)
11093    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11094  if (wand->images == (Image *) NULL)
11095    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11096  sketch_image=SketchImage(wand->images,radius,sigma,angle,wand->exception);
11097  if (sketch_image == (Image *) NULL)
11098    return(MagickFalse);
11099  ReplaceImageInList(&wand->images,sketch_image);
11100  return(MagickTrue);
11101}
11102
11103/*
11104%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11105%                                                                             %
11106%                                                                             %
11107%                                                                             %
11108%   M a g i c k S m u s h I m a g e s                                         %
11109%                                                                             %
11110%                                                                             %
11111%                                                                             %
11112%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11113%
11114%  MagickSmushImages() takes all images from the current image pointer to the
11115%  end of the image list and smushs them to each other top-to-bottom if the
11116%  stack parameter is true, otherwise left-to-right.
11117%
11118%  The format of the MagickSmushImages method is:
11119%
11120%      MagickWand *MagickSmushImages(MagickWand *wand,
11121%        const MagickBooleanType stack,const ssize_t offset)
11122%
11123%  A description of each parameter follows:
11124%
11125%    o wand: the magick wand.
11126%
11127%    o stack: By default, images are stacked left-to-right. Set stack to
11128%      MagickTrue to stack them top-to-bottom.
11129%
11130%    o offset: minimum distance in pixels between images.
11131%
11132*/
11133WandExport MagickWand *MagickSmushImages(MagickWand *wand,
11134  const MagickBooleanType stack,const ssize_t offset)
11135{
11136  Image
11137    *smush_image;
11138
11139  assert(wand != (MagickWand *) NULL);
11140  assert(wand->signature == MagickWandSignature);
11141  if (wand->debug != MagickFalse)
11142    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11143  if (wand->images == (Image *) NULL)
11144    return((MagickWand *) NULL);
11145  smush_image=SmushImages(wand->images,stack,offset,wand->exception);
11146  if (smush_image == (Image *) NULL)
11147    return((MagickWand *) NULL);
11148  return(CloneMagickWandFromImages(wand,smush_image));
11149}
11150
11151/*
11152%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11153%                                                                             %
11154%                                                                             %
11155%                                                                             %
11156%     M a g i c k S o l a r i z e I m a g e                                   %
11157%                                                                             %
11158%                                                                             %
11159%                                                                             %
11160%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11161%
11162%  MagickSolarizeImage() applies a special effect to the image, similar to the
11163%  effect achieved in a photo darkroom by selectively exposing areas of photo
11164%  sensitive paper to light.  Threshold ranges from 0 to QuantumRange and is a
11165%  measure of the extent of the solarization.
11166%
11167%  The format of the MagickSolarizeImage method is:
11168%
11169%      MagickBooleanType MagickSolarizeImage(MagickWand *wand,
11170%        const double threshold)
11171%
11172%  A description of each parameter follows:
11173%
11174%    o wand: the magick wand.
11175%
11176%    o threshold:  Define the extent of the solarization.
11177%
11178*/
11179WandExport MagickBooleanType MagickSolarizeImage(MagickWand *wand,
11180  const double threshold)
11181{
11182  MagickBooleanType
11183    status;
11184
11185  assert(wand != (MagickWand *) NULL);
11186  assert(wand->signature == MagickWandSignature);
11187  if (wand->debug != MagickFalse)
11188    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11189  if (wand->images == (Image *) NULL)
11190    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11191  status=SolarizeImage(wand->images,threshold,wand->exception);
11192  return(status);
11193}
11194
11195/*
11196%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11197%                                                                             %
11198%                                                                             %
11199%                                                                             %
11200%   M a g i c k S p a r s e C o l o r I m a g e                               %
11201%                                                                             %
11202%                                                                             %
11203%                                                                             %
11204%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11205%
11206%  MagickSparseColorImage(), given a set of coordinates, interpolates the
11207%  colors found at those coordinates, across the whole image, using various
11208%  methods.
11209%
11210%  The format of the MagickSparseColorImage method is:
11211%
11212%      MagickBooleanType MagickSparseColorImage(MagickWand *wand,
11213%        const SparseColorMethod method,const size_t number_arguments,
11214%        const double *arguments)
11215%
11216%  A description of each parameter follows:
11217%
11218%    o image: the image to be sparseed.
11219%
11220%    o method: the method of image sparseion.
11221%
11222%        ArcSparseColorion will always ignore source image offset, and always
11223%        'bestfit' the destination image with the top left corner offset
11224%        relative to the polar mapping center.
11225%
11226%        Bilinear has no simple inverse mapping so will not allow 'bestfit'
11227%        style of image sparseion.
11228%
11229%        Affine, Perspective, and Bilinear, will do least squares fitting of
11230%        the distrotion when more than the minimum number of control point
11231%        pairs are provided.
11232%
11233%        Perspective, and Bilinear, will fall back to a Affine sparseion when
11234%        less than 4 control point pairs are provided. While Affine sparseions
11235%        will let you use any number of control point pairs, that is Zero pairs
11236%        is a No-Op (viewport only) distrotion, one pair is a translation and
11237%        two pairs of control points will do a scale-rotate-translate, without
11238%        any shearing.
11239%
11240%    o number_arguments: the number of arguments given for this sparseion
11241%      method.
11242%
11243%    o arguments: the arguments for this sparseion method.
11244%
11245*/
11246WandExport MagickBooleanType MagickSparseColorImage(MagickWand *wand,
11247  const SparseColorMethod method,const size_t number_arguments,
11248  const double *arguments)
11249{
11250  Image
11251    *sparse_image;
11252
11253  assert(wand != (MagickWand *) NULL);
11254  assert(wand->signature == MagickWandSignature);
11255  if (wand->debug != MagickFalse)
11256    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11257  if (wand->images == (Image *) NULL)
11258    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11259  sparse_image=SparseColorImage(wand->images,method,number_arguments,arguments,
11260    wand->exception);
11261  if (sparse_image == (Image *) NULL)
11262    return(MagickFalse);
11263  ReplaceImageInList(&wand->images,sparse_image);
11264  return(MagickTrue);
11265}
11266
11267/*
11268%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11269%                                                                             %
11270%                                                                             %
11271%                                                                             %
11272%   M a g i c k S p l i c e I m a g e                                         %
11273%                                                                             %
11274%                                                                             %
11275%                                                                             %
11276%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11277%
11278%  MagickSpliceImage() splices a solid color into the image.
11279%
11280%  The format of the MagickSpliceImage method is:
11281%
11282%      MagickBooleanType MagickSpliceImage(MagickWand *wand,
11283%        const size_t width,const size_t height,const ssize_t x,
11284%        const ssize_t y)
11285%
11286%  A description of each parameter follows:
11287%
11288%    o wand: the magick wand.
11289%
11290%    o width: the region width.
11291%
11292%    o height: the region height.
11293%
11294%    o x: the region x offset.
11295%
11296%    o y: the region y offset.
11297%
11298*/
11299WandExport MagickBooleanType MagickSpliceImage(MagickWand *wand,
11300  const size_t width,const size_t height,const ssize_t x,
11301  const ssize_t y)
11302{
11303  Image
11304    *splice_image;
11305
11306  RectangleInfo
11307    splice;
11308
11309  assert(wand != (MagickWand *) NULL);
11310  assert(wand->signature == MagickWandSignature);
11311  if (wand->debug != MagickFalse)
11312    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11313  if (wand->images == (Image *) NULL)
11314    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11315  splice.width=width;
11316  splice.height=height;
11317  splice.x=x;
11318  splice.y=y;
11319  splice_image=SpliceImage(wand->images,&splice,wand->exception);
11320  if (splice_image == (Image *) NULL)
11321    return(MagickFalse);
11322  ReplaceImageInList(&wand->images,splice_image);
11323  return(MagickTrue);
11324}
11325
11326/*
11327%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11328%                                                                             %
11329%                                                                             %
11330%                                                                             %
11331%   M a g i c k S p r e a d I m a g e                                         %
11332%                                                                             %
11333%                                                                             %
11334%                                                                             %
11335%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11336%
11337%  MagickSpreadImage() is a special effects method that randomly displaces each
11338%  pixel in a block defined by the radius parameter.
11339%
11340%  The format of the MagickSpreadImage method is:
11341%
11342%      MagickBooleanType MagickSpreadImage(MagickWand *wand,
11343%        const PixelInterpolateMethod method,const double radius)
11344%
11345%  A description of each parameter follows:
11346%
11347%    o wand: the magick wand.
11348%
11349%    o method:  intepolation method.
11350%
11351%    o radius:  Choose a random pixel in a neighborhood of this extent.
11352%
11353*/
11354WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand,
11355  const PixelInterpolateMethod method,const double radius)
11356{
11357  Image
11358    *spread_image;
11359
11360  assert(wand != (MagickWand *) NULL);
11361  assert(wand->signature == MagickWandSignature);
11362  if (wand->debug != MagickFalse)
11363    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11364  if (wand->images == (Image *) NULL)
11365    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11366  spread_image=SpreadImage(wand->images,method,radius,wand->exception);
11367  if (spread_image == (Image *) NULL)
11368    return(MagickFalse);
11369  ReplaceImageInList(&wand->images,spread_image);
11370  return(MagickTrue);
11371}
11372
11373/*
11374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11375%                                                                             %
11376%                                                                             %
11377%                                                                             %
11378%   M a g i c k S t a t i s t i c I m a g e                                   %
11379%                                                                             %
11380%                                                                             %
11381%                                                                             %
11382%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11383%
11384%  MagickStatisticImage() replace each pixel with corresponding statistic from
11385%  the neighborhood of the specified width and height.
11386%
11387%  The format of the MagickStatisticImage method is:
11388%
11389%      MagickBooleanType MagickStatisticImage(MagickWand *wand,
11390%        const StatisticType type,const double width,const size_t height)
11391%
11392%  A description of each parameter follows:
11393%
11394%    o wand: the magick wand.
11395%
11396%    o type: the statistic type (e.g. median, mode, etc.).
11397%
11398%    o width: the width of the pixel neighborhood.
11399%
11400%    o height: the height of the pixel neighborhood.
11401%
11402*/
11403WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand,
11404  const StatisticType type,const size_t width,const size_t height)
11405{
11406  Image
11407    *statistic_image;
11408
11409  assert(wand != (MagickWand *) NULL);
11410  assert(wand->signature == MagickWandSignature);
11411  if (wand->debug != MagickFalse)
11412    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11413  if (wand->images == (Image *) NULL)
11414    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11415  statistic_image=StatisticImage(wand->images,type,width,height,
11416    wand->exception);
11417  if (statistic_image == (Image *) NULL)
11418    return(MagickFalse);
11419  ReplaceImageInList(&wand->images,statistic_image);
11420  return(MagickTrue);
11421}
11422
11423/*
11424%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11425%                                                                             %
11426%                                                                             %
11427%                                                                             %
11428%   M a g i c k S t e g a n o I m a g e                                       %
11429%                                                                             %
11430%                                                                             %
11431%                                                                             %
11432%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11433%
11434%  MagickSteganoImage() hides a digital watermark within the image.
11435%  Recover the hidden watermark later to prove that the authenticity of
11436%  an image.  Offset defines the start position within the image to hide
11437%  the watermark.
11438%
11439%  The format of the MagickSteganoImage method is:
11440%
11441%      MagickWand *MagickSteganoImage(MagickWand *wand,
11442%        const MagickWand *watermark_wand,const ssize_t offset)
11443%
11444%  A description of each parameter follows:
11445%
11446%    o wand: the magick wand.
11447%
11448%    o watermark_wand: the watermark wand.
11449%
11450%    o offset: Start hiding at this offset into the image.
11451%
11452*/
11453WandExport MagickWand *MagickSteganoImage(MagickWand *wand,
11454  const MagickWand *watermark_wand,const ssize_t offset)
11455{
11456  Image
11457    *stegano_image;
11458
11459  assert(wand != (MagickWand *) NULL);
11460  assert(wand->signature == MagickWandSignature);
11461  if (wand->debug != MagickFalse)
11462    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11463  if ((wand->images == (Image *) NULL) ||
11464      (watermark_wand->images == (Image *) NULL))
11465    {
11466      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11467        "ContainsNoImages","`%s'",wand->name);
11468      return((MagickWand *) NULL);
11469    }
11470  wand->images->offset=offset;
11471  stegano_image=SteganoImage(wand->images,watermark_wand->images,
11472    wand->exception);
11473  if (stegano_image == (Image *) NULL)
11474    return((MagickWand *) NULL);
11475  return(CloneMagickWandFromImages(wand,stegano_image));
11476}
11477
11478/*
11479%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11480%                                                                             %
11481%                                                                             %
11482%                                                                             %
11483%   M a g i c k S t e r e o I m a g e                                         %
11484%                                                                             %
11485%                                                                             %
11486%                                                                             %
11487%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11488%
11489%  MagickStereoImage() composites two images and produces a single image that
11490%  is the composite of a left and right image of a stereo pair
11491%
11492%  The format of the MagickStereoImage method is:
11493%
11494%      MagickWand *MagickStereoImage(MagickWand *wand,
11495%        const MagickWand *offset_wand)
11496%
11497%  A description of each parameter follows:
11498%
11499%    o wand: the magick wand.
11500%
11501%    o offset_wand: Another image wand.
11502%
11503*/
11504WandExport MagickWand *MagickStereoImage(MagickWand *wand,
11505  const MagickWand *offset_wand)
11506{
11507  Image
11508    *stereo_image;
11509
11510  assert(wand != (MagickWand *) NULL);
11511  assert(wand->signature == MagickWandSignature);
11512  if (wand->debug != MagickFalse)
11513    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11514  if ((wand->images == (Image *) NULL) ||
11515      (offset_wand->images == (Image *) NULL))
11516    {
11517      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11518        "ContainsNoImages","`%s'",wand->name);
11519      return((MagickWand *) NULL);
11520    }
11521  stereo_image=StereoImage(wand->images,offset_wand->images,wand->exception);
11522  if (stereo_image == (Image *) NULL)
11523    return((MagickWand *) NULL);
11524  return(CloneMagickWandFromImages(wand,stereo_image));
11525}
11526
11527/*
11528%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11529%                                                                             %
11530%                                                                             %
11531%                                                                             %
11532%   M a g i c k S t r i p I m a g e                                           %
11533%                                                                             %
11534%                                                                             %
11535%                                                                             %
11536%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11537%
11538%  MagickStripImage() strips an image of all profiles and comments.
11539%
11540%  The format of the MagickStripImage method is:
11541%
11542%      MagickBooleanType MagickStripImage(MagickWand *wand)
11543%
11544%  A description of each parameter follows:
11545%
11546%    o wand: the magick wand.
11547%
11548*/
11549WandExport MagickBooleanType MagickStripImage(MagickWand *wand)
11550{
11551  assert(wand != (MagickWand *) NULL);
11552  assert(wand->signature == MagickWandSignature);
11553  if (wand->debug != MagickFalse)
11554    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11555  if (wand->images == (Image *) NULL)
11556    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11557  return(StripImage(wand->images,wand->exception));
11558}
11559
11560/*
11561%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11562%                                                                             %
11563%                                                                             %
11564%                                                                             %
11565%   M a g i c k S w i r l I m a g e                                           %
11566%                                                                             %
11567%                                                                             %
11568%                                                                             %
11569%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11570%
11571%  MagickSwirlImage() swirls the pixels about the center of the image, where
11572%  degrees indicates the sweep of the arc through which each pixel is moved.
11573%  You get a more dramatic effect as the degrees move from 1 to 360.
11574%
11575%  The format of the MagickSwirlImage method is:
11576%
11577%      MagickBooleanType MagickSwirlImage(MagickWand *wand,const double degrees,
11578%        const PixelInterpolateMethod method)
11579%
11580%  A description of each parameter follows:
11581%
11582%    o wand: the magick wand.
11583%
11584%    o degrees: Define the tightness of the swirling effect.
11585%
11586%    o method: the pixel interpolation method.
11587%
11588*/
11589WandExport MagickBooleanType MagickSwirlImage(MagickWand *wand,
11590  const double degrees,const PixelInterpolateMethod method)
11591{
11592  Image
11593    *swirl_image;
11594
11595  assert(wand != (MagickWand *) NULL);
11596  assert(wand->signature == MagickWandSignature);
11597  if (wand->debug != MagickFalse)
11598    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11599  if (wand->images == (Image *) NULL)
11600    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11601  swirl_image=SwirlImage(wand->images,degrees,method,wand->exception);
11602  if (swirl_image == (Image *) NULL)
11603    return(MagickFalse);
11604  ReplaceImageInList(&wand->images,swirl_image);
11605  return(MagickTrue);
11606}
11607
11608/*
11609%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11610%                                                                             %
11611%                                                                             %
11612%                                                                             %
11613%   M a g i c k T e x t u r e I m a g e                                       %
11614%                                                                             %
11615%                                                                             %
11616%                                                                             %
11617%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11618%
11619%  MagickTextureImage() repeatedly tiles the texture image across and down the
11620%  image canvas.
11621%
11622%  The format of the MagickTextureImage method is:
11623%
11624%      MagickWand *MagickTextureImage(MagickWand *wand,
11625%        const MagickWand *texture_wand)
11626%
11627%  A description of each parameter follows:
11628%
11629%    o wand: the magick wand.
11630%
11631%    o texture_wand: the texture wand
11632%
11633*/
11634WandExport MagickWand *MagickTextureImage(MagickWand *wand,
11635  const MagickWand *texture_wand)
11636{
11637  Image
11638    *texture_image;
11639
11640  MagickBooleanType
11641    status;
11642
11643  assert(wand != (MagickWand *) NULL);
11644  assert(wand->signature == MagickWandSignature);
11645  if (wand->debug != MagickFalse)
11646    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11647  if ((wand->images == (Image *) NULL) ||
11648      (texture_wand->images == (Image *) NULL))
11649    {
11650      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11651        "ContainsNoImages","`%s'",wand->name);
11652      return((MagickWand *) NULL);
11653    }
11654  texture_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
11655  if (texture_image == (Image *) NULL)
11656    return((MagickWand *) NULL);
11657  status=TextureImage(texture_image,texture_wand->images,wand->exception);
11658  if (status == MagickFalse)
11659    {
11660      texture_image=DestroyImage(texture_image);
11661      return((MagickWand *) NULL);
11662    }
11663  return(CloneMagickWandFromImages(wand,texture_image));
11664}
11665
11666/*
11667%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11668%                                                                             %
11669%                                                                             %
11670%                                                                             %
11671%   M a g i c k T h r e s h o l d I m a g e                                   %
11672%                                                                             %
11673%                                                                             %
11674%                                                                             %
11675%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11676%
11677%  MagickThresholdImage() changes the value of individual pixels based on
11678%  the intensity of each pixel compared to threshold.  The result is a
11679%  high-contrast, two color image.
11680%
11681%  The format of the MagickThresholdImage method is:
11682%
11683%      MagickBooleanType MagickThresholdImage(MagickWand *wand,
11684%        const double threshold)
11685%      MagickBooleanType MagickThresholdImageChannel(MagickWand *wand,
11686%        const ChannelType channel,const double threshold)
11687%
11688%  A description of each parameter follows:
11689%
11690%    o wand: the magick wand.
11691%
11692%    o channel: the image channel(s).
11693%
11694%    o threshold: Define the threshold value.
11695%
11696*/
11697WandExport MagickBooleanType MagickThresholdImage(MagickWand *wand,
11698  const double threshold)
11699{
11700  MagickBooleanType
11701    status;
11702
11703  status=MagickThresholdImageChannel(wand,DefaultChannels,threshold);
11704  return(status);
11705}
11706
11707WandExport MagickBooleanType MagickThresholdImageChannel(MagickWand *wand,
11708  const ChannelType channel,const double threshold)
11709{
11710  MagickBooleanType
11711    status;
11712
11713  assert(wand != (MagickWand *) NULL);
11714  assert(wand->signature == MagickWandSignature);
11715  if (wand->debug != MagickFalse)
11716    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11717  if (wand->images == (Image *) NULL)
11718    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11719  status=BilevelImage(wand->images,threshold,wand->exception);
11720  return(status);
11721}
11722
11723/*
11724%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11725%                                                                             %
11726%                                                                             %
11727%                                                                             %
11728%   M a g i c k T h u m b n a i l I m a g e                                   %
11729%                                                                             %
11730%                                                                             %
11731%                                                                             %
11732%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11733%
11734%  MagickThumbnailImage()  changes the size of an image to the given dimensions
11735%  and removes any associated profiles.  The goal is to produce small low cost
11736%  thumbnail images suited for display on the Web.
11737%
11738%  The format of the MagickThumbnailImage method is:
11739%
11740%      MagickBooleanType MagickThumbnailImage(MagickWand *wand,
11741%        const size_t columns,const size_t rows)
11742%
11743%  A description of each parameter follows:
11744%
11745%    o wand: the magick wand.
11746%
11747%    o columns: the number of columns in the scaled image.
11748%
11749%    o rows: the number of rows in the scaled image.
11750%
11751*/
11752WandExport MagickBooleanType MagickThumbnailImage(MagickWand *wand,
11753  const size_t columns,const size_t rows)
11754{
11755  Image
11756    *thumbnail_image;
11757
11758  assert(wand != (MagickWand *) NULL);
11759  assert(wand->signature == MagickWandSignature);
11760  if (wand->debug != MagickFalse)
11761    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11762  if (wand->images == (Image *) NULL)
11763    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11764  thumbnail_image=ThumbnailImage(wand->images,columns,rows,wand->exception);
11765  if (thumbnail_image == (Image *) NULL)
11766    return(MagickFalse);
11767  ReplaceImageInList(&wand->images,thumbnail_image);
11768  return(MagickTrue);
11769}
11770
11771/*
11772%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11773%                                                                             %
11774%                                                                             %
11775%                                                                             %
11776%   M a g i c k T i n t I m a g e                                             %
11777%                                                                             %
11778%                                                                             %
11779%                                                                             %
11780%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11781%
11782%  MagickTintImage() applies a color vector to each pixel in the image.  The
11783%  length of the vector is 0 for black and white and at its maximum for the
11784%  midtones.  The vector weighting function is
11785%  f(x)=(1-(4.0*((x-0.5)*(x-0.5)))).
11786%
11787%  The format of the MagickTintImage method is:
11788%
11789%      MagickBooleanType MagickTintImage(MagickWand *wand,
11790%        const PixelWand *tint,const PixelWand *blend)
11791%
11792%  A description of each parameter follows:
11793%
11794%    o wand: the magick wand.
11795%
11796%    o tint: the tint pixel wand.
11797%
11798%    o alpha: the alpha pixel wand.
11799%
11800*/
11801WandExport MagickBooleanType MagickTintImage(MagickWand *wand,
11802  const PixelWand *tint,const PixelWand *blend)
11803{
11804  char
11805    percent_blend[MagickPathExtent];
11806
11807  Image
11808    *tint_image;
11809
11810  PixelInfo
11811    target;
11812
11813  assert(wand != (MagickWand *) NULL);
11814  assert(wand->signature == MagickWandSignature);
11815  if (wand->debug != MagickFalse)
11816    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11817  if (wand->images == (Image *) NULL)
11818    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11819  if (wand->images->colorspace != CMYKColorspace)
11820    (void) FormatLocaleString(percent_blend,MagickPathExtent,
11821      "%g,%g,%g,%g",(double) (100.0*QuantumScale*
11822      PixelGetRedQuantum(blend)),(double) (100.0*QuantumScale*
11823      PixelGetGreenQuantum(blend)),(double) (100.0*QuantumScale*
11824      PixelGetBlueQuantum(blend)),(double) (100.0*QuantumScale*
11825      PixelGetAlphaQuantum(blend)));
11826  else
11827    (void) FormatLocaleString(percent_blend,MagickPathExtent,
11828      "%g,%g,%g,%g,%g",(double) (100.0*QuantumScale*
11829      PixelGetCyanQuantum(blend)),(double) (100.0*QuantumScale*
11830      PixelGetMagentaQuantum(blend)),(double) (100.0*QuantumScale*
11831      PixelGetYellowQuantum(blend)),(double) (100.0*QuantumScale*
11832      PixelGetBlackQuantum(blend)),(double) (100.0*QuantumScale*
11833      PixelGetAlphaQuantum(blend)));
11834  target=PixelGetPixel(tint);
11835  tint_image=TintImage(wand->images,percent_blend,&target,wand->exception);
11836  if (tint_image == (Image *) NULL)
11837    return(MagickFalse);
11838  ReplaceImageInList(&wand->images,tint_image);
11839  return(MagickTrue);
11840}
11841
11842/*
11843%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11844%                                                                             %
11845%                                                                             %
11846%                                                                             %
11847%   M a g i c k T r a n s f o r m I m a g e                                   %
11848%                                                                             %
11849%                                                                             %
11850%                                                                             %
11851%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11852%
11853%  MagickTransformImage() is a convenience method that behaves like
11854%  MagickResizeImage() or MagickCropImage() but accepts scaling and/or cropping
11855%  information as a region geometry specification.  If the operation fails,
11856%  a NULL image handle is returned.
11857%
11858%  The format of the MagickTransformImage method is:
11859%
11860%      MagickWand *MagickTransformImage(MagickWand *wand,const char *crop,
11861%        const char *geometry)
11862%
11863%  A description of each parameter follows:
11864%
11865%    o wand: the magick wand.
11866%
11867%    o crop: A crop geometry string.  This geometry defines a subregion of the
11868%      image to crop.
11869%
11870%    o geometry: An image geometry string.  This geometry defines the final
11871%      size of the image.
11872%
11873*/
11874WandExport MagickWand *MagickTransformImage(MagickWand *wand,
11875  const char *crop,const char *geometry)
11876{
11877  Image
11878    *transform_image;
11879
11880  MagickBooleanType
11881    status;
11882
11883  assert(wand != (MagickWand *) NULL);
11884  assert(wand->signature == MagickWandSignature);
11885  if (wand->debug != MagickFalse)
11886    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11887  if (wand->images == (Image *) NULL)
11888    return((MagickWand *) NULL);
11889  transform_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
11890  if (transform_image == (Image *) NULL)
11891    return((MagickWand *) NULL);
11892  status=TransformImage(&transform_image,crop,geometry,wand->exception);
11893  if (status == MagickFalse)
11894    {
11895      transform_image=DestroyImage(transform_image);
11896      return((MagickWand *) NULL);
11897    }
11898  return(CloneMagickWandFromImages(wand,transform_image));
11899}
11900
11901/*
11902%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11903%                                                                             %
11904%                                                                             %
11905%                                                                             %
11906%   M a g i c k T r a n s f o r m I m a g e C o l o r s p a c e               %
11907%                                                                             %
11908%                                                                             %
11909%                                                                             %
11910%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11911%
11912%  MagickTransformImageColorspace() transform the image colorspace, setting
11913%  the images colorspace while transforming the images data to that
11914%  colorspace.
11915%
11916%  The format of the MagickTransformImageColorspace method is:
11917%
11918%      MagickBooleanType MagickTransformImageColorspace(MagickWand *wand,
11919%        const ColorspaceType colorspace)
11920%
11921%  A description of each parameter follows:
11922%
11923%    o wand: the magick wand.
11924%
11925%    o colorspace: the image colorspace:   UndefinedColorspace,
11926%      sRGBColorspace, RGBColorspace, GRAYColorspace,
11927%      OHTAColorspace, XYZColorspace, YCbCrColorspace,
11928%      YCCColorspace, YIQColorspace, YPbPrColorspace,
11929%      YPbPrColorspace, YUVColorspace, CMYKColorspace,
11930%      HSLColorspace, HWBColorspace.
11931%
11932*/
11933WandExport MagickBooleanType MagickTransformImageColorspace(MagickWand *wand,
11934  const ColorspaceType colorspace)
11935{
11936  assert(wand != (MagickWand *) NULL);
11937  assert(wand->signature == MagickWandSignature);
11938  if (wand->debug != MagickFalse)
11939    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11940  if (wand->images == (Image *) NULL)
11941    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11942  return(TransformImageColorspace(wand->images,colorspace,wand->exception));
11943}
11944
11945/*
11946%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11947%                                                                             %
11948%                                                                             %
11949%                                                                             %
11950%   M a g i c k T r a n s p a r e n t P a i n t I m a g e                     %
11951%                                                                             %
11952%                                                                             %
11953%                                                                             %
11954%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11955%
11956%  MagickTransparentPaintImage() changes any pixel that matches color with the
11957%  color defined by fill.
11958%
11959%  The format of the MagickTransparentPaintImage method is:
11960%
11961%      MagickBooleanType MagickTransparentPaintImage(MagickWand *wand,
11962%        const PixelWand *target,const double alpha,const double fuzz,
11963%        const MagickBooleanType invert)
11964%
11965%  A description of each parameter follows:
11966%
11967%    o wand: the magick wand.
11968%
11969%    o target: Change this target color to specified alpha value within
11970%      the image.
11971%
11972%    o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
11973%      transparent.
11974%
11975%    o fuzz: By default target must match a particular pixel color
11976%      exactly.  However, in many cases two colors may differ by a small amount.
11977%      The fuzz member of image defines how much tolerance is acceptable to
11978%      consider two colors as the same.  For example, set fuzz to 10 and the
11979%      color red at intensities of 100 and 102 respectively are now interpreted
11980%      as the same color for the purposes of the floodfill.
11981%
11982%    o invert: paint any pixel that does not match the target color.
11983%
11984*/
11985WandExport MagickBooleanType MagickTransparentPaintImage(MagickWand *wand,
11986  const PixelWand *target,const double alpha,const double fuzz,
11987  const MagickBooleanType invert)
11988{
11989  MagickBooleanType
11990    status;
11991
11992  PixelInfo
11993    target_pixel;
11994
11995  assert(wand != (MagickWand *) NULL);
11996  assert(wand->signature == MagickWandSignature);
11997  if (wand->debug != MagickFalse)
11998    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11999  if (wand->images == (Image *) NULL)
12000    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12001  PixelGetMagickColor(target,&target_pixel);
12002  wand->images->fuzz=fuzz;
12003  status=TransparentPaintImage(wand->images,&target_pixel,ClampToQuantum(
12004    QuantumRange*alpha),invert,wand->exception);
12005  return(status);
12006}
12007
12008/*
12009%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12010%                                                                             %
12011%                                                                             %
12012%                                                                             %
12013%   M a g i c k T r a n s p o s e I m a g e                                   %
12014%                                                                             %
12015%                                                                             %
12016%                                                                             %
12017%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12018%
12019%  MagickTransposeImage() creates a vertical mirror image by reflecting the
12020%  pixels around the central x-axis while rotating them 90-degrees.
12021%
12022%  The format of the MagickTransposeImage method is:
12023%
12024%      MagickBooleanType MagickTransposeImage(MagickWand *wand)
12025%
12026%  A description of each parameter follows:
12027%
12028%    o wand: the magick wand.
12029%
12030*/
12031WandExport MagickBooleanType MagickTransposeImage(MagickWand *wand)
12032{
12033  Image
12034    *transpose_image;
12035
12036  assert(wand != (MagickWand *) NULL);
12037  assert(wand->signature == MagickWandSignature);
12038  if (wand->debug != MagickFalse)
12039    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12040  if (wand->images == (Image *) NULL)
12041    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12042  transpose_image=TransposeImage(wand->images,wand->exception);
12043  if (transpose_image == (Image *) NULL)
12044    return(MagickFalse);
12045  ReplaceImageInList(&wand->images,transpose_image);
12046  return(MagickTrue);
12047}
12048
12049/*
12050%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12051%                                                                             %
12052%                                                                             %
12053%                                                                             %
12054%   M a g i c k T r a n s v e r s e I m a g e                                 %
12055%                                                                             %
12056%                                                                             %
12057%                                                                             %
12058%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12059%
12060%  MagickTransverseImage() creates a horizontal mirror image by reflecting the
12061%  pixels around the central y-axis while rotating them 270-degrees.
12062%
12063%  The format of the MagickTransverseImage method is:
12064%
12065%      MagickBooleanType MagickTransverseImage(MagickWand *wand)
12066%
12067%  A description of each parameter follows:
12068%
12069%    o wand: the magick wand.
12070%
12071*/
12072WandExport MagickBooleanType MagickTransverseImage(MagickWand *wand)
12073{
12074  Image
12075    *transverse_image;
12076
12077  assert(wand != (MagickWand *) NULL);
12078  assert(wand->signature == MagickWandSignature);
12079  if (wand->debug != MagickFalse)
12080    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12081  if (wand->images == (Image *) NULL)
12082    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12083  transverse_image=TransverseImage(wand->images,wand->exception);
12084  if (transverse_image == (Image *) NULL)
12085    return(MagickFalse);
12086  ReplaceImageInList(&wand->images,transverse_image);
12087  return(MagickTrue);
12088}
12089
12090/*
12091%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12092%                                                                             %
12093%                                                                             %
12094%                                                                             %
12095%   M a g i c k T r i m I m a g e                                             %
12096%                                                                             %
12097%                                                                             %
12098%                                                                             %
12099%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12100%
12101%  MagickTrimImage() remove edges that are the background color from the image.
12102%
12103%  The format of the MagickTrimImage method is:
12104%
12105%      MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz)
12106%
12107%  A description of each parameter follows:
12108%
12109%    o wand: the magick wand.
12110%
12111%    o fuzz: By default target must match a particular pixel color
12112%      exactly.  However, in many cases two colors may differ by a small amount.
12113%      The fuzz member of image defines how much tolerance is acceptable to
12114%      consider two colors as the same.  For example, set fuzz to 10 and the
12115%      color red at intensities of 100 and 102 respectively are now interpreted
12116%      as the same color for the purposes of the floodfill.
12117%
12118*/
12119WandExport MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz)
12120{
12121  Image
12122    *trim_image;
12123
12124  assert(wand != (MagickWand *) NULL);
12125  assert(wand->signature == MagickWandSignature);
12126  if (wand->debug != MagickFalse)
12127    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12128  if (wand->images == (Image *) NULL)
12129    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12130  wand->images->fuzz=fuzz;
12131  trim_image=TrimImage(wand->images,wand->exception);
12132  if (trim_image == (Image *) NULL)
12133    return(MagickFalse);
12134  ReplaceImageInList(&wand->images,trim_image);
12135  return(MagickTrue);
12136}
12137
12138/*
12139%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12140%                                                                             %
12141%                                                                             %
12142%                                                                             %
12143%   M a g i c k U n i q u e I m a g e C o l o r s                             %
12144%                                                                             %
12145%                                                                             %
12146%                                                                             %
12147%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12148%
12149%  MagickUniqueImageColors() discards all but one of any pixel color.
12150%
12151%  The format of the MagickUniqueImageColors method is:
12152%
12153%      MagickBooleanType MagickUniqueImageColors(MagickWand *wand)
12154%
12155%  A description of each parameter follows:
12156%
12157%    o wand: the magick wand.
12158%
12159*/
12160WandExport MagickBooleanType MagickUniqueImageColors(MagickWand *wand)
12161{
12162  Image
12163    *unique_image;
12164
12165  assert(wand != (MagickWand *) NULL);
12166  assert(wand->signature == MagickWandSignature);
12167  if (wand->debug != MagickFalse)
12168    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12169  if (wand->images == (Image *) NULL)
12170    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12171  unique_image=UniqueImageColors(wand->images,wand->exception);
12172  if (unique_image == (Image *) NULL)
12173    return(MagickFalse);
12174  ReplaceImageInList(&wand->images,unique_image);
12175  return(MagickTrue);
12176}
12177
12178/*
12179%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12180%                                                                             %
12181%                                                                             %
12182%                                                                             %
12183%   M a g i c k U n s h a r p M a s k I m a g e                               %
12184%                                                                             %
12185%                                                                             %
12186%                                                                             %
12187%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12188%
12189%  MagickUnsharpMaskImage() sharpens an image.  We convolve the image with a
12190%  Gaussian operator of the given radius and standard deviation (sigma).
12191%  For reasonable results, radius should be larger than sigma.  Use a radius
12192%  of 0 and UnsharpMaskImage() selects a suitable radius for you.
12193%
12194%  The format of the MagickUnsharpMaskImage method is:
12195%
12196%      MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
12197%        const double radius,const double sigma,const double gain,
12198%        const double threshold)
12199%
12200%  A description of each parameter follows:
12201%
12202%    o wand: the magick wand.
12203%
12204%    o radius: the radius of the Gaussian, in pixels, not counting the center
12205%      pixel.
12206%
12207%    o sigma: the standard deviation of the Gaussian, in pixels.
12208%
12209%    o gain: the percentage of the difference between the original and the
12210%      blur image that is added back into the original.
12211%
12212%    o threshold: the threshold in pixels needed to apply the diffence gain.
12213%
12214*/
12215WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
12216  const double radius,const double sigma,const double gain,
12217  const double threshold)
12218{
12219  Image
12220    *unsharp_image;
12221
12222  assert(wand != (MagickWand *) NULL);
12223  assert(wand->signature == MagickWandSignature);
12224  if (wand->debug != MagickFalse)
12225    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12226  if (wand->images == (Image *) NULL)
12227    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12228  unsharp_image=UnsharpMaskImage(wand->images,radius,sigma,gain,threshold,
12229    wand->exception);
12230  if (unsharp_image == (Image *) NULL)
12231    return(MagickFalse);
12232  ReplaceImageInList(&wand->images,unsharp_image);
12233  return(MagickTrue);
12234}
12235
12236/*
12237%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12238%                                                                             %
12239%                                                                             %
12240%                                                                             %
12241%   M a g i c k V i g n e t t e I m a g e                                     %
12242%                                                                             %
12243%                                                                             %
12244%                                                                             %
12245%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12246%
12247%  MagickVignetteImage() softens the edges of the image in vignette style.
12248%
12249%  The format of the MagickVignetteImage method is:
12250%
12251%      MagickBooleanType MagickVignetteImage(MagickWand *wand,
12252%        const double radius,const double sigma,const ssize_t x,
12253%        const ssize_t y)
12254%
12255%  A description of each parameter follows:
12256%
12257%    o wand: the magick wand.
12258%
12259%    o radius: the radius.
12260%
12261%    o sigma: the sigma.
12262%
12263%    o x, y:  Define the x and y ellipse offset.
12264%
12265*/
12266WandExport MagickBooleanType MagickVignetteImage(MagickWand *wand,
12267  const double radius,const double sigma,const ssize_t x,const ssize_t y)
12268{
12269  Image
12270    *vignette_image;
12271
12272  assert(wand != (MagickWand *) NULL);
12273  assert(wand->signature == MagickWandSignature);
12274  if (wand->debug != MagickFalse)
12275    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12276  if (wand->images == (Image *) NULL)
12277    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12278  vignette_image=VignetteImage(wand->images,radius,sigma,x,y,wand->exception);
12279  if (vignette_image == (Image *) NULL)
12280    return(MagickFalse);
12281  ReplaceImageInList(&wand->images,vignette_image);
12282  return(MagickTrue);
12283}
12284
12285/*
12286%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12287%                                                                             %
12288%                                                                             %
12289%                                                                             %
12290%   M a g i c k W a v e I m a g e                                             %
12291%                                                                             %
12292%                                                                             %
12293%                                                                             %
12294%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12295%
12296%  MagickWaveImage()  creates a "ripple" effect in the image by shifting
12297%  the pixels vertically along a sine wave whose amplitude and wavelength
12298%  is specified by the given parameters.
12299%
12300%  The format of the MagickWaveImage method is:
12301%
12302%      MagickBooleanType MagickWaveImage(MagickWand *wand,
12303%        const double amplitude,const double wave_length,
12304%        const PixelInterpolateMethod method)
12305%
12306%  A description of each parameter follows:
12307%
12308%    o wand: the magick wand.
12309%
12310%    o amplitude, wave_length:  Define the amplitude and wave length of the
12311%      sine wave.
12312%
12313%    o method: the pixel interpolation method.
12314%
12315*/
12316WandExport MagickBooleanType MagickWaveImage(MagickWand *wand,
12317  const double amplitude,const double wave_length,
12318  const PixelInterpolateMethod method)
12319{
12320  Image
12321    *wave_image;
12322
12323  assert(wand != (MagickWand *) NULL);
12324  assert(wand->signature == MagickWandSignature);
12325  if (wand->debug != MagickFalse)
12326    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12327  if (wand->images == (Image *) NULL)
12328    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12329  wave_image=WaveImage(wand->images,amplitude,wave_length,method,
12330    wand->exception);
12331  if (wave_image == (Image *) NULL)
12332    return(MagickFalse);
12333  ReplaceImageInList(&wand->images,wave_image);
12334  return(MagickTrue);
12335}
12336
12337/*
12338%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12339%                                                                             %
12340%                                                                             %
12341%                                                                             %
12342%   M a g i c k W h i t e T h r e s h o l d I m a g e                         %
12343%                                                                             %
12344%                                                                             %
12345%                                                                             %
12346%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12347%
12348%  MagickWhiteThresholdImage() is like ThresholdImage() but  force all pixels
12349%  above the threshold into white while leaving all pixels below the threshold
12350%  unchanged.
12351%
12352%  The format of the MagickWhiteThresholdImage method is:
12353%
12354%      MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand,
12355%        const PixelWand *threshold)
12356%
12357%  A description of each parameter follows:
12358%
12359%    o wand: the magick wand.
12360%
12361%    o threshold: the pixel wand.
12362%
12363*/
12364WandExport MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand,
12365  const PixelWand *threshold)
12366{
12367  char
12368    thresholds[MagickPathExtent];
12369
12370  assert(wand != (MagickWand *) NULL);
12371  assert(wand->signature == MagickWandSignature);
12372  if (wand->debug != MagickFalse)
12373    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12374  if (wand->images == (Image *) NULL)
12375    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12376  (void) FormatLocaleString(thresholds,MagickPathExtent,
12377    QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat,
12378    PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold),
12379    PixelGetBlueQuantum(threshold),PixelGetAlphaQuantum(threshold));
12380  return(WhiteThresholdImage(wand->images,thresholds,wand->exception));
12381}
12382
12383/*
12384%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12385%                                                                             %
12386%                                                                             %
12387%                                                                             %
12388%   M a g i c k W r i t e I m a g e                                           %
12389%                                                                             %
12390%                                                                             %
12391%                                                                             %
12392%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12393%
12394%  MagickWriteImage() writes an image to the specified filename.  If the
12395%  filename parameter is NULL, the image is written to the filename set
12396%  by MagickReadImage() or MagickSetImageFilename().
12397%
12398%  The format of the MagickWriteImage method is:
12399%
12400%      MagickBooleanType MagickWriteImage(MagickWand *wand,
12401%        const char *filename)
12402%
12403%  A description of each parameter follows:
12404%
12405%    o wand: the magick wand.
12406%
12407%    o filename: the image filename.
12408%
12409%
12410*/
12411WandExport MagickBooleanType MagickWriteImage(MagickWand *wand,
12412  const char *filename)
12413{
12414  Image
12415    *image;
12416
12417  ImageInfo
12418    *write_info;
12419
12420  MagickBooleanType
12421    status;
12422
12423  assert(wand != (MagickWand *) NULL);
12424  assert(wand->signature == MagickWandSignature);
12425  if (wand->debug != MagickFalse)
12426    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12427  if (wand->images == (Image *) NULL)
12428    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12429  if (filename != (const char *) NULL)
12430    (void) CopyMagickString(wand->images->filename,filename,MagickPathExtent);
12431  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
12432  if (image == (Image *) NULL)
12433    return(MagickFalse);
12434  write_info=CloneImageInfo(wand->image_info);
12435  write_info->adjoin=MagickTrue;
12436  status=WriteImage(write_info,image,wand->exception);
12437  image=DestroyImage(image);
12438  write_info=DestroyImageInfo(write_info);
12439  return(status);
12440}
12441
12442/*
12443%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12444%                                                                             %
12445%                                                                             %
12446%                                                                             %
12447%   M a g i c k W r i t e I m a g e F i l e                                   %
12448%                                                                             %
12449%                                                                             %
12450%                                                                             %
12451%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12452%
12453%  MagickWriteImageFile() writes an image to an open file descriptor.
12454%
12455%  The format of the MagickWriteImageFile method is:
12456%
12457%      MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file)
12458%
12459%  A description of each parameter follows:
12460%
12461%    o wand: the magick wand.
12462%
12463%    o file: the file descriptor.
12464%
12465*/
12466WandExport MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file)
12467{
12468  Image
12469    *image;
12470
12471  ImageInfo
12472    *write_info;
12473
12474  MagickBooleanType
12475    status;
12476
12477  assert(wand != (MagickWand *) NULL);
12478  assert(wand->signature == MagickWandSignature);
12479  assert(file != (FILE *) NULL);
12480  if (wand->debug != MagickFalse)
12481    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12482  if (wand->images == (Image *) NULL)
12483    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12484  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
12485  if (image == (Image *) NULL)
12486    return(MagickFalse);
12487  write_info=CloneImageInfo(wand->image_info);
12488  SetImageInfoFile(write_info,file);
12489  write_info->adjoin=MagickTrue;
12490  status=WriteImage(write_info,image,wand->exception);
12491  write_info=DestroyImageInfo(write_info);
12492  image=DestroyImage(image);
12493  return(status);
12494}
12495
12496/*
12497%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12498%                                                                             %
12499%                                                                             %
12500%                                                                             %
12501%   M a g i c k W r i t e I m a g e s                                         %
12502%                                                                             %
12503%                                                                             %
12504%                                                                             %
12505%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12506%
12507%  MagickWriteImages() writes an image or image sequence.
12508%
12509%  The format of the MagickWriteImages method is:
12510%
12511%      MagickBooleanType MagickWriteImages(MagickWand *wand,
12512%        const char *filename,const MagickBooleanType adjoin)
12513%
12514%  A description of each parameter follows:
12515%
12516%    o wand: the magick wand.
12517%
12518%    o filename: the image filename.
12519%
12520%    o adjoin: join images into a single multi-image file.
12521%
12522*/
12523WandExport MagickBooleanType MagickWriteImages(MagickWand *wand,
12524  const char *filename,const MagickBooleanType adjoin)
12525{
12526  ImageInfo
12527    *write_info;
12528
12529  MagickBooleanType
12530    status;
12531
12532  assert(wand != (MagickWand *) NULL);
12533  assert(wand->signature == MagickWandSignature);
12534  if (wand->debug != MagickFalse)
12535    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12536  if (wand->images == (Image *) NULL)
12537    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12538  write_info=CloneImageInfo(wand->image_info);
12539  write_info->adjoin=adjoin;
12540  status=WriteImages(write_info,wand->images,filename,wand->exception);
12541  write_info=DestroyImageInfo(write_info);
12542  return(status);
12543}
12544
12545/*
12546%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12547%                                                                             %
12548%                                                                             %
12549%                                                                             %
12550%   M a g i c k W r i t e I m a g e s F i l e                                 %
12551%                                                                             %
12552%                                                                             %
12553%                                                                             %
12554%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12555%
12556%  MagickWriteImagesFile() writes an image sequence to an open file descriptor.
12557%
12558%  The format of the MagickWriteImagesFile method is:
12559%
12560%      MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file)
12561%
12562%  A description of each parameter follows:
12563%
12564%    o wand: the magick wand.
12565%
12566%    o file: the file descriptor.
12567%
12568*/
12569WandExport MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file)
12570{
12571  ImageInfo
12572    *write_info;
12573
12574  MagickBooleanType
12575    status;
12576
12577  assert(wand != (MagickWand *) NULL);
12578  assert(wand->signature == MagickWandSignature);
12579  if (wand->debug != MagickFalse)
12580    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12581  if (wand->images == (Image *) NULL)
12582    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12583  write_info=CloneImageInfo(wand->image_info);
12584  SetImageInfoFile(write_info,file);
12585  write_info->adjoin=MagickTrue;
12586  status=WriteImages(write_info,wand->images,(const char *) NULL,
12587    wand->exception);
12588  write_info=DestroyImageInfo(write_info);
12589  return(status);
12590}
12591