magick-image.c revision e9b51cf2587ba65d34db4b60ccf71666d3b490ef
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-2015 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 == WandSignature);
95  if (IfMagickTrue(wand->debug))
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,MaxTextExtent,"%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=WandSignature;
111  if (IfMagickTrue(clone_wand->debug))
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 == WandSignature);
142  if (IfMagickTrue(wand->debug))
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 == WandSignature);
194  if (IfMagickTrue(wand->debug))
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 == WandSignature);
239  if (IfMagickTrue(wand->debug))
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 == WandSignature);
291  if (IfMagickTrue(wand->debug))
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 == WandSignature);
342  if (IfMagickTrue(wand->debug))
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 (IfMagickTrue(wand->insert_before))
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 (IfMagickTrue((wand->insert_before)) &&
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 == WandSignature);
444  if (IfMagickTrue(wand->debug))
445    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
446  assert(add_wand != (MagickWand *) NULL);
447  assert(add_wand->signature == WandSignature);
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 == WandSignature);
495  if (IfMagickTrue(wand->debug))
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 == WandSignature);
543  if (IfMagickTrue(wand->debug))
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[MaxTextExtent];
599
600  DrawInfo
601    *draw_info;
602
603  MagickBooleanType
604    status;
605
606  assert(wand != (MagickWand *) NULL);
607  assert(wand->signature == WandSignature);
608  if (IfMagickTrue(wand->debug))
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,MaxTextExtent,"%+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 == WandSignature);
660  if (IfMagickTrue(wand->debug))
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 == WandSignature);
707  if (IfMagickTrue(wand->debug))
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 == WandSignature);
747  if (IfMagickTrue(wand->debug))
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 == WandSignature);
785  if (IfMagickTrue(wand->debug))
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 == WandSignature);
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[MaxTextExtent];
868
869  MagickBooleanType
870    status;
871
872  assert(wand != (MagickWand *) NULL);
873  assert(wand->signature == WandSignature);
874  if (IfMagickTrue(wand->debug))
875    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
876  if (wand->images == (Image *) NULL)
877    ThrowWandException(WandError,"ContainsNoImages",wand->name);
878  (void) FormatLocaleString(thresholds,MaxTextExtent,
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 == WandSignature);
920  if (IfMagickTrue(wand->debug))
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 == WandSignature);
970  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1026  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1080  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1134  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1180  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1237  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1280  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1317  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1365  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1408  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1450  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1511  if (IfMagickTrue(wand->debug))
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[MaxTextExtent];
1552
1553  Image
1554    *colorize_image;
1555
1556  PixelInfo
1557    target;
1558
1559  assert(wand != (MagickWand *) NULL);
1560  assert(wand->signature == WandSignature);
1561  if (IfMagickTrue(wand->debug))
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,MaxTextExtent,
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,MaxTextExtent,
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 == WandSignature);
1629  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1678  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1721  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1764  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1814  if (IfMagickTrue(wand->debug))
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 == WandSignature);
1881  if (IfMagickTrue(wand->debug))
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 L a y e r s                                 %
1897%                                                                             %
1898%                                                                             %
1899%                                                                             %
1900%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1901%
1902%  MagickCompositeLayers() composite the images in the source wand over the
1903%  images in the destination wand in sequence, starting with the current
1904%  image in both lists.
1905%
1906%  Each layer from the two image lists are composted together until the end of
1907%  one of the image lists is reached.  The offset of each composition is also
1908%  adjusted to match the virtual canvas offsets of each layer. As such the
1909%  given offset is relative to the virtual canvas, and not the actual image.
1910%
1911%  Composition uses given x and y offsets, as the 'origin' location of the
1912%  source images virtual canvas (not the real image) allowing you to compose a
1913%  list of 'layer images' into the destiantioni images.  This makes it well
1914%  sutiable for directly composing 'Clears Frame Animations' or 'Coaleased
1915%  Animations' onto a static or other 'Coaleased Animation' destination image
1916%  list.  GIF disposal handling is not looked at.
1917%
1918%  Special case:- If one of the image sequences is the last image (just a
1919%  single image remaining), that image is repeatally composed with all the
1920%  images in the other image list.  Either the source or destination lists may
1921%  be the single image, for this situation.
1922%
1923%  In the case of a single destination image (or last image given), that image
1924%  will ve cloned to match the number of images remaining in the source image
1925%  list.
1926%
1927%  This is equivelent to the "-layer Composite" Shell API operator.
1928%
1929%  The format of the MagickCompositeLayers method is:
1930%
1931%      MagickBooleanType MagickCompositeLayers(MagickWand *wand,
1932%        const MagickWand *source_wand, const CompositeOperator compose,
1933%        const ssize_t x,const ssize_t y)
1934%
1935%  A description of each parameter follows:
1936%
1937%    o wand: the magick wand holding destaintion images
1938%
1939%    o source_wand: the wand holding the source images
1940%
1941%    o compose, x, y:  composition arguments
1942%
1943*/
1944WandExport MagickBooleanType MagickCompositeLayers(MagickWand *wand,
1945  const MagickWand *source_wand,const CompositeOperator compose,
1946  const ssize_t x,const ssize_t y)
1947{
1948  MagickBooleanType
1949    status;
1950
1951  assert(wand != (MagickWand *) NULL);
1952  assert(wand->signature == WandSignature);
1953  if (IfMagickTrue(wand->debug))
1954    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
1955  if ((wand->images == (Image *) NULL) ||
1956      (source_wand->images == (Image *) NULL))
1957    ThrowWandException(WandError,"ContainsNoImages",wand->name);
1958  CompositeLayers(wand->images,compose,source_wand->images,x,y,wand->exception);
1959  status=MagickTrue;  /* FUTURE: determine status from exceptions */
1960  return(status);
1961}
1962
1963/*
1964%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1965%                                                                             %
1966%                                                                             %
1967%                                                                             %
1968%   M a g i c k C o n t r a s t I m a g e                                     %
1969%                                                                             %
1970%                                                                             %
1971%                                                                             %
1972%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1973%
1974%  MagickContrastImage() enhances the intensity differences between the lighter
1975%  and darker elements of the image.  Set sharpen to a value other than 0 to
1976%  increase the image contrast otherwise the contrast is reduced.
1977%
1978%  The format of the MagickContrastImage method is:
1979%
1980%      MagickBooleanType MagickContrastImage(MagickWand *wand,
1981%        const MagickBooleanType sharpen)
1982%
1983%  A description of each parameter follows:
1984%
1985%    o wand: the magick wand.
1986%
1987%    o sharpen: Increase or decrease image contrast.
1988%
1989%
1990*/
1991WandExport MagickBooleanType MagickContrastImage(MagickWand *wand,
1992  const MagickBooleanType sharpen)
1993{
1994  MagickBooleanType
1995    status;
1996
1997  assert(wand != (MagickWand *) NULL);
1998  assert(wand->signature == WandSignature);
1999  if (IfMagickTrue(wand->debug))
2000    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2001  if (wand->images == (Image *) NULL)
2002    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2003  status=ContrastImage(wand->images,sharpen,wand->exception);
2004  return(status);
2005}
2006
2007/*
2008%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2009%                                                                             %
2010%                                                                             %
2011%                                                                             %
2012%   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                       %
2013%                                                                             %
2014%                                                                             %
2015%                                                                             %
2016%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2017%
2018%  MagickContrastStretchImage() enhances the contrast of a color image by
2019%  adjusting the pixels color to span the entire range of colors available.
2020%  You can also reduce the influence of a particular channel with a gamma
2021%  value of 0.
2022%
2023%  The format of the MagickContrastStretchImage method is:
2024%
2025%      MagickBooleanType MagickContrastStretchImage(MagickWand *wand,
2026%        const double black_point,const double white_point)
2027%
2028%  A description of each parameter follows:
2029%
2030%    o wand: the magick wand.
2031%
2032%    o black_point: the black point.
2033%
2034%    o white_point: the white point.
2035%
2036*/
2037WandExport MagickBooleanType MagickContrastStretchImage(MagickWand *wand,
2038  const double black_point,const double white_point)
2039{
2040  MagickBooleanType
2041    status;
2042
2043  assert(wand != (MagickWand *) NULL);
2044  assert(wand->signature == WandSignature);
2045  if (IfMagickTrue(wand->debug))
2046    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2047  if (wand->images == (Image *) NULL)
2048    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2049  status=ContrastStretchImage(wand->images,black_point,white_point,
2050    wand->exception);
2051  return(status);
2052}
2053
2054/*
2055%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2056%                                                                             %
2057%                                                                             %
2058%                                                                             %
2059%   M a g i c k C o n v o l v e I m a g e                                     %
2060%                                                                             %
2061%                                                                             %
2062%                                                                             %
2063%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2064%
2065%  MagickConvolveImage() applies a custom convolution kernel to the image.
2066%
2067%  The format of the MagickConvolveImage method is:
2068%
2069%      MagickBooleanType MagickConvolveImage(MagickWand *wand,
2070%        const KernelInfo *kernel)
2071%
2072%  A description of each parameter follows:
2073%
2074%    o wand: the magick wand.
2075%
2076%    o kernel: An array of doubles representing the convolution kernel.
2077%
2078*/
2079WandExport MagickBooleanType MagickConvolveImage(MagickWand *wand,
2080  const KernelInfo *kernel)
2081{
2082  Image
2083    *filter_image;
2084
2085  assert(wand != (MagickWand *) NULL);
2086  assert(wand->signature == WandSignature);
2087  if (IfMagickTrue(wand->debug))
2088    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2089  if (kernel == (const KernelInfo *) NULL)
2090    return(MagickFalse);
2091  if (wand->images == (Image *) NULL)
2092    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2093  filter_image=ConvolveImage(wand->images,kernel,wand->exception);
2094  if (filter_image == (Image *) NULL)
2095    return(MagickFalse);
2096  ReplaceImageInList(&wand->images,filter_image);
2097  return(MagickTrue);
2098}
2099
2100/*
2101%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2102%                                                                             %
2103%                                                                             %
2104%                                                                             %
2105%   M a g i c k C r o p I m a g e                                             %
2106%                                                                             %
2107%                                                                             %
2108%                                                                             %
2109%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2110%
2111%  MagickCropImage() extracts a region of the image.
2112%
2113%  The format of the MagickCropImage method is:
2114%
2115%      MagickBooleanType MagickCropImage(MagickWand *wand,
2116%        const size_t width,const size_t height,const ssize_t x,const ssize_t y)
2117%
2118%  A description of each parameter follows:
2119%
2120%    o wand: the magick wand.
2121%
2122%    o width: the region width.
2123%
2124%    o height: the region height.
2125%
2126%    o x: the region x-offset.
2127%
2128%    o y: the region y-offset.
2129%
2130*/
2131WandExport MagickBooleanType MagickCropImage(MagickWand *wand,
2132  const size_t width,const size_t height,const ssize_t x,const ssize_t y)
2133{
2134  Image
2135    *crop_image;
2136
2137  RectangleInfo
2138    crop;
2139
2140  assert(wand != (MagickWand *) NULL);
2141  assert(wand->signature == WandSignature);
2142  if (IfMagickTrue(wand->debug))
2143    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2144  if (wand->images == (Image *) NULL)
2145    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2146  crop.width=width;
2147  crop.height=height;
2148  crop.x=x;
2149  crop.y=y;
2150  crop_image=CropImage(wand->images,&crop,wand->exception);
2151  if (crop_image == (Image *) NULL)
2152    return(MagickFalse);
2153  ReplaceImageInList(&wand->images,crop_image);
2154  return(MagickTrue);
2155}
2156
2157/*
2158%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2159%                                                                             %
2160%                                                                             %
2161%                                                                             %
2162%   M a g i c k C y c l e C o l o r m a p I m a g e                           %
2163%                                                                             %
2164%                                                                             %
2165%                                                                             %
2166%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2167%
2168%  MagickCycleColormapImage() displaces an image's colormap by a given number
2169%  of positions.  If you cycle the colormap a number of times you can produce
2170%  a psychodelic effect.
2171%
2172%  The format of the MagickCycleColormapImage method is:
2173%
2174%      MagickBooleanType MagickCycleColormapImage(MagickWand *wand,
2175%        const ssize_t displace)
2176%
2177%  A description of each parameter follows:
2178%
2179%    o wand: the magick wand.
2180%
2181%    o pixel_wand: the pixel wand.
2182%
2183*/
2184WandExport MagickBooleanType MagickCycleColormapImage(MagickWand *wand,
2185  const ssize_t displace)
2186{
2187  MagickBooleanType
2188    status;
2189
2190  assert(wand != (MagickWand *) NULL);
2191  assert(wand->signature == WandSignature);
2192  if (IfMagickTrue(wand->debug))
2193    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2194  if (wand->images == (Image *) NULL)
2195    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2196  status=CycleColormapImage(wand->images,displace,wand->exception);
2197  return(status);
2198}
2199
2200/*
2201%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2202%                                                                             %
2203%                                                                             %
2204%                                                                             %
2205%   M a g i c k C o n s t i t u t e I m a g e                                 %
2206%                                                                             %
2207%                                                                             %
2208%                                                                             %
2209%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2210%
2211%  MagickConstituteImage() adds an image to the wand comprised of the pixel
2212%  data you supply.  The pixel data must be in scanline order top-to-bottom.
2213%  The data can be char, short int, int, float, or double.  Float and double
2214%  require the pixels to be normalized [0..1], otherwise [0..Max],  where Max
2215%  is the maximum value the type can accomodate (e.g. 255 for char).  For
2216%  example, to create a 640x480 image from unsigned red-green-blue character
2217%  data, use
2218%
2219%      MagickConstituteImage(wand,640,640,"RGB",CharPixel,pixels);
2220%
2221%  The format of the MagickConstituteImage method is:
2222%
2223%      MagickBooleanType MagickConstituteImage(MagickWand *wand,
2224%        const size_t columns,const size_t rows,const char *map,
2225%        const StorageType storage,void *pixels)
2226%
2227%  A description of each parameter follows:
2228%
2229%    o wand: the magick wand.
2230%
2231%    o columns: width in pixels of the image.
2232%
2233%    o rows: height in pixels of the image.
2234%
2235%    o map:  This string reflects the expected ordering of the pixel array.
2236%      It can be any combination or order of R = red, G = green, B = blue,
2237%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
2238%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
2239%      P = pad.
2240%
2241%    o storage: Define the data type of the pixels.  Float and double types are
2242%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
2243%      these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel,
2244%      LongPixel, QuantumPixel, or ShortPixel.
2245%
2246%    o pixels: This array of values contain the pixel components as defined by
2247%      map and type.  You must preallocate this array where the expected
2248%      length varies depending on the values of width, height, map, and type.
2249%
2250%
2251*/
2252WandExport MagickBooleanType MagickConstituteImage(MagickWand *wand,
2253  const size_t columns,const size_t rows,const char *map,
2254  const StorageType storage,const void *pixels)
2255{
2256  Image
2257    *images;
2258
2259  assert(wand != (MagickWand *) NULL);
2260  assert(wand->signature == WandSignature);
2261  if (IfMagickTrue(wand->debug))
2262    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2263  images=ConstituteImage(columns,rows,map,storage,pixels,wand->exception);
2264  if (images == (Image *) NULL)
2265    return(MagickFalse);
2266  return(InsertImageInWand(wand,images));
2267}
2268
2269/*
2270%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2271%                                                                             %
2272%                                                                             %
2273%                                                                             %
2274%   M a g i c k D e c i p h e r I m a g e                                     %
2275%                                                                             %
2276%                                                                             %
2277%                                                                             %
2278%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2279%
2280%  MagickDecipherImage() converts cipher pixels to plain pixels.
2281%
2282%  The format of the MagickDecipherImage method is:
2283%
2284%      MagickBooleanType MagickDecipherImage(MagickWand *wand,
2285%        const char *passphrase)
2286%
2287%  A description of each parameter follows:
2288%
2289%    o wand: the magick wand.
2290%
2291%    o passphrase: the passphrase.
2292%
2293*/
2294WandExport MagickBooleanType MagickDecipherImage(MagickWand *wand,
2295  const char *passphrase)
2296{
2297  assert(wand != (MagickWand *) NULL);
2298  assert(wand->signature == WandSignature);
2299  if (IfMagickTrue(wand->debug))
2300    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2301  if (wand->images == (Image *) NULL)
2302    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2303  return(DecipherImage(wand->images,passphrase,wand->exception));
2304}
2305
2306/*
2307%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2308%                                                                             %
2309%                                                                             %
2310%                                                                             %
2311%   M a g i c k D e c o n s t r u c t I m a g e s                             %
2312%                                                                             %
2313%                                                                             %
2314%                                                                             %
2315%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2316%
2317%  MagickDeconstructImages() compares each image with the next in a sequence
2318%  and returns the maximum bounding region of any pixel differences it
2319%  discovers.
2320%
2321%  The format of the MagickDeconstructImages method is:
2322%
2323%      MagickWand *MagickDeconstructImages(MagickWand *wand)
2324%
2325%  A description of each parameter follows:
2326%
2327%    o wand: the magick wand.
2328%
2329*/
2330WandExport MagickWand *MagickDeconstructImages(MagickWand *wand)
2331{
2332  Image
2333    *deconstruct_image;
2334
2335  assert(wand != (MagickWand *) NULL);
2336  assert(wand->signature == WandSignature);
2337  if (IfMagickTrue(wand->debug))
2338    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2339  if (wand->images == (Image *) NULL)
2340    return((MagickWand *) NULL);
2341  deconstruct_image=CompareImagesLayers(wand->images,CompareAnyLayer,
2342    wand->exception);
2343  if (deconstruct_image == (Image *) NULL)
2344    return((MagickWand *) NULL);
2345  return(CloneMagickWandFromImages(wand,deconstruct_image));
2346}
2347
2348/*
2349%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2350%                                                                             %
2351%                                                                             %
2352%                                                                             %
2353%     M a g i c k D e s k e w I m a g e                                       %
2354%                                                                             %
2355%                                                                             %
2356%                                                                             %
2357%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2358%
2359%  MagickDeskewImage() removes skew from the image.  Skew is an artifact that
2360%  occurs in scanned images because of the camera being misaligned,
2361%  imperfections in the scanning or surface, or simply because the paper was
2362%  not placed completely flat when scanned.
2363%
2364%  The format of the MagickDeskewImage method is:
2365%
2366%      MagickBooleanType MagickDeskewImage(MagickWand *wand,
2367%        const double threshold)
2368%
2369%  A description of each parameter follows:
2370%
2371%    o wand: the magick wand.
2372%
2373%    o threshold: separate background from foreground.
2374%
2375*/
2376WandExport MagickBooleanType MagickDeskewImage(MagickWand *wand,
2377  const double threshold)
2378{
2379  Image
2380    *sepia_image;
2381
2382  assert(wand != (MagickWand *) NULL);
2383  assert(wand->signature == WandSignature);
2384  if (IfMagickTrue(wand->debug))
2385    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2386  if (wand->images == (Image *) NULL)
2387    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2388  sepia_image=DeskewImage(wand->images,threshold,wand->exception);
2389  if (sepia_image == (Image *) NULL)
2390    return(MagickFalse);
2391  ReplaceImageInList(&wand->images,sepia_image);
2392  return(MagickTrue);
2393}
2394
2395/*
2396%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2397%                                                                             %
2398%                                                                             %
2399%                                                                             %
2400%     M a g i c k D e s p e c k l e I m a g e                                 %
2401%                                                                             %
2402%                                                                             %
2403%                                                                             %
2404%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2405%
2406%  MagickDespeckleImage() reduces the speckle noise in an image while
2407%  perserving the edges of the original image.
2408%
2409%  The format of the MagickDespeckleImage method is:
2410%
2411%      MagickBooleanType MagickDespeckleImage(MagickWand *wand)
2412%
2413%  A description of each parameter follows:
2414%
2415%    o wand: the magick wand.
2416%
2417*/
2418WandExport MagickBooleanType MagickDespeckleImage(MagickWand *wand)
2419{
2420  Image
2421    *despeckle_image;
2422
2423  assert(wand != (MagickWand *) NULL);
2424  assert(wand->signature == WandSignature);
2425  if (IfMagickTrue(wand->debug))
2426    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2427  if (wand->images == (Image *) NULL)
2428    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2429  despeckle_image=DespeckleImage(wand->images,wand->exception);
2430  if (despeckle_image == (Image *) NULL)
2431    return(MagickFalse);
2432  ReplaceImageInList(&wand->images,despeckle_image);
2433  return(MagickTrue);
2434}
2435
2436/*
2437%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2438%                                                                             %
2439%                                                                             %
2440%                                                                             %
2441%   M a g i c k D e s t r o y I m a g e                                       %
2442%                                                                             %
2443%                                                                             %
2444%                                                                             %
2445%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2446%
2447%  MagickDestroyImage() dereferences an image, deallocating memory associated
2448%  with the image if the reference count becomes zero.
2449%
2450%  The format of the MagickDestroyImage method is:
2451%
2452%      Image *MagickDestroyImage(Image *image)
2453%
2454%  A description of each parameter follows:
2455%
2456%    o image: the image.
2457%
2458*/
2459WandExport Image *MagickDestroyImage(Image *image)
2460{
2461  return(DestroyImage(image));
2462}
2463
2464/*
2465%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2466%                                                                             %
2467%                                                                             %
2468%                                                                             %
2469%   M a g i c k D i s p l a y I m a g e                                       %
2470%                                                                             %
2471%                                                                             %
2472%                                                                             %
2473%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2474%
2475%  MagickDisplayImage() displays an image.
2476%
2477%  The format of the MagickDisplayImage method is:
2478%
2479%      MagickBooleanType MagickDisplayImage(MagickWand *wand,
2480%        const char *server_name)
2481%
2482%  A description of each parameter follows:
2483%
2484%    o wand: the magick wand.
2485%
2486%    o server_name: the X server name.
2487%
2488*/
2489WandExport MagickBooleanType MagickDisplayImage(MagickWand *wand,
2490  const char *server_name)
2491{
2492  Image
2493    *image;
2494
2495  MagickBooleanType
2496    status;
2497
2498  assert(wand != (MagickWand *) NULL);
2499  assert(wand->signature == WandSignature);
2500  if (IfMagickTrue(wand->debug))
2501    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2502  if (wand->images == (Image *) NULL)
2503    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2504  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
2505  if (image == (Image *) NULL)
2506    return(MagickFalse);
2507  (void) CloneString(&wand->image_info->server_name,server_name);
2508  status=DisplayImages(wand->image_info,image,wand->exception);
2509  image=DestroyImage(image);
2510  return(status);
2511}
2512
2513/*
2514%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2515%                                                                             %
2516%                                                                             %
2517%                                                                             %
2518%   M a g i c k D i s p l a y I m a g e s                                     %
2519%                                                                             %
2520%                                                                             %
2521%                                                                             %
2522%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2523%
2524%  MagickDisplayImages() displays an image or image sequence.
2525%
2526%  The format of the MagickDisplayImages method is:
2527%
2528%      MagickBooleanType MagickDisplayImages(MagickWand *wand,
2529%        const char *server_name)
2530%
2531%  A description of each parameter follows:
2532%
2533%    o wand: the magick wand.
2534%
2535%    o server_name: the X server name.
2536%
2537*/
2538WandExport MagickBooleanType MagickDisplayImages(MagickWand *wand,
2539  const char *server_name)
2540{
2541  MagickBooleanType
2542    status;
2543
2544  assert(wand != (MagickWand *) NULL);
2545  assert(wand->signature == WandSignature);
2546  if (IfMagickTrue(wand->debug))
2547    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2548  (void) CloneString(&wand->image_info->server_name,server_name);
2549  status=DisplayImages(wand->image_info,wand->images,wand->exception);
2550  return(status);
2551}
2552
2553/*
2554%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2555%                                                                             %
2556%                                                                             %
2557%                                                                             %
2558%   M a g i c k D i s t o r t I m a g e                                       %
2559%                                                                             %
2560%                                                                             %
2561%                                                                             %
2562%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2563%
2564%  MagickDistortImage() distorts an image using various distortion methods, by
2565%  mapping color lookups of the source image to a new destination image
2566%  usally of the same size as the source image, unless 'bestfit' is set to
2567%  true.
2568%
2569%  If 'bestfit' is enabled, and distortion allows it, the destination image is
2570%  adjusted to ensure the whole source 'image' will just fit within the final
2571%  destination image, which will be sized and offset accordingly.  Also in
2572%  many cases the virtual offset of the source image will be taken into
2573%  account in the mapping.
2574%
2575%  The format of the MagickDistortImage method is:
2576%
2577%      MagickBooleanType MagickDistortImage(MagickWand *wand,
2578%        const DistortImageMethod method,const size_t number_arguments,
2579%        const double *arguments,const MagickBooleanType bestfit)
2580%
2581%  A description of each parameter follows:
2582%
2583%    o image: the image to be distorted.
2584%
2585%    o method: the method of image distortion.
2586%
2587%        ArcDistortion always ignores the source image offset, and always
2588%        'bestfit' the destination image with the top left corner offset
2589%        relative to the polar mapping center.
2590%
2591%        Bilinear has no simple inverse mapping so it does not allow 'bestfit'
2592%        style of image distortion.
2593%
2594%        Affine, Perspective, and Bilinear, do least squares fitting of the
2595%        distortion when more than the minimum number of control point pairs
2596%        are provided.
2597%
2598%        Perspective, and Bilinear, falls back to a Affine distortion when less
2599%        that 4 control point pairs are provided. While Affine distortions let
2600%        you use any number of control point pairs, that is Zero pairs is a
2601%        no-Op (viewport only) distrotion, one pair is a translation and two
2602%        pairs of control points do a scale-rotate-translate, without any
2603%        shearing.
2604%
2605%    o number_arguments: the number of arguments given for this distortion
2606%      method.
2607%
2608%    o arguments: the arguments for this distortion method.
2609%
2610%    o bestfit: Attempt to resize destination to fit distorted source.
2611%
2612*/
2613WandExport MagickBooleanType MagickDistortImage(MagickWand *wand,
2614  const DistortImageMethod method,const size_t number_arguments,
2615  const double *arguments,const MagickBooleanType bestfit)
2616{
2617  Image
2618    *distort_image;
2619
2620  assert(wand != (MagickWand *) NULL);
2621  assert(wand->signature == WandSignature);
2622  if (IfMagickTrue(wand->debug))
2623    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2624  if (wand->images == (Image *) NULL)
2625    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2626  distort_image=DistortImage(wand->images,method,number_arguments,arguments,
2627    bestfit,wand->exception);
2628  if (distort_image == (Image *) NULL)
2629    return(MagickFalse);
2630  ReplaceImageInList(&wand->images,distort_image);
2631  return(MagickTrue);
2632}
2633
2634/*
2635%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2636%                                                                             %
2637%                                                                             %
2638%                                                                             %
2639%   M a g i c k D r a w I m a g e                                             %
2640%                                                                             %
2641%                                                                             %
2642%                                                                             %
2643%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2644%
2645%  MagickDrawImage() renders the drawing wand on the current image.
2646%
2647%  The format of the MagickDrawImage method is:
2648%
2649%      MagickBooleanType MagickDrawImage(MagickWand *wand,
2650%        const DrawingWand *drawing_wand)
2651%
2652%  A description of each parameter follows:
2653%
2654%    o wand: the magick wand.
2655%
2656%    o drawing_wand: the draw wand.
2657%
2658*/
2659WandExport MagickBooleanType MagickDrawImage(MagickWand *wand,
2660  const DrawingWand *drawing_wand)
2661{
2662  char
2663    *primitive;
2664
2665  DrawInfo
2666    *draw_info;
2667
2668  MagickBooleanType
2669    status;
2670
2671  assert(wand != (MagickWand *) NULL);
2672  assert(wand->signature == WandSignature);
2673  if (IfMagickTrue(wand->debug))
2674    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2675  if (wand->images == (Image *) NULL)
2676    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2677  draw_info=PeekDrawingWand(drawing_wand);
2678  if ((draw_info == (DrawInfo *) NULL) ||
2679      (draw_info->primitive == (char *) NULL))
2680    return(MagickFalse);
2681  primitive=AcquireString(draw_info->primitive);
2682  draw_info=DestroyDrawInfo(draw_info);
2683  draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
2684  draw_info->primitive=primitive;
2685  status=DrawImage(wand->images,draw_info,wand->exception);
2686  draw_info=DestroyDrawInfo(draw_info);
2687  return(status);
2688}
2689
2690/*
2691%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2692%                                                                             %
2693%                                                                             %
2694%                                                                             %
2695%   M a g i c k E d g e I m a g e                                             %
2696%                                                                             %
2697%                                                                             %
2698%                                                                             %
2699%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2700%
2701%  MagickEdgeImage() enhance edges within the image with a convolution filter
2702%  of the given radius.  Use a radius of 0 and Edge() selects a suitable
2703%  radius for you.
2704%
2705%  The format of the MagickEdgeImage method is:
2706%
2707%      MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius)
2708%
2709%  A description of each parameter follows:
2710%
2711%    o wand: the magick wand.
2712%
2713%    o radius: the radius of the pixel neighborhood.
2714%
2715*/
2716WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand,
2717  const double radius)
2718{
2719  Image
2720    *edge_image;
2721
2722  assert(wand != (MagickWand *) NULL);
2723  assert(wand->signature == WandSignature);
2724  if (IfMagickTrue(wand->debug))
2725    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2726  if (wand->images == (Image *) NULL)
2727    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2728  edge_image=EdgeImage(wand->images,radius,wand->exception);
2729  if (edge_image == (Image *) NULL)
2730    return(MagickFalse);
2731  ReplaceImageInList(&wand->images,edge_image);
2732  return(MagickTrue);
2733}
2734
2735/*
2736%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2737%                                                                             %
2738%                                                                             %
2739%                                                                             %
2740%   M a g i c k E m b o s s I m a g e                                         %
2741%                                                                             %
2742%                                                                             %
2743%                                                                             %
2744%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2745%
2746%  MagickEmbossImage() returns a grayscale image with a three-dimensional
2747%  effect.  We convolve the image with a Gaussian operator of the given radius
2748%  and standard deviation (sigma).  For reasonable results, radius should be
2749%  larger than sigma.  Use a radius of 0 and Emboss() selects a suitable
2750%  radius for you.
2751%
2752%  The format of the MagickEmbossImage method is:
2753%
2754%      MagickBooleanType MagickEmbossImage(MagickWand *wand,const double radius,
2755%        const double sigma)
2756%
2757%  A description of each parameter follows:
2758%
2759%    o wand: the magick wand.
2760%
2761%    o radius: the radius of the Gaussian, in pixels, not counting the center
2762%      pixel.
2763%
2764%    o sigma: the standard deviation of the Gaussian, in pixels.
2765%
2766*/
2767WandExport MagickBooleanType MagickEmbossImage(MagickWand *wand,
2768  const double radius,const double sigma)
2769{
2770  Image
2771    *emboss_image;
2772
2773  assert(wand != (MagickWand *) NULL);
2774  assert(wand->signature == WandSignature);
2775  if (IfMagickTrue(wand->debug))
2776    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2777  if (wand->images == (Image *) NULL)
2778    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2779  emboss_image=EmbossImage(wand->images,radius,sigma,wand->exception);
2780  if (emboss_image == (Image *) NULL)
2781    return(MagickFalse);
2782  ReplaceImageInList(&wand->images,emboss_image);
2783  return(MagickTrue);
2784}
2785
2786/*
2787%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2788%                                                                             %
2789%                                                                             %
2790%                                                                             %
2791%   M a g i c k E n c i p h e r I m a g e                                     %
2792%                                                                             %
2793%                                                                             %
2794%                                                                             %
2795%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2796%
2797%  MagickEncipherImage() converts plaint pixels to cipher pixels.
2798%
2799%  The format of the MagickEncipherImage method is:
2800%
2801%      MagickBooleanType MagickEncipherImage(MagickWand *wand,
2802%        const char *passphrase)
2803%
2804%  A description of each parameter follows:
2805%
2806%    o wand: the magick wand.
2807%
2808%    o passphrase: the passphrase.
2809%
2810*/
2811WandExport MagickBooleanType MagickEncipherImage(MagickWand *wand,
2812  const char *passphrase)
2813{
2814  assert(wand != (MagickWand *) NULL);
2815  assert(wand->signature == WandSignature);
2816  if (IfMagickTrue(wand->debug))
2817    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2818  if (wand->images == (Image *) NULL)
2819    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2820  return(EncipherImage(wand->images,passphrase,wand->exception));
2821}
2822
2823/*
2824%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2825%                                                                             %
2826%                                                                             %
2827%                                                                             %
2828%   M a g i c k E n h a n c e I m a g e                                       %
2829%                                                                             %
2830%                                                                             %
2831%                                                                             %
2832%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2833%
2834%  MagickEnhanceImage() applies a digital filter that improves the quality of a
2835%  noisy image.
2836%
2837%  The format of the MagickEnhanceImage method is:
2838%
2839%      MagickBooleanType MagickEnhanceImage(MagickWand *wand)
2840%
2841%  A description of each parameter follows:
2842%
2843%    o wand: the magick wand.
2844%
2845*/
2846WandExport MagickBooleanType MagickEnhanceImage(MagickWand *wand)
2847{
2848  Image
2849    *enhance_image;
2850
2851  assert(wand != (MagickWand *) NULL);
2852  assert(wand->signature == WandSignature);
2853  if (IfMagickTrue(wand->debug))
2854    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2855  if (wand->images == (Image *) NULL)
2856    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2857  enhance_image=EnhanceImage(wand->images,wand->exception);
2858  if (enhance_image == (Image *) NULL)
2859    return(MagickFalse);
2860  ReplaceImageInList(&wand->images,enhance_image);
2861  return(MagickTrue);
2862}
2863
2864/*
2865%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2866%                                                                             %
2867%                                                                             %
2868%                                                                             %
2869%   M a g i c k E q u a l i z e I m a g e                                     %
2870%                                                                             %
2871%                                                                             %
2872%                                                                             %
2873%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2874%
2875%  MagickEqualizeImage() equalizes the image histogram.
2876%
2877%  The format of the MagickEqualizeImage method is:
2878%
2879%      MagickBooleanType MagickEqualizeImage(MagickWand *wand)
2880%
2881%  A description of each parameter follows:
2882%
2883%    o wand: the magick wand.
2884%
2885%    o channel: the image channel(s).
2886%
2887*/
2888WandExport MagickBooleanType MagickEqualizeImage(MagickWand *wand)
2889{
2890  MagickBooleanType
2891    status;
2892
2893  assert(wand != (MagickWand *) NULL);
2894  assert(wand->signature == WandSignature);
2895  if (IfMagickTrue(wand->debug))
2896    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2897  if (wand->images == (Image *) NULL)
2898    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2899  status=EqualizeImage(wand->images,wand->exception);
2900  return(status);
2901}
2902
2903/*
2904%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2905%                                                                             %
2906%                                                                             %
2907%                                                                             %
2908%   M a g i c k E v a l u a t e I m a g e                                     %
2909%                                                                             %
2910%                                                                             %
2911%                                                                             %
2912%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2913%
2914%  MagickEvaluateImage() applys an arithmetic, relational, or logical
2915%  expression to an image.  Use these operators to lighten or darken an image,
2916%  to increase or decrease contrast in an image, or to produce the "negative"
2917%  of an image.
2918%
2919%  The format of the MagickEvaluateImage method is:
2920%
2921%      MagickBooleanType MagickEvaluateImage(MagickWand *wand,
2922%        const MagickEvaluateOperator operator,const double value)
2923%      MagickBooleanType MagickEvaluateImages(MagickWand *wand,
2924%        const MagickEvaluateOperator operator)
2925%
2926%  A description of each parameter follows:
2927%
2928%    o wand: the magick wand.
2929%
2930%    o op: A channel operator.
2931%
2932%    o value: A value value.
2933%
2934*/
2935
2936WandExport MagickWand *MagickEvaluateImages(MagickWand *wand,
2937  const MagickEvaluateOperator op)
2938{
2939  Image
2940    *evaluate_image;
2941
2942  assert(wand != (MagickWand *) NULL);
2943  assert(wand->signature == WandSignature);
2944  if (IfMagickTrue(wand->debug))
2945    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2946  if (wand->images == (Image *) NULL)
2947    return((MagickWand *) NULL);
2948  evaluate_image=EvaluateImages(wand->images,op,wand->exception);
2949  if (evaluate_image == (Image *) NULL)
2950    return((MagickWand *) NULL);
2951  return(CloneMagickWandFromImages(wand,evaluate_image));
2952}
2953
2954WandExport MagickBooleanType MagickEvaluateImage(MagickWand *wand,
2955  const MagickEvaluateOperator op,const double value)
2956{
2957  MagickBooleanType
2958    status;
2959
2960  assert(wand != (MagickWand *) NULL);
2961  assert(wand->signature == WandSignature);
2962  if (IfMagickTrue(wand->debug))
2963    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
2964  if (wand->images == (Image *) NULL)
2965    ThrowWandException(WandError,"ContainsNoImages",wand->name);
2966  status=EvaluateImage(wand->images,op,value,wand->exception);
2967  return(status);
2968}
2969
2970/*
2971%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2972%                                                                             %
2973%                                                                             %
2974%                                                                             %
2975%   M a g i c k E x p o r t I m a g e P i x e l s                             %
2976%                                                                             %
2977%                                                                             %
2978%                                                                             %
2979%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2980%
2981%  MagickExportImagePixels() extracts pixel data from an image and returns it
2982%  to you.  The method returns MagickTrue on success otherwise MagickFalse if
2983%  an error is encountered.  The data is returned as char, short int, int,
2984%  ssize_t, float, or double in the order specified by map.
2985%
2986%  Suppose you want to extract the first scanline of a 640x480 image as
2987%  character data in red-green-blue order:
2988%
2989%      MagickExportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
2990%
2991%  The format of the MagickExportImagePixels method is:
2992%
2993%      MagickBooleanType MagickExportImagePixels(MagickWand *wand,
2994%        const ssize_t x,const ssize_t y,const size_t columns,
2995%        const size_t rows,const char *map,const StorageType storage,
2996%        void *pixels)
2997%
2998%  A description of each parameter follows:
2999%
3000%    o wand: the magick wand.
3001%
3002%    o x, y, columns, rows:  These values define the perimeter
3003%      of a region of pixels you want to extract.
3004%
3005%    o map:  This string reflects the expected ordering of the pixel array.
3006%      It can be any combination or order of R = red, G = green, B = blue,
3007%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
3008%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
3009%      P = pad.
3010%
3011%    o storage: Define the data type of the pixels.  Float and double types are
3012%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
3013%      these types: CharPixel, DoublePixel, FloatPixel, IntegerPixel,
3014%      LongPixel, QuantumPixel, or ShortPixel.
3015%
3016%    o pixels: This array of values contain the pixel components as defined by
3017%      map and type.  You must preallocate this array where the expected
3018%      length varies depending on the values of width, height, map, and type.
3019%
3020*/
3021WandExport MagickBooleanType MagickExportImagePixels(MagickWand *wand,
3022  const ssize_t x,const ssize_t y,const size_t columns,
3023  const size_t rows,const char *map,const StorageType storage,
3024  void *pixels)
3025{
3026  MagickBooleanType
3027    status;
3028
3029  assert(wand != (MagickWand *) NULL);
3030  assert(wand->signature == WandSignature);
3031  if (IfMagickTrue(wand->debug))
3032    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3033  if (wand->images == (Image *) NULL)
3034    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3035  status=ExportImagePixels(wand->images,x,y,columns,rows,map,
3036    storage,pixels,wand->exception);
3037  return(status);
3038}
3039
3040/*
3041%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3042%                                                                             %
3043%                                                                             %
3044%                                                                             %
3045%   M a g i c k E x t e n t I m a g e                                         %
3046%                                                                             %
3047%                                                                             %
3048%                                                                             %
3049%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3050%
3051%  MagickExtentImage() extends the image as defined by the geometry, gravity,
3052%  and wand background color.  Set the (x,y) offset of the geometry to move
3053%  the original wand relative to the extended wand.
3054%
3055%  The format of the MagickExtentImage method is:
3056%
3057%      MagickBooleanType MagickExtentImage(MagickWand *wand,const size_t width,
3058%        const size_t height,const ssize_t x,const ssize_t y)
3059%
3060%  A description of each parameter follows:
3061%
3062%    o wand: the magick wand.
3063%
3064%    o width: the region width.
3065%
3066%    o height: the region height.
3067%
3068%    o x: the region x offset.
3069%
3070%    o y: the region y offset.
3071%
3072*/
3073WandExport MagickBooleanType MagickExtentImage(MagickWand *wand,
3074  const size_t width,const size_t height,const ssize_t x,const ssize_t y)
3075{
3076  Image
3077    *extent_image;
3078
3079  RectangleInfo
3080    extent;
3081
3082  assert(wand != (MagickWand *) NULL);
3083  assert(wand->signature == WandSignature);
3084  if (IfMagickTrue(wand->debug))
3085    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3086  if (wand->images == (Image *) NULL)
3087    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3088  extent.width=width;
3089  extent.height=height;
3090  extent.x=x;
3091  extent.y=y;
3092  extent_image=ExtentImage(wand->images,&extent,wand->exception);
3093  if (extent_image == (Image *) NULL)
3094    return(MagickFalse);
3095  ReplaceImageInList(&wand->images,extent_image);
3096  return(MagickTrue);
3097}
3098
3099/*
3100%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3101%                                                                             %
3102%                                                                             %
3103%                                                                             %
3104%   M a g i c k F l i p I m a g e                                             %
3105%                                                                             %
3106%                                                                             %
3107%                                                                             %
3108%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3109%
3110%  MagickFlipImage() creates a vertical mirror image by reflecting the pixels
3111%  around the central x-axis.
3112%
3113%  The format of the MagickFlipImage method is:
3114%
3115%      MagickBooleanType MagickFlipImage(MagickWand *wand)
3116%
3117%  A description of each parameter follows:
3118%
3119%    o wand: the magick wand.
3120%
3121*/
3122WandExport MagickBooleanType MagickFlipImage(MagickWand *wand)
3123{
3124  Image
3125    *flip_image;
3126
3127  assert(wand != (MagickWand *) NULL);
3128  assert(wand->signature == WandSignature);
3129  if (IfMagickTrue(wand->debug))
3130    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3131  if (wand->images == (Image *) NULL)
3132    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3133  flip_image=FlipImage(wand->images,wand->exception);
3134  if (flip_image == (Image *) NULL)
3135    return(MagickFalse);
3136  ReplaceImageInList(&wand->images,flip_image);
3137  return(MagickTrue);
3138}
3139
3140/*
3141%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3142%                                                                             %
3143%                                                                             %
3144%                                                                             %
3145%   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                         %
3146%                                                                             %
3147%                                                                             %
3148%                                                                             %
3149%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3150%
3151%  MagickFloodfillPaintImage() changes the color value of any pixel that matches
3152%  target and is an immediate neighbor.  If the method FillToBorderMethod is
3153%  specified, the color value is changed for any neighbor pixel that does not
3154%  match the bordercolor member of image.
3155%
3156%  The format of the MagickFloodfillPaintImage method is:
3157%
3158%      MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand,
3159%        const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
3160%        const ssize_t x,const ssize_t y,const MagickBooleanType invert)
3161%
3162%  A description of each parameter follows:
3163%
3164%    o wand: the magick wand.
3165%
3166%    o fill: the floodfill color pixel wand.
3167%
3168%    o fuzz: By default target must match a particular pixel color
3169%      exactly.  However, in many cases two colors may differ by a small amount.
3170%      The fuzz member of image defines how much tolerance is acceptable to
3171%      consider two colors as the same.  For example, set fuzz to 10 and the
3172%      color red at intensities of 100 and 102 respectively are now interpreted
3173%      as the same color for the purposes of the floodfill.
3174%
3175%    o bordercolor: the border color pixel wand.
3176%
3177%    o x,y: the starting location of the operation.
3178%
3179%    o invert: paint any pixel that does not match the target color.
3180%
3181*/
3182WandExport MagickBooleanType MagickFloodfillPaintImage(MagickWand *wand,
3183  const PixelWand *fill,const double fuzz,const PixelWand *bordercolor,
3184  const ssize_t x,const ssize_t y,const MagickBooleanType invert)
3185{
3186  DrawInfo
3187    *draw_info;
3188
3189  MagickBooleanType
3190    status;
3191
3192  PixelInfo
3193    target;
3194
3195  assert(wand != (MagickWand *) NULL);
3196  assert(wand->signature == WandSignature);
3197  if (IfMagickTrue(wand->debug))
3198    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3199  if (wand->images == (Image *) NULL)
3200    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3201  draw_info=CloneDrawInfo(wand->image_info,(DrawInfo *) NULL);
3202  PixelGetQuantumPacket(fill,&draw_info->fill);
3203  (void) GetOneVirtualPixelInfo(wand->images,TileVirtualPixelMethod,x %
3204    wand->images->columns,y % wand->images->rows,&target,wand->exception);
3205  if (bordercolor != (PixelWand *) NULL)
3206    PixelGetMagickColor(bordercolor,&target);
3207  wand->images->fuzz=fuzz;
3208  status=FloodfillPaintImage(wand->images,draw_info,&target,x,y,invert,
3209    wand->exception);
3210  draw_info=DestroyDrawInfo(draw_info);
3211  return(status);
3212}
3213
3214/*
3215%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3216%                                                                             %
3217%                                                                             %
3218%                                                                             %
3219%   M a g i c k F l o p I m a g e                                             %
3220%                                                                             %
3221%                                                                             %
3222%                                                                             %
3223%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3224%
3225%  MagickFlopImage() creates a horizontal mirror image by reflecting the pixels
3226%  around the central y-axis.
3227%
3228%  The format of the MagickFlopImage method is:
3229%
3230%      MagickBooleanType MagickFlopImage(MagickWand *wand)
3231%
3232%  A description of each parameter follows:
3233%
3234%    o wand: the magick wand.
3235%
3236*/
3237WandExport MagickBooleanType MagickFlopImage(MagickWand *wand)
3238{
3239  Image
3240    *flop_image;
3241
3242  assert(wand != (MagickWand *) NULL);
3243  assert(wand->signature == WandSignature);
3244  if (IfMagickTrue(wand->debug))
3245    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3246  if (wand->images == (Image *) NULL)
3247    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3248  flop_image=FlopImage(wand->images,wand->exception);
3249  if (flop_image == (Image *) NULL)
3250    return(MagickFalse);
3251  ReplaceImageInList(&wand->images,flop_image);
3252  return(MagickTrue);
3253}
3254
3255/*
3256%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3257%                                                                             %
3258%                                                                             %
3259%                                                                             %
3260%   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                     %
3261%                                                                             %
3262%                                                                             %
3263%                                                                             %
3264%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3265%
3266%  MagickForwardFourierTransformImage() implements the discrete Fourier
3267%  transform (DFT) of the image either as a magnitude / phase or real /
3268%  imaginary image pair.
3269%
3270%  The format of the MagickForwardFourierTransformImage method is:
3271%
3272%      MagickBooleanType MagickForwardFourierTransformImage(MagickWand *wand,
3273%        const MagickBooleanType magnitude)
3274%
3275%  A description of each parameter follows:
3276%
3277%    o wand: the magick wand.
3278%
3279%    o magnitude: if true, return as magnitude / phase pair otherwise a real /
3280%      imaginary image pair.
3281%
3282*/
3283WandExport MagickBooleanType MagickForwardFourierTransformImage(
3284  MagickWand *wand,const MagickBooleanType magnitude)
3285{
3286  Image
3287    *forward_image;
3288
3289  assert(wand != (MagickWand *) NULL);
3290  assert(wand->signature == WandSignature);
3291  if (IfMagickTrue(wand->debug))
3292    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3293  if (wand->images == (Image *) NULL)
3294    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3295  forward_image=ForwardFourierTransformImage(wand->images,magnitude,
3296    wand->exception);
3297  if (forward_image == (Image *) NULL)
3298    return(MagickFalse);
3299  ReplaceImageInList(&wand->images,forward_image);
3300  return(MagickTrue);
3301}
3302
3303/*
3304%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3305%                                                                             %
3306%                                                                             %
3307%                                                                             %
3308%   M a g i c k F r a m e I m a g e                                           %
3309%                                                                             %
3310%                                                                             %
3311%                                                                             %
3312%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3313%
3314%  MagickFrameImage() adds a simulated three-dimensional border around the
3315%  image.  The width and height specify the border width of the vertical and
3316%  horizontal sides of the frame.  The inner and outer bevels indicate the
3317%  width of the inner and outer shadows of the frame.
3318%
3319%  The format of the MagickFrameImage method is:
3320%
3321%      MagickBooleanType MagickFrameImage(MagickWand *wand,
3322%        const PixelWand *matte_color,const size_t width,
3323%        const size_t height,const ssize_t inner_bevel,
3324%        const ssize_t outer_bevel,const CompositeOperator compose)
3325%
3326%  A description of each parameter follows:
3327%
3328%    o wand: the magick wand.
3329%
3330%    o matte_color: the frame color pixel wand.
3331%
3332%    o width: the border width.
3333%
3334%    o height: the border height.
3335%
3336%    o inner_bevel: the inner bevel width.
3337%
3338%    o outer_bevel: the outer bevel width.
3339%
3340%    o compose: the composite operator.
3341%
3342*/
3343WandExport MagickBooleanType MagickFrameImage(MagickWand *wand,
3344  const PixelWand *matte_color,const size_t width,const size_t height,
3345  const ssize_t inner_bevel,const ssize_t outer_bevel,
3346  const CompositeOperator compose)
3347{
3348  Image
3349    *frame_image;
3350
3351  FrameInfo
3352    frame_info;
3353
3354  assert(wand != (MagickWand *) NULL);
3355  assert(wand->signature == WandSignature);
3356  if (IfMagickTrue(wand->debug))
3357    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3358  if (wand->images == (Image *) NULL)
3359    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3360  (void) ResetMagickMemory(&frame_info,0,sizeof(frame_info));
3361  frame_info.width=wand->images->columns+2*width;
3362  frame_info.height=wand->images->rows+2*height;
3363  frame_info.x=(ssize_t) width;
3364  frame_info.y=(ssize_t) height;
3365  frame_info.inner_bevel=inner_bevel;
3366  frame_info.outer_bevel=outer_bevel;
3367  PixelGetQuantumPacket(matte_color,&wand->images->matte_color);
3368  frame_image=FrameImage(wand->images,&frame_info,compose,wand->exception);
3369  if (frame_image == (Image *) NULL)
3370    return(MagickFalse);
3371  ReplaceImageInList(&wand->images,frame_image);
3372  return(MagickTrue);
3373}
3374
3375/*
3376%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3377%                                                                             %
3378%                                                                             %
3379%                                                                             %
3380%   M a g i c k F u n c t i o n I m a g e                                     %
3381%                                                                             %
3382%                                                                             %
3383%                                                                             %
3384%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3385%
3386%  MagickFunctionImage() applys an arithmetic, relational, or logical
3387%  expression to an image.  Use these operators to lighten or darken an image,
3388%  to increase or decrease contrast in an image, or to produce the "negative"
3389%  of an image.
3390%
3391%  The format of the MagickFunctionImage method is:
3392%
3393%      MagickBooleanType MagickFunctionImage(MagickWand *wand,
3394%        const MagickFunction function,const size_t number_arguments,
3395%        const double *arguments)
3396%
3397%  A description of each parameter follows:
3398%
3399%    o wand: the magick wand.
3400%
3401%    o function: the image function.
3402%
3403%    o number_arguments: the number of function arguments.
3404%
3405%    o arguments: the function arguments.
3406%
3407*/
3408WandExport MagickBooleanType MagickFunctionImage(MagickWand *wand,
3409  const MagickFunction function,const size_t number_arguments,
3410  const double *arguments)
3411{
3412  MagickBooleanType
3413    status;
3414
3415  assert(wand != (MagickWand *) NULL);
3416  assert(wand->signature == WandSignature);
3417  if (IfMagickTrue(wand->debug))
3418    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3419  if (wand->images == (Image *) NULL)
3420    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3421  status=FunctionImage(wand->images,function,number_arguments,arguments,
3422    wand->exception);
3423  return(status);
3424}
3425
3426/*
3427%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3428%                                                                             %
3429%                                                                             %
3430%                                                                             %
3431%   M a g i c k F x I m a g e                                                 %
3432%                                                                             %
3433%                                                                             %
3434%                                                                             %
3435%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3436%
3437%  MagickFxImage() evaluate expression for each pixel in the image.
3438%
3439%  The format of the MagickFxImage method is:
3440%
3441%      MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
3442%
3443%  A description of each parameter follows:
3444%
3445%    o wand: the magick wand.
3446%
3447%    o expression: the expression.
3448%
3449*/
3450WandExport MagickWand *MagickFxImage(MagickWand *wand,const char *expression)
3451{
3452  Image
3453    *fx_image;
3454
3455  assert(wand != (MagickWand *) NULL);
3456  assert(wand->signature == WandSignature);
3457  if (IfMagickTrue(wand->debug))
3458    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3459  if (wand->images == (Image *) NULL)
3460    return((MagickWand *) NULL);
3461  fx_image=FxImage(wand->images,expression,wand->exception);
3462  if (fx_image == (Image *) NULL)
3463    return((MagickWand *) NULL);
3464  return(CloneMagickWandFromImages(wand,fx_image));
3465}
3466
3467/*
3468%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3469%                                                                             %
3470%                                                                             %
3471%                                                                             %
3472%   M a g i c k G a m m a I m a g e                                           %
3473%                                                                             %
3474%                                                                             %
3475%                                                                             %
3476%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3477%
3478%  MagickGammaImage() gamma-corrects an image.  The same image viewed on
3479%  different devices will have perceptual differences in the way the image's
3480%  intensities are represented on the screen.  Specify individual gamma levels
3481%  for the red, green, and blue channels, or adjust all three with the gamma
3482%  parameter.  Values typically range from 0.8 to 2.3.
3483%
3484%  You can also reduce the influence of a particular channel with a gamma
3485%  value of 0.
3486%
3487%  The format of the MagickGammaImage method is:
3488%
3489%      MagickBooleanType MagickGammaImage(MagickWand *wand,const double gamma)
3490%
3491%  A description of each parameter follows:
3492%
3493%    o wand: the magick wand.
3494%
3495%    o level: Define the level of gamma correction.
3496%
3497*/
3498WandExport MagickBooleanType MagickGammaImage(MagickWand *wand,
3499  const double gamma)
3500{
3501  MagickBooleanType
3502    status;
3503
3504  assert(wand != (MagickWand *) NULL);
3505  assert(wand->signature == WandSignature);
3506  if (IfMagickTrue(wand->debug))
3507    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3508  if (wand->images == (Image *) NULL)
3509    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3510  status=GammaImage(wand->images,gamma,wand->exception);
3511  return(status);
3512}
3513
3514/*
3515%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3516%                                                                             %
3517%                                                                             %
3518%                                                                             %
3519%   M a g i c k G a u s s i a n B l u r I m a g e                             %
3520%                                                                             %
3521%                                                                             %
3522%                                                                             %
3523%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3524%
3525%  MagickGaussianBlurImage() blurs an image.  We convolve the image with a
3526%  Gaussian operator of the given radius and standard deviation (sigma).
3527%  For reasonable results, the radius should be larger than sigma.  Use a
3528%  radius of 0 and MagickGaussianBlurImage() selects a suitable radius for you.
3529%
3530%  The format of the MagickGaussianBlurImage method is:
3531%
3532%      MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
3533%        const double radius,const double sigma)
3534%
3535%  A description of each parameter follows:
3536%
3537%    o wand: the magick wand.
3538%
3539%    o radius: the radius of the Gaussian, in pixels, not counting the center
3540%      pixel.
3541%
3542%    o sigma: the standard deviation of the Gaussian, in pixels.
3543%
3544*/
3545WandExport MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
3546  const double radius,const double sigma)
3547{
3548  Image
3549    *blur_image;
3550
3551  assert(wand != (MagickWand *) NULL);
3552  assert(wand->signature == WandSignature);
3553  if (IfMagickTrue(wand->debug))
3554    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3555  if (wand->images == (Image *) NULL)
3556    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3557  blur_image=GaussianBlurImage(wand->images,radius,sigma,wand->exception);
3558  if (blur_image == (Image *) NULL)
3559    return(MagickFalse);
3560  ReplaceImageInList(&wand->images,blur_image);
3561  return(MagickTrue);
3562}
3563
3564/*
3565%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3566%                                                                             %
3567%                                                                             %
3568%                                                                             %
3569%   M a g i c k G e t I m a g e                                               %
3570%                                                                             %
3571%                                                                             %
3572%                                                                             %
3573%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3574%
3575%  MagickGetImage() gets the image at the current image index.
3576%
3577%  The format of the MagickGetImage method is:
3578%
3579%      MagickWand *MagickGetImage(MagickWand *wand)
3580%
3581%  A description of each parameter follows:
3582%
3583%    o wand: the magick wand.
3584%
3585*/
3586WandExport MagickWand *MagickGetImage(MagickWand *wand)
3587{
3588  Image
3589    *image;
3590
3591  assert(wand != (MagickWand *) NULL);
3592  assert(wand->signature == WandSignature);
3593  if (IfMagickTrue(wand->debug))
3594    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3595  if (wand->images == (Image *) NULL)
3596    {
3597      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3598        "ContainsNoImages","`%s'",wand->name);
3599      return((MagickWand *) NULL);
3600    }
3601  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
3602  if (image == (Image *) NULL)
3603    return((MagickWand *) NULL);
3604  return(CloneMagickWandFromImages(wand,image));
3605}
3606
3607/*
3608%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3609%                                                                             %
3610%                                                                             %
3611%                                                                             %
3612%   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                       %
3613%                                                                             %
3614%                                                                             %
3615%                                                                             %
3616%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3617%
3618%  MagickGetImageAlphaChannel() returns MagickFalse if the image alpha channel
3619%  is not activated.  That is, the image is RGB rather than RGBA or CMYK rather
3620%  than CMYKA.
3621%
3622%  The format of the MagickGetImageAlphaChannel method is:
3623%
3624%      MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand)
3625%
3626%  A description of each parameter follows:
3627%
3628%    o wand: the magick wand.
3629%
3630*/
3631WandExport MagickBooleanType MagickGetImageAlphaChannel(MagickWand *wand)
3632{
3633  assert(wand != (MagickWand *) NULL);
3634  assert(wand->signature == WandSignature);
3635  if (IfMagickTrue(wand->debug))
3636    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3637  if (wand->images == (Image *) NULL)
3638    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3639  return(GetImageAlphaChannel(wand->images));
3640}
3641
3642/*
3643%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3644%                                                                             %
3645%                                                                             %
3646%                                                                             %
3647%   M a g i c k G e t I m a g e C l i p M a s k                               %
3648%                                                                             %
3649%                                                                             %
3650%                                                                             %
3651%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3652%
3653%  MagickGetImageMask() gets the image clip mask at the current image index.
3654%
3655%  The format of the MagickGetImageMask method is:
3656%
3657%      MagickWand *MagickGetImageMask(MagickWand *wand)
3658%
3659%  A description of each parameter follows:
3660%
3661%    o wand: the magick wand.
3662%
3663*/
3664WandExport MagickWand *MagickGetImageMask(MagickWand *wand)
3665{
3666  Image
3667    *image;
3668
3669  assert(wand != (MagickWand *) NULL);
3670  assert(wand->signature == WandSignature);
3671  if (IfMagickTrue(wand->debug))
3672    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3673  if (wand->images == (Image *) NULL)
3674    {
3675      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3676        "ContainsNoImages","`%s'",wand->name);
3677      return((MagickWand *) NULL);
3678    }
3679  image=GetImageMask(wand->images,wand->exception);
3680  if (image == (Image *) NULL)
3681    return((MagickWand *) NULL);
3682  return(CloneMagickWandFromImages(wand,image));
3683}
3684
3685/*
3686%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3687%                                                                             %
3688%                                                                             %
3689%                                                                             %
3690%   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                 %
3691%                                                                             %
3692%                                                                             %
3693%                                                                             %
3694%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3695%
3696%  MagickGetImageBackgroundColor() returns the image background color.
3697%
3698%  The format of the MagickGetImageBackgroundColor method is:
3699%
3700%      MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand,
3701%        PixelWand *background_color)
3702%
3703%  A description of each parameter follows:
3704%
3705%    o wand: the magick wand.
3706%
3707%    o background_color: Return the background color.
3708%
3709*/
3710WandExport MagickBooleanType MagickGetImageBackgroundColor(MagickWand *wand,
3711  PixelWand *background_color)
3712{
3713  assert(wand != (MagickWand *) NULL);
3714  assert(wand->signature == WandSignature);
3715  if (IfMagickTrue(wand->debug))
3716    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3717  if (wand->images == (Image *) NULL)
3718    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3719  PixelSetPixelColor(background_color,&wand->images->background_color);
3720  return(MagickTrue);
3721}
3722
3723/*
3724%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3725%                                                                             %
3726%                                                                             %
3727%                                                                             %
3728%   M a g i c k G e t I m a g e B l o b                                       %
3729%                                                                             %
3730%                                                                             %
3731%                                                                             %
3732%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3733%
3734%  MagickGetImageBlob() implements direct to memory image formats.  It returns
3735%  the image as a blob (a formatted "file" in memory) and its length, starting
3736%  from the current position in the image sequence.  Use MagickSetImageFormat()
3737%  to set the format to write to the blob (GIF, JPEG,  PNG, etc.).
3738%
3739%  Utilize MagickResetIterator() to ensure the write is from the beginning of
3740%  the image sequence.
3741%
3742%  Use MagickRelinquishMemory() to free the blob when you are done with it.
3743%
3744%  The format of the MagickGetImageBlob method is:
3745%
3746%      unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length)
3747%
3748%  A description of each parameter follows:
3749%
3750%    o wand: the magick wand.
3751%
3752%    o length: the length of the blob.
3753%
3754*/
3755WandExport unsigned char *MagickGetImageBlob(MagickWand *wand,size_t *length)
3756{
3757  assert(wand != (MagickWand *) NULL);
3758  assert(wand->signature == WandSignature);
3759  if (IfMagickTrue(wand->debug))
3760    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3761  if (wand->images == (Image *) NULL)
3762    {
3763      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3764        "ContainsNoImages","`%s'",wand->name);
3765      return((unsigned char *) NULL);
3766    }
3767  return(ImageToBlob(wand->image_info,wand->images,length,wand->exception));
3768}
3769
3770/*
3771%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3772%                                                                             %
3773%                                                                             %
3774%                                                                             %
3775%   M a g i c k G e t I m a g e s B l o b                                     %
3776%                                                                             %
3777%                                                                             %
3778%                                                                             %
3779%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3780%
3781%  MagickGetImageBlob() implements direct to memory image formats.  It
3782%  returns the image sequence as a blob and its length.  The format of the image
3783%  determines the format of the returned blob (GIF, JPEG,  PNG, etc.).  To
3784%  return a different image format, use MagickSetImageFormat().
3785%
3786%  Note, some image formats do not permit multiple images to the same image
3787%  stream (e.g. JPEG).  in this instance, just the first image of the
3788%  sequence is returned as a blob.
3789%
3790%  The format of the MagickGetImagesBlob method is:
3791%
3792%      unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length)
3793%
3794%  A description of each parameter follows:
3795%
3796%    o wand: the magick wand.
3797%
3798%    o length: the length of the blob.
3799%
3800*/
3801WandExport unsigned char *MagickGetImagesBlob(MagickWand *wand,size_t *length)
3802{
3803  unsigned char
3804    *blob;
3805
3806  assert(wand != (MagickWand *) NULL);
3807  assert(wand->signature == WandSignature);
3808  if (IfMagickTrue(wand->debug))
3809    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3810  if (wand->images == (Image *) NULL)
3811    {
3812      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3813        "ContainsNoImages","`%s'",wand->name);
3814      return((unsigned char *) NULL);
3815    }
3816  blob=ImagesToBlob(wand->image_info,GetFirstImageInList(wand->images),length,
3817    wand->exception);
3818  return(blob);
3819}
3820
3821/*
3822%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3823%                                                                             %
3824%                                                                             %
3825%                                                                             %
3826%   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                         %
3827%                                                                             %
3828%                                                                             %
3829%                                                                             %
3830%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3831%
3832%  MagickGetImageBluePrimary() returns the chromaticy blue primary point for the
3833%  image.
3834%
3835%  The format of the MagickGetImageBluePrimary method is:
3836%
3837%      MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,double *x,
3838%        double *y)
3839%
3840%  A description of each parameter follows:
3841%
3842%    o wand: the magick wand.
3843%
3844%    o x: the chromaticity blue primary x-point.
3845%
3846%    o y: the chromaticity blue primary y-point.
3847%
3848*/
3849WandExport MagickBooleanType MagickGetImageBluePrimary(MagickWand *wand,
3850  double *x,double *y)
3851{
3852  assert(wand != (MagickWand *) NULL);
3853  assert(wand->signature == WandSignature);
3854  if (IfMagickTrue(wand->debug))
3855    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3856  if (wand->images == (Image *) NULL)
3857    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3858  *x=wand->images->chromaticity.blue_primary.x;
3859  *y=wand->images->chromaticity.blue_primary.y;
3860  return(MagickTrue);
3861}
3862
3863/*
3864%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3865%                                                                             %
3866%                                                                             %
3867%                                                                             %
3868%   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                         %
3869%                                                                             %
3870%                                                                             %
3871%                                                                             %
3872%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3873%
3874%  MagickGetImageBorderColor() returns the image border color.
3875%
3876%  The format of the MagickGetImageBorderColor method is:
3877%
3878%      MagickBooleanType MagickGetImageBorderColor(MagickWand *wand,
3879%        PixelWand *border_color)
3880%
3881%  A description of each parameter follows:
3882%
3883%    o wand: the magick wand.
3884%
3885%    o border_color: Return the border color.
3886%
3887*/
3888WandExport MagickBooleanType MagickGetImageBorderColor(MagickWand *wand,
3889  PixelWand *border_color)
3890{
3891  assert(wand != (MagickWand *) NULL);
3892  assert(wand->signature == WandSignature);
3893  if (IfMagickTrue(wand->debug))
3894    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3895  if (wand->images == (Image *) NULL)
3896    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3897  PixelSetPixelColor(border_color,&wand->images->border_color);
3898  return(MagickTrue);
3899}
3900
3901/*
3902%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3903%                                                                             %
3904%                                                                             %
3905%                                                                             %
3906%   M a g i c k G e t I m a g e F e a t u r e s                               %
3907%                                                                             %
3908%                                                                             %
3909%                                                                             %
3910%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3911%
3912%  MagickGetImageFeatures() returns features for each channel in the
3913%  image in each of four directions (horizontal, vertical, left and right
3914%  diagonals) for the specified distance.  The features include the angular
3915%  second moment, contrast, correlation, sum of squares: variance, inverse
3916%  difference moment, sum average, sum varience, sum entropy, entropy,
3917%  difference variance, difference entropy, information measures of
3918%  correlation 1, information measures of correlation 2, and maximum
3919%  correlation coefficient.  You can access the red channel contrast, for
3920%  example, like this:
3921%
3922%      channel_features=MagickGetImageFeatures(wand,1);
3923%      contrast=channel_features[RedPixelChannel].contrast[0];
3924%
3925%  Use MagickRelinquishMemory() to free the statistics buffer.
3926%
3927%  The format of the MagickGetImageFeatures method is:
3928%
3929%      ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
3930%        const size_t distance)
3931%
3932%  A description of each parameter follows:
3933%
3934%    o wand: the magick wand.
3935%
3936%    o distance: the distance.
3937%
3938*/
3939WandExport ChannelFeatures *MagickGetImageFeatures(MagickWand *wand,
3940  const size_t distance)
3941{
3942  assert(wand != (MagickWand *) NULL);
3943  assert(wand->signature == WandSignature);
3944  if (IfMagickTrue(wand->debug))
3945    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3946  if (wand->images == (Image *) NULL)
3947    {
3948      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
3949        "ContainsNoImages","`%s'",wand->name);
3950      return((ChannelFeatures *) NULL);
3951    }
3952  return(GetImageFeatures(wand->images,distance,wand->exception));
3953}
3954
3955/*
3956%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3957%                                                                             %
3958%                                                                             %
3959%                                                                             %
3960%   M a g i c k G e t I m a g e K u r t o s i s                               %
3961%                                                                             %
3962%                                                                             %
3963%                                                                             %
3964%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3965%
3966%  MagickGetImageKurtosis() gets the kurtosis and skewness of one or
3967%  more image channels.
3968%
3969%  The format of the MagickGetImageKurtosis method is:
3970%
3971%      MagickBooleanType MagickGetImageKurtosis(MagickWand *wand,
3972%        double *kurtosis,double *skewness)
3973%
3974%  A description of each parameter follows:
3975%
3976%    o wand: the magick wand.
3977%
3978%    o kurtosis:  The kurtosis for the specified channel(s).
3979%
3980%    o skewness:  The skewness for the specified channel(s).
3981%
3982*/
3983WandExport MagickBooleanType MagickGetImageKurtosis(MagickWand *wand,
3984  double *kurtosis,double *skewness)
3985{
3986  MagickBooleanType
3987    status;
3988
3989  assert(wand != (MagickWand *) NULL);
3990  assert(wand->signature == WandSignature);
3991  if (IfMagickTrue(wand->debug))
3992    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
3993  if (wand->images == (Image *) NULL)
3994    ThrowWandException(WandError,"ContainsNoImages",wand->name);
3995  status=GetImageKurtosis(wand->images,kurtosis,skewness,wand->exception);
3996  return(status);
3997}
3998
3999/*
4000%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4001%                                                                             %
4002%                                                                             %
4003%                                                                             %
4004%   M a g i c k G e t I m a g e M e a n                                       %
4005%                                                                             %
4006%                                                                             %
4007%                                                                             %
4008%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4009%
4010%  MagickGetImageMean() gets the mean and standard deviation of one or more
4011%  image channels.
4012%
4013%  The format of the MagickGetImageMean method is:
4014%
4015%      MagickBooleanType MagickGetImageMean(MagickWand *wand,double *mean,
4016%        double *standard_deviation)
4017%
4018%  A description of each parameter follows:
4019%
4020%    o wand: the magick wand.
4021%
4022%    o channel: the image channel(s).
4023%
4024%    o mean:  The mean pixel value for the specified channel(s).
4025%
4026%    o standard_deviation:  The standard deviation for the specified channel(s).
4027%
4028*/
4029WandExport MagickBooleanType MagickGetImageMean(MagickWand *wand,double *mean,
4030  double *standard_deviation)
4031{
4032  MagickBooleanType
4033    status;
4034
4035  assert(wand != (MagickWand *) NULL);
4036  assert(wand->signature == WandSignature);
4037  if (IfMagickTrue(wand->debug))
4038    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4039  if (wand->images == (Image *) NULL)
4040    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4041  status=GetImageMean(wand->images,mean,standard_deviation,wand->exception);
4042  return(status);
4043}
4044
4045/*
4046%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4047%                                                                             %
4048%                                                                             %
4049%                                                                             %
4050%   M a g i c k G e t I m a g e R a n g e                                     %
4051%                                                                             %
4052%                                                                             %
4053%                                                                             %
4054%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4055%
4056%  MagickGetImageRange() gets the range for one or more image channels.
4057%
4058%  The format of the MagickGetImageRange method is:
4059%
4060%      MagickBooleanType MagickGetImageRange(MagickWand *wand,double *minima,
4061%        double *maxima)
4062%
4063%  A description of each parameter follows:
4064%
4065%    o wand: the magick wand.
4066%
4067%    o minima:  The minimum pixel value for the specified channel(s).
4068%
4069%    o maxima:  The maximum pixel value for the specified channel(s).
4070%
4071*/
4072WandExport MagickBooleanType MagickGetImageRange(MagickWand *wand,
4073  double *minima,double *maxima)
4074{
4075  MagickBooleanType
4076    status;
4077
4078  assert(wand != (MagickWand *) NULL);
4079  assert(wand->signature == WandSignature);
4080  if (IfMagickTrue(wand->debug))
4081    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4082  if (wand->images == (Image *) NULL)
4083    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4084  status=GetImageRange(wand->images,minima,maxima,wand->exception);
4085  return(status);
4086}
4087
4088/*
4089%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4090%                                                                             %
4091%                                                                             %
4092%                                                                             %
4093%   M a g i c k G e t I m a g e S t a t i s t i c s                           %
4094%                                                                             %
4095%                                                                             %
4096%                                                                             %
4097%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4098%
4099%  MagickGetImageStatistics() returns statistics for each channel in the
4100%  image.  The statistics include the channel depth, its minima and
4101%  maxima, the mean, the standard deviation, the kurtosis and the skewness.
4102%  You can access the red channel mean, for example, like this:
4103%
4104%      channel_statistics=MagickGetImageStatistics(wand);
4105%      red_mean=channel_statistics[RedPixelChannel].mean;
4106%
4107%  Use MagickRelinquishMemory() to free the statistics buffer.
4108%
4109%  The format of the MagickGetImageStatistics method is:
4110%
4111%      ChannelStatistics *MagickGetImageStatistics(MagickWand *wand)
4112%
4113%  A description of each parameter follows:
4114%
4115%    o wand: the magick wand.
4116%
4117*/
4118WandExport ChannelStatistics *MagickGetImageStatistics(MagickWand *wand)
4119{
4120  assert(wand != (MagickWand *) NULL);
4121  assert(wand->signature == WandSignature);
4122  if (IfMagickTrue(wand->debug))
4123    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4124  if (wand->images == (Image *) NULL)
4125    {
4126      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4127        "ContainsNoImages","`%s'",wand->name);
4128      return((ChannelStatistics *) NULL);
4129    }
4130  return(GetImageStatistics(wand->images,wand->exception));
4131}
4132
4133/*
4134%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4135%                                                                             %
4136%                                                                             %
4137%                                                                             %
4138%   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                     %
4139%                                                                             %
4140%                                                                             %
4141%                                                                             %
4142%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4143%
4144%  MagickGetImageColormapColor() returns the color of the specified colormap
4145%  index.
4146%
4147%  The format of the MagickGetImageColormapColor method is:
4148%
4149%      MagickBooleanType MagickGetImageColormapColor(MagickWand *wand,
4150%        const size_t index,PixelWand *color)
4151%
4152%  A description of each parameter follows:
4153%
4154%    o wand: the magick wand.
4155%
4156%    o index: the offset into the image colormap.
4157%
4158%    o color: Return the colormap color in this wand.
4159%
4160*/
4161WandExport MagickBooleanType MagickGetImageColormapColor(MagickWand *wand,
4162  const size_t index,PixelWand *color)
4163{
4164  assert(wand != (MagickWand *) NULL);
4165  assert(wand->signature == WandSignature);
4166  if (IfMagickTrue(wand->debug))
4167    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4168  if (wand->images == (Image *) NULL)
4169    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4170  if ((wand->images->colormap == (PixelInfo *) NULL) ||
4171      (index >= wand->images->colors))
4172    {
4173      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4174        "InvalidColormapIndex","`%s'",wand->name);
4175      return(MagickFalse);
4176    }
4177  PixelSetPixelColor(color,wand->images->colormap+index);
4178  return(MagickTrue);
4179}
4180
4181/*
4182%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4183%                                                                             %
4184%                                                                             %
4185%                                                                             %
4186%   M a g i c k G e t I m a g e C o l o r s                                   %
4187%                                                                             %
4188%                                                                             %
4189%                                                                             %
4190%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4191%
4192%  MagickGetImageColors() gets the number of unique colors in the image.
4193%
4194%  The format of the MagickGetImageColors method is:
4195%
4196%      size_t MagickGetImageColors(MagickWand *wand)
4197%
4198%  A description of each parameter follows:
4199%
4200%    o wand: the magick wand.
4201%
4202*/
4203WandExport size_t MagickGetImageColors(MagickWand *wand)
4204{
4205  assert(wand != (MagickWand *) NULL);
4206  assert(wand->signature == WandSignature);
4207  if (IfMagickTrue(wand->debug))
4208    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4209  if (wand->images == (Image *) NULL)
4210    {
4211      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4212        "ContainsNoImages","`%s'",wand->name);
4213      return(0);
4214    }
4215  return(GetNumberColors(wand->images,(FILE *) NULL,wand->exception));
4216}
4217
4218/*
4219%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4220%                                                                             %
4221%                                                                             %
4222%                                                                             %
4223%   M a g i c k G e t I m a g e C o l o r s p a c e                           %
4224%                                                                             %
4225%                                                                             %
4226%                                                                             %
4227%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4228%
4229%  MagickGetImageColorspace() gets the image colorspace.
4230%
4231%  The format of the MagickGetImageColorspace method is:
4232%
4233%      ColorspaceType MagickGetImageColorspace(MagickWand *wand)
4234%
4235%  A description of each parameter follows:
4236%
4237%    o wand: the magick wand.
4238%
4239*/
4240WandExport ColorspaceType MagickGetImageColorspace(MagickWand *wand)
4241{
4242  assert(wand != (MagickWand *) NULL);
4243  assert(wand->signature == WandSignature);
4244  if (IfMagickTrue(wand->debug))
4245    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4246  if (wand->images == (Image *) NULL)
4247    {
4248      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4249        "ContainsNoImages","`%s'",wand->name);
4250      return(UndefinedColorspace);
4251    }
4252  return(wand->images->colorspace);
4253}
4254
4255/*
4256%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4257%                                                                             %
4258%                                                                             %
4259%                                                                             %
4260%   M a g i c k G e t I m a g e C o m p o s e                                 %
4261%                                                                             %
4262%                                                                             %
4263%                                                                             %
4264%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4265%
4266%  MagickGetImageCompose() returns the composite operator associated with the
4267%  image.
4268%
4269%  The format of the MagickGetImageCompose method is:
4270%
4271%      CompositeOperator MagickGetImageCompose(MagickWand *wand)
4272%
4273%  A description of each parameter follows:
4274%
4275%    o wand: the magick wand.
4276%
4277*/
4278WandExport CompositeOperator MagickGetImageCompose(MagickWand *wand)
4279{
4280  assert(wand != (MagickWand *) NULL);
4281  assert(wand->signature == WandSignature);
4282  if (IfMagickTrue(wand->debug))
4283    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4284  if (wand->images == (Image *) NULL)
4285    {
4286      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4287        "ContainsNoImages","`%s'",wand->name);
4288      return(UndefinedCompositeOp);
4289    }
4290  return(wand->images->compose);
4291}
4292
4293/*
4294%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4295%                                                                             %
4296%                                                                             %
4297%                                                                             %
4298%   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                         %
4299%                                                                             %
4300%                                                                             %
4301%                                                                             %
4302%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4303%
4304%  MagickGetImageCompression() gets the image compression.
4305%
4306%  The format of the MagickGetImageCompression method is:
4307%
4308%      CompressionType MagickGetImageCompression(MagickWand *wand)
4309%
4310%  A description of each parameter follows:
4311%
4312%    o wand: the magick wand.
4313%
4314*/
4315WandExport CompressionType MagickGetImageCompression(MagickWand *wand)
4316{
4317  assert(wand != (MagickWand *) NULL);
4318  assert(wand->signature == WandSignature);
4319  if (IfMagickTrue(wand->debug))
4320    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4321  if (wand->images == (Image *) NULL)
4322    {
4323      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4324        "ContainsNoImages","`%s'",wand->name);
4325      return(UndefinedCompression);
4326    }
4327  return(wand->images->compression);
4328}
4329
4330/*
4331%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4332%                                                                             %
4333%                                                                             %
4334%                                                                             %
4335%   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           %
4336%                                                                             %
4337%                                                                             %
4338%                                                                             %
4339%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4340%
4341%  MagickGetImageCompressionQuality() gets the image compression quality.
4342%
4343%  The format of the MagickGetImageCompressionQuality method is:
4344%
4345%      size_t MagickGetImageCompressionQuality(MagickWand *wand)
4346%
4347%  A description of each parameter follows:
4348%
4349%    o wand: the magick wand.
4350%
4351*/
4352WandExport size_t MagickGetImageCompressionQuality(MagickWand *wand)
4353{
4354  assert(wand != (MagickWand *) NULL);
4355  assert(wand->signature == WandSignature);
4356  if (IfMagickTrue(wand->debug))
4357    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4358  if (wand->images == (Image *) NULL)
4359    {
4360      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4361        "ContainsNoImages","`%s'",wand->name);
4362      return(0UL);
4363    }
4364  return(wand->images->quality);
4365}
4366
4367/*
4368%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4369%                                                                             %
4370%                                                                             %
4371%                                                                             %
4372%   M a g i c k G e t I m a g e D e l a y                                     %
4373%                                                                             %
4374%                                                                             %
4375%                                                                             %
4376%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4377%
4378%  MagickGetImageDelay() gets the image delay.
4379%
4380%  The format of the MagickGetImageDelay method is:
4381%
4382%      size_t MagickGetImageDelay(MagickWand *wand)
4383%
4384%  A description of each parameter follows:
4385%
4386%    o wand: the magick wand.
4387%
4388*/
4389WandExport size_t MagickGetImageDelay(MagickWand *wand)
4390{
4391  assert(wand != (MagickWand *) NULL);
4392  assert(wand->signature == WandSignature);
4393  if (IfMagickTrue(wand->debug))
4394    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4395  if (wand->images == (Image *) NULL)
4396    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4397  return(wand->images->delay);
4398}
4399
4400/*
4401%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4402%                                                                             %
4403%                                                                             %
4404%                                                                             %
4405%   M a g i c k G e t I m a g e D e p t h                                     %
4406%                                                                             %
4407%                                                                             %
4408%                                                                             %
4409%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4410%
4411%  MagickGetImageDepth() gets the image depth.
4412%
4413%  The format of the MagickGetImageDepth method is:
4414%
4415%      size_t MagickGetImageDepth(MagickWand *wand)
4416%
4417%  A description of each parameter follows:
4418%
4419%    o wand: the magick wand.
4420%
4421*/
4422WandExport size_t MagickGetImageDepth(MagickWand *wand)
4423{
4424  assert(wand != (MagickWand *) NULL);
4425  assert(wand->signature == WandSignature);
4426  if (IfMagickTrue(wand->debug))
4427    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4428  if (wand->images == (Image *) NULL)
4429    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4430  return(wand->images->depth);
4431}
4432
4433/*
4434%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4435%                                                                             %
4436%                                                                             %
4437%                                                                             %
4438%   M a g i c k G e t I m a g e D i s p o s e                                 %
4439%                                                                             %
4440%                                                                             %
4441%                                                                             %
4442%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4443%
4444%  MagickGetImageDispose() gets the image disposal method.
4445%
4446%  The format of the MagickGetImageDispose method is:
4447%
4448%      DisposeType MagickGetImageDispose(MagickWand *wand)
4449%
4450%  A description of each parameter follows:
4451%
4452%    o wand: the magick wand.
4453%
4454*/
4455WandExport DisposeType MagickGetImageDispose(MagickWand *wand)
4456{
4457  assert(wand != (MagickWand *) NULL);
4458  assert(wand->signature == WandSignature);
4459  if (IfMagickTrue(wand->debug))
4460    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4461  if (wand->images == (Image *) NULL)
4462    {
4463      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4464        "ContainsNoImages","`%s'",wand->name);
4465      return(UndefinedDispose);
4466    }
4467  return((DisposeType) wand->images->dispose);
4468}
4469
4470/*
4471%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4472%                                                                             %
4473%                                                                             %
4474%                                                                             %
4475%   M a g i c k G e t I m a g e D i s t o r t i o n                           %
4476%                                                                             %
4477%                                                                             %
4478%                                                                             %
4479%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4480%
4481%  MagickGetImageDistortion() compares an image to a reconstructed image and
4482%  returns the specified distortion metric.
4483%
4484%  The format of the MagickGetImageDistortion method is:
4485%
4486%      MagickBooleanType MagickGetImageDistortion(MagickWand *wand,
4487%        const MagickWand *reference,const MetricType metric,
4488%        double *distortion)
4489%
4490%  A description of each parameter follows:
4491%
4492%    o wand: the magick wand.
4493%
4494%    o reference: the reference wand.
4495%
4496%    o metric: the metric.
4497%
4498%    o distortion: the computed distortion between the images.
4499%
4500*/
4501WandExport MagickBooleanType MagickGetImageDistortion(MagickWand *wand,
4502  const MagickWand *reference,const MetricType metric,double *distortion)
4503{
4504  MagickBooleanType
4505    status;
4506
4507  assert(wand != (MagickWand *) NULL);
4508  assert(wand->signature == WandSignature);
4509  if (IfMagickTrue(wand->debug))
4510    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4511  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
4512    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4513  status=GetImageDistortion(wand->images,reference->images,metric,distortion,
4514    wand->exception);
4515  return(status);
4516}
4517
4518/*
4519%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4520%                                                                             %
4521%                                                                             %
4522%                                                                             %
4523%   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                         %
4524%                                                                             %
4525%                                                                             %
4526%                                                                             %
4527%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4528%
4529%  MagickGetImageDistortions() compares one or more pixel channels of an
4530%  image to a reconstructed image and returns the specified distortion metrics.
4531%
4532%  Use MagickRelinquishMemory() to free the metrics when you are done with them.
4533%
4534%  The format of the MagickGetImageDistortion method is:
4535%
4536%      double *MagickGetImageDistortion(MagickWand *wand,
4537%        const MagickWand *reference,const MetricType metric)
4538%
4539%  A description of each parameter follows:
4540%
4541%    o wand: the magick wand.
4542%
4543%    o reference: the reference wand.
4544%
4545%    o metric: the metric.
4546%
4547*/
4548WandExport double *MagickGetImageDistortions(MagickWand *wand,
4549  const MagickWand *reference,const MetricType metric)
4550{
4551  double
4552    *channel_distortion;
4553
4554  assert(wand != (MagickWand *) NULL);
4555  assert(wand->signature == WandSignature);
4556  if (IfMagickTrue(wand->debug))
4557    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4558  assert(reference != (MagickWand *) NULL);
4559  assert(reference->signature == WandSignature);
4560  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
4561    {
4562      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4563        "ContainsNoImages","`%s'",wand->name);
4564      return((double *) NULL);
4565    }
4566  channel_distortion=GetImageDistortions(wand->images,reference->images,
4567    metric,wand->exception);
4568  return(channel_distortion);
4569}
4570
4571/*
4572%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4573%                                                                             %
4574%                                                                             %
4575%                                                                             %
4576%   M a g i c k G e t I m a g e E n d i a n                                   %
4577%                                                                             %
4578%                                                                             %
4579%                                                                             %
4580%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4581%
4582%  MagickGetImageEndian() gets the image endian.
4583%
4584%  The format of the MagickGetImageEndian method is:
4585%
4586%      EndianType MagickGetImageEndian(MagickWand *wand)
4587%
4588%  A description of each parameter follows:
4589%
4590%    o wand: the magick wand.
4591%
4592*/
4593WandExport EndianType MagickGetImageEndian(MagickWand *wand)
4594{
4595  assert(wand != (MagickWand *) NULL);
4596  assert(wand->signature == WandSignature);
4597  if (IfMagickTrue(wand->debug))
4598    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4599  if (wand->images == (Image *) NULL)
4600    {
4601      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4602        "ContainsNoImages","`%s'",wand->name);
4603      return(UndefinedEndian);
4604    }
4605  return(wand->images->endian);
4606}
4607
4608/*
4609%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4610%                                                                             %
4611%                                                                             %
4612%                                                                             %
4613%   M a g i c k G e t I m a g e F i l e n a m e                               %
4614%                                                                             %
4615%                                                                             %
4616%                                                                             %
4617%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4618%
4619%  MagickGetImageFilename() returns the filename of a particular image in a
4620%  sequence.
4621%
4622%  The format of the MagickGetImageFilename method is:
4623%
4624%      char *MagickGetImageFilename(MagickWand *wand)
4625%
4626%  A description of each parameter follows:
4627%
4628%    o wand: the magick wand.
4629%
4630*/
4631WandExport char *MagickGetImageFilename(MagickWand *wand)
4632{
4633  assert(wand != (MagickWand *) NULL);
4634  assert(wand->signature == WandSignature);
4635  if (IfMagickTrue(wand->debug))
4636    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4637  if (wand->images == (Image *) NULL)
4638    {
4639      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4640        "ContainsNoImages","`%s'",wand->name);
4641      return((char *) NULL);
4642    }
4643  return(AcquireString(wand->images->filename));
4644}
4645
4646/*
4647%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4648%                                                                             %
4649%                                                                             %
4650%                                                                             %
4651%   M a g i c k G e t I m a g e F o r m a t                                   %
4652%                                                                             %
4653%                                                                             %
4654%                                                                             %
4655%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4656%
4657%  MagickGetImageFormat() returns the format of a particular image in a
4658%  sequence.
4659%
4660%  The format of the MagickGetImageFormat method is:
4661%
4662%      char *MagickGetImageFormat(MagickWand *wand)
4663%
4664%  A description of each parameter follows:
4665%
4666%    o wand: the magick wand.
4667%
4668*/
4669WandExport char *MagickGetImageFormat(MagickWand *wand)
4670{
4671  assert(wand != (MagickWand *) NULL);
4672  assert(wand->signature == WandSignature);
4673  if (IfMagickTrue(wand->debug))
4674    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4675  if (wand->images == (Image *) NULL)
4676    {
4677      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4678        "ContainsNoImages","`%s'",wand->name);
4679      return((char *) NULL);
4680    }
4681  return(AcquireString(wand->images->magick));
4682}
4683
4684/*
4685%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4686%                                                                             %
4687%                                                                             %
4688%                                                                             %
4689%   M a g i c k G e t I m a g e F u z z                                       %
4690%                                                                             %
4691%                                                                             %
4692%                                                                             %
4693%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4694%
4695%  MagickGetImageFuzz() gets the image fuzz.
4696%
4697%  The format of the MagickGetImageFuzz method is:
4698%
4699%      double MagickGetImageFuzz(MagickWand *wand)
4700%
4701%  A description of each parameter follows:
4702%
4703%    o wand: the magick wand.
4704%
4705*/
4706WandExport double MagickGetImageFuzz(MagickWand *wand)
4707{
4708  assert(wand != (MagickWand *) NULL);
4709  assert(wand->signature == WandSignature);
4710  if (IfMagickTrue(wand->debug))
4711    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4712  if (wand->images == (Image *) NULL)
4713    {
4714      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4715        "ContainsNoImages","`%s'",wand->name);
4716      return(0.0);
4717    }
4718  return(wand->images->fuzz);
4719}
4720
4721/*
4722%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4723%                                                                             %
4724%                                                                             %
4725%                                                                             %
4726%   M a g i c k G e t I m a g e G a m m a                                     %
4727%                                                                             %
4728%                                                                             %
4729%                                                                             %
4730%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4731%
4732%  MagickGetImageGamma() gets the image gamma.
4733%
4734%  The format of the MagickGetImageGamma method is:
4735%
4736%      double MagickGetImageGamma(MagickWand *wand)
4737%
4738%  A description of each parameter follows:
4739%
4740%    o wand: the magick wand.
4741%
4742*/
4743WandExport double MagickGetImageGamma(MagickWand *wand)
4744{
4745  assert(wand != (MagickWand *) NULL);
4746  assert(wand->signature == WandSignature);
4747  if (IfMagickTrue(wand->debug))
4748    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4749  if (wand->images == (Image *) NULL)
4750    {
4751      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4752        "ContainsNoImages","`%s'",wand->name);
4753      return(0.0);
4754    }
4755  return(wand->images->gamma);
4756}
4757
4758/*
4759%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4760%                                                                             %
4761%                                                                             %
4762%                                                                             %
4763%   M a g i c k G e t I m a g e G r a v i t y                                 %
4764%                                                                             %
4765%                                                                             %
4766%                                                                             %
4767%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4768%
4769%  MagickGetImageGravity() gets the image gravity.
4770%
4771%  The format of the MagickGetImageGravity method is:
4772%
4773%      GravityType MagickGetImageGravity(MagickWand *wand)
4774%
4775%  A description of each parameter follows:
4776%
4777%    o wand: the magick wand.
4778%
4779*/
4780WandExport GravityType MagickGetImageGravity(MagickWand *wand)
4781{
4782  assert(wand != (MagickWand *) NULL);
4783  assert(wand->signature == WandSignature);
4784  if (IfMagickTrue(wand->debug))
4785    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4786  if (wand->images == (Image *) NULL)
4787    {
4788      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4789        "ContainsNoImages","`%s'",wand->name);
4790      return(UndefinedGravity);
4791    }
4792  return(wand->images->gravity);
4793}
4794
4795/*
4796%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4797%                                                                             %
4798%                                                                             %
4799%                                                                             %
4800%   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                       %
4801%                                                                             %
4802%                                                                             %
4803%                                                                             %
4804%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4805%
4806%  MagickGetImageGreenPrimary() returns the chromaticy green primary point.
4807%
4808%  The format of the MagickGetImageGreenPrimary method is:
4809%
4810%      MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,double *x,
4811%        double *y)
4812%
4813%  A description of each parameter follows:
4814%
4815%    o wand: the magick wand.
4816%
4817%    o x: the chromaticity green primary x-point.
4818%
4819%    o y: the chromaticity green primary y-point.
4820%
4821*/
4822WandExport MagickBooleanType MagickGetImageGreenPrimary(MagickWand *wand,
4823  double *x,double *y)
4824{
4825  assert(wand != (MagickWand *) NULL);
4826  assert(wand->signature == WandSignature);
4827  if (IfMagickTrue(wand->debug))
4828    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4829  if (wand->images == (Image *) NULL)
4830    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4831  *x=wand->images->chromaticity.green_primary.x;
4832  *y=wand->images->chromaticity.green_primary.y;
4833  return(MagickTrue);
4834}
4835
4836/*
4837%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4838%                                                                             %
4839%                                                                             %
4840%                                                                             %
4841%   M a g i c k G e t I m a g e H e i g h t                                   %
4842%                                                                             %
4843%                                                                             %
4844%                                                                             %
4845%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4846%
4847%  MagickGetImageHeight() returns the image height.
4848%
4849%  The format of the MagickGetImageHeight method is:
4850%
4851%      size_t MagickGetImageHeight(MagickWand *wand)
4852%
4853%  A description of each parameter follows:
4854%
4855%    o wand: the magick wand.
4856%
4857*/
4858WandExport size_t MagickGetImageHeight(MagickWand *wand)
4859{
4860  assert(wand != (MagickWand *) NULL);
4861  assert(wand->signature == WandSignature);
4862  if (IfMagickTrue(wand->debug))
4863    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4864  if (wand->images == (Image *) NULL)
4865    ThrowWandException(WandError,"ContainsNoImages",wand->name);
4866  return(wand->images->rows);
4867}
4868
4869/*
4870%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4871%                                                                             %
4872%                                                                             %
4873%                                                                             %
4874%   M a g i c k G e t I m a g e H i s t o g r a m                             %
4875%                                                                             %
4876%                                                                             %
4877%                                                                             %
4878%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4879%
4880%  MagickGetImageHistogram() returns the image histogram as an array of
4881%  PixelWand wands.
4882%
4883%  The format of the MagickGetImageHistogram method is:
4884%
4885%      PixelWand **MagickGetImageHistogram(MagickWand *wand,
4886%        size_t *number_colors)
4887%
4888%  A description of each parameter follows:
4889%
4890%    o wand: the magick wand.
4891%
4892%    o number_colors: the number of unique colors in the image and the number
4893%      of pixel wands returned.
4894%
4895*/
4896WandExport PixelWand **MagickGetImageHistogram(MagickWand *wand,
4897  size_t *number_colors)
4898{
4899  PixelInfo
4900    *histogram;
4901
4902  PixelWand
4903    **pixel_wands;
4904
4905  register ssize_t
4906    i;
4907
4908  assert(wand != (MagickWand *) NULL);
4909  assert(wand->signature == WandSignature);
4910  if (IfMagickTrue(wand->debug))
4911    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4912  if (wand->images == (Image *) NULL)
4913    {
4914      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4915        "ContainsNoImages","`%s'",wand->name);
4916      return((PixelWand **) NULL);
4917    }
4918  histogram=GetImageHistogram(wand->images,number_colors,wand->exception);
4919  if (histogram == (PixelInfo *) NULL)
4920    return((PixelWand **) NULL);
4921  pixel_wands=NewPixelWands(*number_colors);
4922  for (i=0; i < (ssize_t) *number_colors; i++)
4923  {
4924    PixelSetPixelColor(pixel_wands[i],&histogram[i]);
4925    PixelSetColorCount(pixel_wands[i],(size_t) histogram[i].count);
4926  }
4927  histogram=(PixelInfo *) RelinquishMagickMemory(histogram);
4928  return(pixel_wands);
4929}
4930
4931/*
4932%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4933%                                                                             %
4934%                                                                             %
4935%                                                                             %
4936%   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                 %
4937%                                                                             %
4938%                                                                             %
4939%                                                                             %
4940%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4941%
4942%  MagickGetImageInterlaceScheme() gets the image interlace scheme.
4943%
4944%  The format of the MagickGetImageInterlaceScheme method is:
4945%
4946%      InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand)
4947%
4948%  A description of each parameter follows:
4949%
4950%    o wand: the magick wand.
4951%
4952*/
4953WandExport InterlaceType MagickGetImageInterlaceScheme(MagickWand *wand)
4954{
4955  assert(wand != (MagickWand *) NULL);
4956  assert(wand->signature == WandSignature);
4957  if (IfMagickTrue(wand->debug))
4958    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4959  if (wand->images == (Image *) NULL)
4960    {
4961      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
4962        "ContainsNoImages","`%s'",wand->name);
4963      return(UndefinedInterlace);
4964    }
4965  return(wand->images->interlace);
4966}
4967
4968/*
4969%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4970%                                                                             %
4971%                                                                             %
4972%                                                                             %
4973%   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             %
4974%                                                                             %
4975%                                                                             %
4976%                                                                             %
4977%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4978%
4979%  MagickGetImageInterpolateMethod() returns the interpolation method for the
4980%  sepcified image.
4981%
4982%  The format of the MagickGetImageInterpolateMethod method is:
4983%
4984%      PixelInterpolateMethod MagickGetImagePixelInterpolateMethod(
4985%        MagickWand *wand)
4986%
4987%  A description of each parameter follows:
4988%
4989%    o wand: the magick wand.
4990%
4991*/
4992WandExport PixelInterpolateMethod MagickGetImageInterpolateMethod(
4993  MagickWand *wand)
4994{
4995  assert(wand != (MagickWand *) NULL);
4996  assert(wand->signature == WandSignature);
4997  if (IfMagickTrue(wand->debug))
4998    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
4999  if (wand->images == (Image *) NULL)
5000    {
5001      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5002        "ContainsNoImages","`%s'",wand->name);
5003      return(UndefinedInterpolatePixel);
5004    }
5005  return(wand->images->interpolate);
5006}
5007
5008/*
5009%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5010%                                                                             %
5011%                                                                             %
5012%                                                                             %
5013%   M a g i c k G e t I m a g e I t e r a t i o n s                           %
5014%                                                                             %
5015%                                                                             %
5016%                                                                             %
5017%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5018%
5019%  MagickGetImageIterations() gets the image iterations.
5020%
5021%  The format of the MagickGetImageIterations method is:
5022%
5023%      size_t MagickGetImageIterations(MagickWand *wand)
5024%
5025%  A description of each parameter follows:
5026%
5027%    o wand: the magick wand.
5028%
5029*/
5030WandExport size_t MagickGetImageIterations(MagickWand *wand)
5031{
5032  assert(wand != (MagickWand *) NULL);
5033  assert(wand->signature == WandSignature);
5034  if (IfMagickTrue(wand->debug))
5035    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5036  if (wand->images == (Image *) NULL)
5037    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5038  return(wand->images->iterations);
5039}
5040
5041/*
5042%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5043%                                                                             %
5044%                                                                             %
5045%                                                                             %
5046%   M a g i c k G e t I m a g e L e n g t h                                   %
5047%                                                                             %
5048%                                                                             %
5049%                                                                             %
5050%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5051%
5052%  MagickGetImageLength() returns the image length in bytes.
5053%
5054%  The format of the MagickGetImageLength method is:
5055%
5056%      MagickBooleanType MagickGetImageLength(MagickWand *wand,
5057%        MagickSizeType *length)
5058%
5059%  A description of each parameter follows:
5060%
5061%    o wand: the magick wand.
5062%
5063%    o length: the image length in bytes.
5064%
5065*/
5066WandExport MagickBooleanType MagickGetImageLength(MagickWand *wand,
5067  MagickSizeType *length)
5068{
5069  assert(wand != (MagickWand *) NULL);
5070  assert(wand->signature == WandSignature);
5071  if (IfMagickTrue(wand->debug))
5072    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5073  if (wand->images == (Image *) NULL)
5074    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5075  *length=GetBlobSize(wand->images);
5076  return(MagickTrue);
5077}
5078
5079/*
5080%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5081%                                                                             %
5082%                                                                             %
5083%                                                                             %
5084%   M a g i c k G e t I m a g e M a t t e C o l o r                           %
5085%                                                                             %
5086%                                                                             %
5087%                                                                             %
5088%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5089%
5090%  MagickGetImageMatteColor() returns the image matte color.
5091%
5092%  The format of the MagickGetImageMatteColor method is:
5093%
5094%      MagickBooleanType MagickGetImagematteColor(MagickWand *wand,
5095%        PixelWand *matte_color)
5096%
5097%  A description of each parameter follows:
5098%
5099%    o wand: the magick wand.
5100%
5101%    o matte_color: Return the matte color.
5102%
5103*/
5104WandExport MagickBooleanType MagickGetImageMatteColor(MagickWand *wand,
5105  PixelWand *matte_color)
5106{
5107  assert(wand != (MagickWand *) NULL);
5108  assert(wand->signature == WandSignature);
5109  if (IfMagickTrue(wand->debug))
5110    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5111  if (wand->images == (Image *) NULL)
5112    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5113  PixelSetPixelColor(matte_color,&wand->images->matte_color);
5114  return(MagickTrue);
5115}
5116
5117/*
5118%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5119%                                                                             %
5120%                                                                             %
5121%                                                                             %
5122%   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                         %
5123%                                                                             %
5124%                                                                             %
5125%                                                                             %
5126%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5127%
5128%  MagickGetImageOrientation() returns the image orientation.
5129%
5130%  The format of the MagickGetImageOrientation method is:
5131%
5132%      OrientationType MagickGetImageOrientation(MagickWand *wand)
5133%
5134%  A description of each parameter follows:
5135%
5136%    o wand: the magick wand.
5137%
5138*/
5139WandExport OrientationType MagickGetImageOrientation(MagickWand *wand)
5140{
5141  assert(wand != (MagickWand *) NULL);
5142  assert(wand->signature == WandSignature);
5143  if (IfMagickTrue(wand->debug))
5144    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5145  if (wand->images == (Image *) NULL)
5146    {
5147      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5148        "ContainsNoImages","`%s'",wand->name);
5149      return(UndefinedOrientation);
5150    }
5151  return(wand->images->orientation);
5152}
5153
5154/*
5155%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5156%                                                                             %
5157%                                                                             %
5158%                                                                             %
5159%   M a g i c k G e t I m a g e P a g e                                       %
5160%                                                                             %
5161%                                                                             %
5162%                                                                             %
5163%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5164%
5165%  MagickGetImagePage() returns the page geometry associated with the image.
5166%
5167%  The format of the MagickGetImagePage method is:
5168%
5169%      MagickBooleanType MagickGetImagePage(MagickWand *wand,
5170%        size_t *width,size_t *height,ssize_t *x,ssize_t *y)
5171%
5172%  A description of each parameter follows:
5173%
5174%    o wand: the magick wand.
5175%
5176%    o width: the page width.
5177%
5178%    o height: the page height.
5179%
5180%    o x: the page x-offset.
5181%
5182%    o y: the page y-offset.
5183%
5184*/
5185WandExport MagickBooleanType MagickGetImagePage(MagickWand *wand,
5186  size_t *width,size_t *height,ssize_t *x,ssize_t *y)
5187{
5188  assert(wand != (const MagickWand *) NULL);
5189  assert(wand->signature == WandSignature);
5190  if (IfMagickTrue(wand->debug))
5191    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5192  if (wand->images == (Image *) NULL)
5193    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5194  *width=wand->images->page.width;
5195  *height=wand->images->page.height;
5196  *x=wand->images->page.x;
5197  *y=wand->images->page.y;
5198  return(MagickTrue);
5199}
5200
5201/*
5202%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5203%                                                                             %
5204%                                                                             %
5205%                                                                             %
5206%   M a g i c k G e t I m a g e P i x e l C o l o r                           %
5207%                                                                             %
5208%                                                                             %
5209%                                                                             %
5210%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5211%
5212%  MagickGetImagePixelColor() returns the color of the specified pixel.
5213%
5214%  The format of the MagickGetImagePixelColor method is:
5215%
5216%      MagickBooleanType MagickGetImagePixelColor(MagickWand *wand,
5217%        const ssize_t x,const ssize_t y,PixelWand *color)
5218%
5219%  A description of each parameter follows:
5220%
5221%    o wand: the magick wand.
5222%
5223%    o x,y: the pixel offset into the image.
5224%
5225%    o color: Return the colormap color in this wand.
5226%
5227*/
5228WandExport MagickBooleanType MagickGetImagePixelColor(MagickWand *wand,
5229  const ssize_t x,const ssize_t y,PixelWand *color)
5230{
5231  register const Quantum
5232    *p;
5233
5234  CacheView
5235    *image_view;
5236
5237  assert(wand != (MagickWand *) NULL);
5238  assert(wand->signature == WandSignature);
5239  if (IfMagickTrue(wand->debug))
5240    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5241  if (wand->images == (Image *) NULL)
5242    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5243  image_view=AcquireVirtualCacheView(wand->images,wand->exception);
5244  p=GetCacheViewVirtualPixels(image_view,x,y,1,1,wand->exception);
5245  if (p == (const Quantum *) NULL)
5246    {
5247      image_view=DestroyCacheView(image_view);
5248      return(MagickFalse);
5249    }
5250  PixelSetQuantumPixel(wand->images,p,color);
5251  image_view=DestroyCacheView(image_view);
5252  return(MagickTrue);
5253}
5254
5255/*
5256%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5257%                                                                             %
5258%                                                                             %
5259%                                                                             %
5260%   M a g i c k G e t I m a g e R e d P r i m a r y                           %
5261%                                                                             %
5262%                                                                             %
5263%                                                                             %
5264%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5265%
5266%  MagickGetImageRedPrimary() returns the chromaticy red primary point.
5267%
5268%  The format of the MagickGetImageRedPrimary method is:
5269%
5270%      MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,double *x,
5271%        double *y)
5272%
5273%  A description of each parameter follows:
5274%
5275%    o wand: the magick wand.
5276%
5277%    o x: the chromaticity red primary x-point.
5278%
5279%    o y: the chromaticity red primary y-point.
5280%
5281*/
5282WandExport MagickBooleanType MagickGetImageRedPrimary(MagickWand *wand,
5283  double *x,double *y)
5284{
5285  assert(wand != (MagickWand *) NULL);
5286  assert(wand->signature == WandSignature);
5287  if (IfMagickTrue(wand->debug))
5288    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5289  if (wand->images == (Image *) NULL)
5290    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5291  *x=wand->images->chromaticity.red_primary.x;
5292  *y=wand->images->chromaticity.red_primary.y;
5293  return(MagickTrue);
5294}
5295
5296/*
5297%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5298%                                                                             %
5299%                                                                             %
5300%                                                                             %
5301%   M a g i c k G e t I m a g e R e g i o n                                   %
5302%                                                                             %
5303%                                                                             %
5304%                                                                             %
5305%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5306%
5307%  MagickGetImageRegion() extracts a region of the image and returns it as a
5308%  a new wand.
5309%
5310%  The format of the MagickGetImageRegion method is:
5311%
5312%      MagickWand *MagickGetImageRegion(MagickWand *wand,
5313%        const size_t width,const size_t height,const ssize_t x,
5314%        const ssize_t y)
5315%
5316%  A description of each parameter follows:
5317%
5318%    o wand: the magick wand.
5319%
5320%    o width: the region width.
5321%
5322%    o height: the region height.
5323%
5324%    o x: the region x offset.
5325%
5326%    o y: the region y offset.
5327%
5328*/
5329WandExport MagickWand *MagickGetImageRegion(MagickWand *wand,
5330  const size_t width,const size_t height,const ssize_t x,
5331  const ssize_t y)
5332{
5333  Image
5334    *region_image;
5335
5336  RectangleInfo
5337    region;
5338
5339  assert(wand != (MagickWand *) NULL);
5340  assert(wand->signature == WandSignature);
5341  if (IfMagickTrue(wand->debug))
5342    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5343  if (wand->images == (Image *) NULL)
5344    return((MagickWand *) NULL);
5345  region.width=width;
5346  region.height=height;
5347  region.x=x;
5348  region.y=y;
5349  region_image=CropImage(wand->images,&region,wand->exception);
5350  if (region_image == (Image *) NULL)
5351    return((MagickWand *) NULL);
5352  return(CloneMagickWandFromImages(wand,region_image));
5353}
5354
5355/*
5356%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5357%                                                                             %
5358%                                                                             %
5359%                                                                             %
5360%   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                 %
5361%                                                                             %
5362%                                                                             %
5363%                                                                             %
5364%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5365%
5366%  MagickGetImageRenderingIntent() gets the image rendering intent.
5367%
5368%  The format of the MagickGetImageRenderingIntent method is:
5369%
5370%      RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand)
5371%
5372%  A description of each parameter follows:
5373%
5374%    o wand: the magick wand.
5375%
5376*/
5377WandExport RenderingIntent MagickGetImageRenderingIntent(MagickWand *wand)
5378{
5379  assert(wand != (MagickWand *) NULL);
5380  assert(wand->signature == WandSignature);
5381  if (IfMagickTrue(wand->debug))
5382    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5383  if (wand->images == (Image *) NULL)
5384    {
5385      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5386        "ContainsNoImages","`%s'",wand->name);
5387      return(UndefinedIntent);
5388    }
5389  return((RenderingIntent) wand->images->rendering_intent);
5390}
5391
5392/*
5393%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5394%                                                                             %
5395%                                                                             %
5396%                                                                             %
5397%   M a g i c k G e t I m a g e R e s o l u t i o n                           %
5398%                                                                             %
5399%                                                                             %
5400%                                                                             %
5401%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5402%
5403%  MagickGetImageResolution() gets the image X and Y resolution.
5404%
5405%  The format of the MagickGetImageResolution method is:
5406%
5407%      MagickBooleanType MagickGetImageResolution(MagickWand *wand,double *x,
5408%        double *y)
5409%
5410%  A description of each parameter follows:
5411%
5412%    o wand: the magick wand.
5413%
5414%    o x: the image x-resolution.
5415%
5416%    o y: the image y-resolution.
5417%
5418*/
5419WandExport MagickBooleanType MagickGetImageResolution(MagickWand *wand,
5420  double *x,double *y)
5421{
5422  assert(wand != (MagickWand *) NULL);
5423  assert(wand->signature == WandSignature);
5424  if (IfMagickTrue(wand->debug))
5425    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5426  if (wand->images == (Image *) NULL)
5427    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5428  *x=wand->images->resolution.x;
5429  *y=wand->images->resolution.y;
5430  return(MagickTrue);
5431}
5432
5433/*
5434%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5435%                                                                             %
5436%                                                                             %
5437%                                                                             %
5438%   M a g i c k G e t I m a g e S c e n e                                     %
5439%                                                                             %
5440%                                                                             %
5441%                                                                             %
5442%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5443%
5444%  MagickGetImageScene() gets the image scene.
5445%
5446%  The format of the MagickGetImageScene method is:
5447%
5448%      size_t MagickGetImageScene(MagickWand *wand)
5449%
5450%  A description of each parameter follows:
5451%
5452%    o wand: the magick wand.
5453%
5454*/
5455WandExport size_t MagickGetImageScene(MagickWand *wand)
5456{
5457  assert(wand != (MagickWand *) NULL);
5458  assert(wand->signature == WandSignature);
5459  if (IfMagickTrue(wand->debug))
5460    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5461  if (wand->images == (Image *) NULL)
5462    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5463  return(wand->images->scene);
5464}
5465
5466/*
5467%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5468%                                                                             %
5469%                                                                             %
5470%                                                                             %
5471%   M a g i c k G e t I m a g e S i g n a t u r e                             %
5472%                                                                             %
5473%                                                                             %
5474%                                                                             %
5475%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5476%
5477%  MagickGetImageSignature() generates an SHA-256 message digest for the image
5478%  pixel stream.
5479%
5480%  The format of the MagickGetImageSignature method is:
5481%
5482%      char *MagickGetImageSignature(MagickWand *wand)
5483%
5484%  A description of each parameter follows:
5485%
5486%    o wand: the magick wand.
5487%
5488*/
5489WandExport char *MagickGetImageSignature(MagickWand *wand)
5490{
5491  const char
5492    *value;
5493
5494  MagickBooleanType
5495    status;
5496
5497  assert(wand != (MagickWand *) NULL);
5498  assert(wand->signature == WandSignature);
5499  if (IfMagickTrue(wand->debug))
5500    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5501  if (wand->images == (Image *) NULL)
5502    {
5503      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5504        "ContainsNoImages","`%s'",wand->name);
5505      return((char *) NULL);
5506    }
5507  status=SignatureImage(wand->images,wand->exception);
5508  if (IfMagickFalse(status))
5509    return((char *) NULL);
5510  value=GetImageProperty(wand->images,"signature",wand->exception);
5511  if (value == (const char *) NULL)
5512    return((char *) NULL);
5513  return(AcquireString(value));
5514}
5515
5516/*
5517%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5518%                                                                             %
5519%                                                                             %
5520%                                                                             %
5521%   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                   %
5522%                                                                             %
5523%                                                                             %
5524%                                                                             %
5525%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5526%
5527%  MagickGetImageTicksPerSecond() gets the image ticks-per-second.
5528%
5529%  The format of the MagickGetImageTicksPerSecond method is:
5530%
5531%      size_t MagickGetImageTicksPerSecond(MagickWand *wand)
5532%
5533%  A description of each parameter follows:
5534%
5535%    o wand: the magick wand.
5536%
5537*/
5538WandExport size_t MagickGetImageTicksPerSecond(MagickWand *wand)
5539{
5540  assert(wand != (MagickWand *) NULL);
5541  assert(wand->signature == WandSignature);
5542  if (IfMagickTrue(wand->debug))
5543    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5544  if (wand->images == (Image *) NULL)
5545    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5546  return((size_t) wand->images->ticks_per_second);
5547}
5548
5549/*
5550%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5551%                                                                             %
5552%                                                                             %
5553%                                                                             %
5554%   M a g i c k G e t I m a g e T y p e                                       %
5555%                                                                             %
5556%                                                                             %
5557%                                                                             %
5558%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5559%
5560%  MagickGetImageType() gets the potential image type:
5561%
5562%        Bilevel        Grayscale       GrayscaleMatte
5563%        Palette        PaletteMatte    TrueColor
5564%        TrueColorMatte ColorSeparation ColorSeparationMatte
5565%
5566%  To ensure the image type matches its potential, use MagickSetImageType():
5567%
5568%    (void) MagickSetImageType(wand,MagickGetImageType(wand));
5569%
5570%  The format of the MagickGetImageType method is:
5571%
5572%      ImageType MagickGetImageType(MagickWand *wand)
5573%
5574%  A description of each parameter follows:
5575%
5576%    o wand: the magick wand.
5577%
5578*/
5579WandExport ImageType MagickGetImageType(MagickWand *wand)
5580{
5581  assert(wand != (MagickWand *) NULL);
5582  assert(wand->signature == WandSignature);
5583  if (IfMagickTrue(wand->debug))
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(UndefinedType);
5590    }
5591  return(GetImageType(wand->images,wand->exception));
5592}
5593
5594/*
5595%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5596%                                                                             %
5597%                                                                             %
5598%                                                                             %
5599%   M a g i c k G e t I m a g e U n i t s                                     %
5600%                                                                             %
5601%                                                                             %
5602%                                                                             %
5603%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5604%
5605%  MagickGetImageUnits() gets the image units of resolution.
5606%
5607%  The format of the MagickGetImageUnits method is:
5608%
5609%      ResolutionType MagickGetImageUnits(MagickWand *wand)
5610%
5611%  A description of each parameter follows:
5612%
5613%    o wand: the magick wand.
5614%
5615*/
5616WandExport ResolutionType MagickGetImageUnits(MagickWand *wand)
5617{
5618  assert(wand != (MagickWand *) NULL);
5619  assert(wand->signature == WandSignature);
5620  if (IfMagickTrue(wand->debug))
5621    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5622  if (wand->images == (Image *) NULL)
5623    {
5624      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5625        "ContainsNoImages","`%s'",wand->name);
5626      return(UndefinedResolution);
5627    }
5628  return(wand->images->units);
5629}
5630
5631/*
5632%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5633%                                                                             %
5634%                                                                             %
5635%                                                                             %
5636%   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           %
5637%                                                                             %
5638%                                                                             %
5639%                                                                             %
5640%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5641%
5642%  MagickGetImageVirtualPixelMethod() returns the virtual pixel method for the
5643%  sepcified image.
5644%
5645%  The format of the MagickGetImageVirtualPixelMethod method is:
5646%
5647%      VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand)
5648%
5649%  A description of each parameter follows:
5650%
5651%    o wand: the magick wand.
5652%
5653*/
5654WandExport VirtualPixelMethod MagickGetImageVirtualPixelMethod(MagickWand *wand)
5655{
5656  assert(wand != (MagickWand *) NULL);
5657  assert(wand->signature == WandSignature);
5658  if (IfMagickTrue(wand->debug))
5659    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5660  if (wand->images == (Image *) NULL)
5661    {
5662      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5663        "ContainsNoImages","`%s'",wand->name);
5664      return(UndefinedVirtualPixelMethod);
5665    }
5666  return(GetImageVirtualPixelMethod(wand->images));
5667}
5668
5669/*
5670%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5671%                                                                             %
5672%                                                                             %
5673%                                                                             %
5674%   M a g i c k G e t I m a g e W h i t e P o i n t                           %
5675%                                                                             %
5676%                                                                             %
5677%                                                                             %
5678%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5679%
5680%  MagickGetImageWhitePoint() returns the chromaticy white point.
5681%
5682%  The format of the MagickGetImageWhitePoint method is:
5683%
5684%      MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,double *x,
5685%        double *y)
5686%
5687%  A description of each parameter follows:
5688%
5689%    o wand: the magick wand.
5690%
5691%    o x: the chromaticity white x-point.
5692%
5693%    o y: the chromaticity white y-point.
5694%
5695*/
5696WandExport MagickBooleanType MagickGetImageWhitePoint(MagickWand *wand,
5697  double *x,double *y)
5698{
5699  assert(wand != (MagickWand *) NULL);
5700  assert(wand->signature == WandSignature);
5701  if (IfMagickTrue(wand->debug))
5702    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5703  if (wand->images == (Image *) NULL)
5704    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5705  *x=wand->images->chromaticity.white_point.x;
5706  *y=wand->images->chromaticity.white_point.y;
5707  return(MagickTrue);
5708}
5709
5710/*
5711%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5712%                                                                             %
5713%                                                                             %
5714%                                                                             %
5715%   M a g i c k G e t I m a g e W i d t h                                     %
5716%                                                                             %
5717%                                                                             %
5718%                                                                             %
5719%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5720%
5721%  MagickGetImageWidth() returns the image width.
5722%
5723%  The format of the MagickGetImageWidth method is:
5724%
5725%      size_t MagickGetImageWidth(MagickWand *wand)
5726%
5727%  A description of each parameter follows:
5728%
5729%    o wand: the magick wand.
5730%
5731*/
5732WandExport size_t MagickGetImageWidth(MagickWand *wand)
5733{
5734  assert(wand != (MagickWand *) NULL);
5735  assert(wand->signature == WandSignature);
5736  if (IfMagickTrue(wand->debug))
5737    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5738  if (wand->images == (Image *) NULL)
5739    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5740  return(wand->images->columns);
5741}
5742
5743/*
5744%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5745%                                                                             %
5746%                                                                             %
5747%                                                                             %
5748%   M a g i c k G e t N u m b e r I m a g e s                                 %
5749%                                                                             %
5750%                                                                             %
5751%                                                                             %
5752%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5753%
5754%  MagickGetNumberImages() returns the number of images associated with a
5755%  magick wand.
5756%
5757%  The format of the MagickGetNumberImages method is:
5758%
5759%      size_t MagickGetNumberImages(MagickWand *wand)
5760%
5761%  A description of each parameter follows:
5762%
5763%    o wand: the magick wand.
5764%
5765*/
5766WandExport size_t MagickGetNumberImages(MagickWand *wand)
5767{
5768  assert(wand != (MagickWand *) NULL);
5769  assert(wand->signature == WandSignature);
5770  if (IfMagickTrue(wand->debug))
5771    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5772  return(GetImageListLength(wand->images));
5773}
5774
5775/*
5776%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5777%                                                                             %
5778%                                                                             %
5779%                                                                             %
5780%   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                 %
5781%                                                                             %
5782%                                                                             %
5783%                                                                             %
5784%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5785%
5786%  MagickGetImageTotalInkDensity() gets the image total ink density.
5787%
5788%  The format of the MagickGetImageTotalInkDensity method is:
5789%
5790%      double MagickGetImageTotalInkDensity(MagickWand *wand)
5791%
5792%  A description of each parameter follows:
5793%
5794%    o wand: the magick wand.
5795%
5796*/
5797WandExport double MagickGetImageTotalInkDensity(MagickWand *wand)
5798{
5799  assert(wand != (MagickWand *) NULL);
5800  assert(wand->signature == WandSignature);
5801  if (IfMagickTrue(wand->debug))
5802    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5803  if (wand->images == (Image *) NULL)
5804    {
5805      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5806        "ContainsNoImages","`%s'",wand->name);
5807      return(0.0);
5808    }
5809  return(GetImageTotalInkDensity(wand->images,wand->exception));
5810}
5811
5812/*
5813%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5814%                                                                             %
5815%                                                                             %
5816%                                                                             %
5817%   M a g i c k H a l d C l u t I m a g e                                     %
5818%                                                                             %
5819%                                                                             %
5820%                                                                             %
5821%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5822%
5823%  MagickHaldClutImage() replaces colors in the image from a Hald color lookup
5824%  table.   A Hald color lookup table is a 3-dimensional color cube mapped to 2
5825%  dimensions.  Create it with the HALD coder.  You can apply any color
5826%  transformation to the Hald image and then use this method to apply the
5827%  transform to the image.
5828%
5829%  The format of the MagickHaldClutImage method is:
5830%
5831%      MagickBooleanType MagickHaldClutImage(MagickWand *wand,
5832%        const MagickWand *hald_wand)
5833%
5834%  A description of each parameter follows:
5835%
5836%    o wand: the magick wand.
5837%
5838%    o hald_image: the hald CLUT image.
5839%
5840*/
5841WandExport MagickBooleanType MagickHaldClutImage(MagickWand *wand,
5842  const MagickWand *hald_wand)
5843{
5844  MagickBooleanType
5845    status;
5846
5847  assert(wand != (MagickWand *) NULL);
5848  assert(wand->signature == WandSignature);
5849  if (IfMagickTrue(wand->debug))
5850    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5851  if ((wand->images == (Image *) NULL) || (hald_wand->images == (Image *) NULL))
5852    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5853  status=HaldClutImage(wand->images,hald_wand->images,wand->exception);
5854  return(status);
5855}
5856
5857/*
5858%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5859%                                                                             %
5860%                                                                             %
5861%                                                                             %
5862%   M a g i c k H a s N e x t I m a g e                                       %
5863%                                                                             %
5864%                                                                             %
5865%                                                                             %
5866%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5867%
5868%  MagickHasNextImage() returns MagickTrue if the wand has more images when
5869%  traversing the list in the forward direction
5870%
5871%  The format of the MagickHasNextImage method is:
5872%
5873%      MagickBooleanType MagickHasNextImage(MagickWand *wand)
5874%
5875%  A description of each parameter follows:
5876%
5877%    o wand: the magick wand.
5878%
5879*/
5880WandExport MagickBooleanType MagickHasNextImage(MagickWand *wand)
5881{
5882  assert(wand != (MagickWand *) NULL);
5883  assert(wand->signature == WandSignature);
5884  if (IfMagickTrue(wand->debug))
5885    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5886  if (wand->images == (Image *) NULL)
5887    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5888  if (GetNextImageInList(wand->images) == (Image *) NULL)
5889    return(MagickFalse);
5890  return(MagickTrue);
5891}
5892
5893/*
5894%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5895%                                                                             %
5896%                                                                             %
5897%                                                                             %
5898%   M a g i c k H a s P r e v i o u s I m a g e                               %
5899%                                                                             %
5900%                                                                             %
5901%                                                                             %
5902%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5903%
5904%  MagickHasPreviousImage() returns MagickTrue if the wand has more images when
5905%  traversing the list in the reverse direction
5906%
5907%  The format of the MagickHasPreviousImage method is:
5908%
5909%      MagickBooleanType MagickHasPreviousImage(MagickWand *wand)
5910%
5911%  A description of each parameter follows:
5912%
5913%    o wand: the magick wand.
5914%
5915*/
5916WandExport MagickBooleanType MagickHasPreviousImage(MagickWand *wand)
5917{
5918  assert(wand != (MagickWand *) NULL);
5919  assert(wand->signature == WandSignature);
5920  if (IfMagickTrue(wand->debug))
5921    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5922  if (wand->images == (Image *) NULL)
5923    ThrowWandException(WandError,"ContainsNoImages",wand->name);
5924  if (GetPreviousImageInList(wand->images) == (Image *) NULL)
5925    return(MagickFalse);
5926  return(MagickTrue);
5927}
5928
5929/*
5930%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5931%                                                                             %
5932%                                                                             %
5933%                                                                             %
5934%   M a g i c k I d e n t i f y I m a g e                                     %
5935%                                                                             %
5936%                                                                             %
5937%                                                                             %
5938%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5939%
5940%  MagickIdentifyImage() identifies an image by printing its attributes to the
5941%  file.  Attributes include the image width, height, size, and others.
5942%
5943%  The format of the MagickIdentifyImage method is:
5944%
5945%      const char *MagickIdentifyImage(MagickWand *wand)
5946%
5947%  A description of each parameter follows:
5948%
5949%    o wand: the magick wand.
5950%
5951*/
5952WandExport char *MagickIdentifyImage(MagickWand *wand)
5953{
5954  char
5955    *description,
5956    filename[MaxTextExtent];
5957
5958  FILE
5959    *file;
5960
5961  int
5962    unique_file;
5963
5964  assert(wand != (MagickWand *) NULL);
5965  assert(wand->signature == WandSignature);
5966  if (IfMagickTrue(wand->debug))
5967    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
5968  if (wand->images == (Image *) NULL)
5969    {
5970      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5971        "ContainsNoImages","`%s'",wand->name);
5972      return((char *) NULL);
5973    }
5974  description=(char *) NULL;
5975  unique_file=AcquireUniqueFileResource(filename);
5976  file=(FILE *) NULL;
5977  if (unique_file != -1)
5978    file=fdopen(unique_file,"wb");
5979  if ((unique_file == -1) || (file == (FILE *) NULL))
5980    {
5981      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
5982        "UnableToCreateTemporaryFile","`%s'",wand->name);
5983      return((char *) NULL);
5984    }
5985  (void) IdentifyImage(wand->images,file,MagickTrue,wand->exception);
5986  (void) fclose(file);
5987  description=FileToString(filename,~0UL,wand->exception);
5988  (void) RelinquishUniqueFileResource(filename);
5989  return(description);
5990}
5991
5992/*
5993%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5994%                                                                             %
5995%                                                                             %
5996%                                                                             %
5997%   M a g i c k I m p l o d e I m a g e                                       %
5998%                                                                             %
5999%                                                                             %
6000%                                                                             %
6001%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6002%
6003%  MagickImplodeImage() creates a new image that is a copy of an existing
6004%  one with the image pixels "implode" by the specified percentage.  It
6005%  allocates the memory necessary for the new Image structure and returns a
6006%  pointer to the new image.
6007%
6008%  The format of the MagickImplodeImage method is:
6009%
6010%      MagickBooleanType MagickImplodeImage(MagickWand *wand,
6011%        const double radius,const PixelInterpolateMethod method)
6012%
6013%  A description of each parameter follows:
6014%
6015%    o wand: the magick wand.
6016%
6017%    o amount: Define the extent of the implosion.
6018%
6019%    o method: the pixel interpolation method.
6020%
6021*/
6022WandExport MagickBooleanType MagickImplodeImage(MagickWand *wand,
6023  const double amount,const PixelInterpolateMethod method)
6024{
6025  Image
6026    *implode_image;
6027
6028  assert(wand != (MagickWand *) NULL);
6029  assert(wand->signature == WandSignature);
6030  if (IfMagickTrue(wand->debug))
6031    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6032  if (wand->images == (Image *) NULL)
6033    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6034  implode_image=ImplodeImage(wand->images,amount,method,wand->exception);
6035  if (implode_image == (Image *) NULL)
6036    return(MagickFalse);
6037  ReplaceImageInList(&wand->images,implode_image);
6038  return(MagickTrue);
6039}
6040
6041/*
6042%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6043%                                                                             %
6044%                                                                             %
6045%                                                                             %
6046%   M a g i c k I m p o r t I m a g e P i x e l s                             %
6047%                                                                             %
6048%                                                                             %
6049%                                                                             %
6050%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6051%
6052%  MagickImportImagePixels() accepts pixel datand stores it in the image at the
6053%  location you specify.  The method returns MagickFalse on success otherwise
6054%  MagickTrue if an error is encountered.  The pixel data can be either char,
6055%  short int, int, ssize_t, float, or double in the order specified by map.
6056%
6057%  Suppose your want to upload the first scanline of a 640x480 image from
6058%  character data in red-green-blue order:
6059%
6060%      MagickImportImagePixels(wand,0,0,640,1,"RGB",CharPixel,pixels);
6061%
6062%  The format of the MagickImportImagePixels method is:
6063%
6064%      MagickBooleanType MagickImportImagePixels(MagickWand *wand,
6065%        const ssize_t x,const ssize_t y,const size_t columns,
6066%        const size_t rows,const char *map,const StorageType storage,
6067%        const void *pixels)
6068%
6069%  A description of each parameter follows:
6070%
6071%    o wand: the magick wand.
6072%
6073%    o x, y, columns, rows:  These values define the perimeter of a region
6074%      of pixels you want to define.
6075%
6076%    o map:  This string reflects the expected ordering of the pixel array.
6077%      It can be any combination or order of R = red, G = green, B = blue,
6078%      A = alpha (0 is transparent), O = alpha (0 is opaque), C = cyan,
6079%      Y = yellow, M = magenta, K = black, I = intensity (for grayscale),
6080%      P = pad.
6081%
6082%    o storage: Define the data type of the pixels.  Float and double types are
6083%      expected to be normalized [0..1] otherwise [0..QuantumRange].  Choose from
6084%      these types: CharPixel, ShortPixel, IntegerPixel, LongPixel, FloatPixel,
6085%      or DoublePixel.
6086%
6087%    o pixels: This array of values contain the pixel components as defined by
6088%      map and type.  You must preallocate this array where the expected
6089%      length varies depending on the values of width, height, map, and type.
6090%
6091*/
6092WandExport MagickBooleanType MagickImportImagePixels(MagickWand *wand,
6093  const ssize_t x,const ssize_t y,const size_t columns,const size_t rows,
6094  const char *map,const StorageType storage,const void *pixels)
6095{
6096  MagickBooleanType
6097    status;
6098
6099  assert(wand != (MagickWand *) NULL);
6100  assert(wand->signature == WandSignature);
6101  if (IfMagickTrue(wand->debug))
6102    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6103  if (wand->images == (Image *) NULL)
6104    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6105  status=ImportImagePixels(wand->images,x,y,columns,rows,map,storage,pixels,
6106    wand->exception);
6107  return(status);
6108}
6109
6110/*
6111%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6112%                                                                             %
6113%                                                                             %
6114%                                                                             %
6115%   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               %
6116%                                                                             %
6117%                                                                             %
6118%                                                                             %
6119%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6120%
6121%  MagickInterpolativeResizeImage() resize image using a interpolative
6122%  method.
6123%
6124%      MagickBooleanType MagickInterpolativeResizeImage(MagickWand *wand,
6125%        const size_t columns,const size_t rows,
6126%        const PixelInterpolateMethod method)
6127%
6128%  A description of each parameter follows:
6129%
6130%    o wand: the magick wand.
6131%
6132%    o columns: the number of columns in the scaled image.
6133%
6134%    o rows: the number of rows in the scaled image.
6135%
6136%    o interpolate: the pixel interpolation method.
6137%
6138*/
6139WandExport MagickBooleanType MagickInterpolativeResizeImage(MagickWand *wand,
6140  const size_t columns,const size_t rows,const PixelInterpolateMethod method)
6141{
6142  Image
6143    *resize_image;
6144
6145  assert(wand != (MagickWand *) NULL);
6146  assert(wand->signature == WandSignature);
6147  if (IfMagickTrue(wand->debug))
6148    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6149  if (wand->images == (Image *) NULL)
6150    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6151  resize_image=InterpolativeResizeImage(wand->images,columns,rows,method,
6152    wand->exception);
6153  if (resize_image == (Image *) NULL)
6154    return(MagickFalse);
6155  ReplaceImageInList(&wand->images,resize_image);
6156  return(MagickTrue);
6157}
6158
6159/*
6160%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6161%                                                                             %
6162%                                                                             %
6163%                                                                             %
6164%   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       %
6165%                                                                             %
6166%                                                                             %
6167%                                                                             %
6168%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6169%
6170%  MagickInverseFourierTransformImage() implements the inverse discrete
6171%  Fourier transform (DFT) of the image either as a magnitude / phase or real /
6172%  imaginary image pair.
6173%
6174%  The format of the MagickInverseFourierTransformImage method is:
6175%
6176%      MagickBooleanType MagickInverseFourierTransformImage(
6177%        MagickWand *magnitude_wand,MagickWand *phase_wand,
6178%        const MagickBooleanType magnitude)
6179%
6180%  A description of each parameter follows:
6181%
6182%    o magnitude_wand: the magnitude or real wand.
6183%
6184%    o phase_wand: the phase or imaginary wand.
6185%
6186%    o magnitude: if true, return as magnitude / phase pair otherwise a real /
6187%      imaginary image pair.
6188%
6189*/
6190WandExport MagickBooleanType MagickInverseFourierTransformImage(
6191  MagickWand *magnitude_wand,MagickWand *phase_wand,
6192  const MagickBooleanType magnitude)
6193{
6194  Image
6195    *inverse_image;
6196
6197  MagickWand
6198    *wand;
6199
6200  assert(magnitude_wand != (MagickWand *) NULL);
6201  assert(magnitude_wand->signature == WandSignature);
6202  if (IfMagickTrue(magnitude_wand->debug))
6203    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",
6204      magnitude_wand->name);
6205  wand=magnitude_wand;
6206  if (magnitude_wand->images == (Image *) NULL)
6207    ThrowWandException(WandError,"ContainsNoImages",
6208      magnitude_wand->name);
6209  assert(phase_wand != (MagickWand *) NULL);
6210  assert(phase_wand->signature == WandSignature);
6211  inverse_image=InverseFourierTransformImage(magnitude_wand->images,
6212    phase_wand->images,magnitude,wand->exception);
6213  if (inverse_image == (Image *) NULL)
6214    return(MagickFalse);
6215  ReplaceImageInList(&wand->images,inverse_image);
6216  return(MagickTrue);
6217}
6218
6219/*
6220%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6221%                                                                             %
6222%                                                                             %
6223%                                                                             %
6224%   M a g i c k L a b e l I m a g e                                           %
6225%                                                                             %
6226%                                                                             %
6227%                                                                             %
6228%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6229%
6230%  MagickLabelImage() adds a label to your image.
6231%
6232%  The format of the MagickLabelImage method is:
6233%
6234%      MagickBooleanType MagickLabelImage(MagickWand *wand,const char *label)
6235%
6236%  A description of each parameter follows:
6237%
6238%    o wand: the magick wand.
6239%
6240%    o label: the image label.
6241%
6242*/
6243WandExport MagickBooleanType MagickLabelImage(MagickWand *wand,
6244  const char *label)
6245{
6246  MagickBooleanType
6247    status;
6248
6249  assert(wand != (MagickWand *) NULL);
6250  assert(wand->signature == WandSignature);
6251  if (IfMagickTrue(wand->debug))
6252    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6253  if (wand->images == (Image *) NULL)
6254    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6255  status=SetImageProperty(wand->images,"label",label,wand->exception);
6256  return(status);
6257}
6258
6259/*
6260%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6261%                                                                             %
6262%                                                                             %
6263%                                                                             %
6264%   M a g i c k L e v e l I m a g e                                           %
6265%                                                                             %
6266%                                                                             %
6267%                                                                             %
6268%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6269%
6270%  MagickLevelImage() adjusts the levels of an image by scaling the colors
6271%  falling between specified white and black points to the full available
6272%  quantum range. The parameters provided represent the black, mid, and white
6273%  points. The black point specifies the darkest color in the image. Colors
6274%  darker than the black point are set to zero. Mid point specifies a gamma
6275%  correction to apply to the image.  White point specifies the lightest color
6276%  in the image. Colors brighter than the white point are set to the maximum
6277%  quantum value.
6278%
6279%  The format of the MagickLevelImage method is:
6280%
6281%      MagickBooleanType MagickLevelImage(MagickWand *wand,
6282%        const double black_point,const double gamma,const double white_point)
6283%      MagickBooleanType MagickLevelImage(MagickWand *wand,
6284%        const ChannelType channel,const double black_point,const double gamma,
6285%        const double white_point)
6286%
6287%  A description of each parameter follows:
6288%
6289%    o wand: the magick wand.
6290%
6291%    o channel: Identify which channel to level: RedPixelChannel,
6292%      GreenPixelChannel, etc.
6293%
6294%    o black_point: the black point.
6295%
6296%    o gamma: the gamma.
6297%
6298%    o white_point: the white point.
6299%
6300*/
6301WandExport MagickBooleanType MagickLevelImage(MagickWand *wand,
6302  const double black_point,const double gamma,const double white_point)
6303{
6304  MagickBooleanType
6305    status;
6306
6307  assert(wand != (MagickWand *) NULL);
6308  assert(wand->signature == WandSignature);
6309  if (IfMagickTrue(wand->debug))
6310    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6311  if (wand->images == (Image *) NULL)
6312    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6313  status=LevelImage(wand->images,black_point,white_point,gamma,
6314    wand->exception);
6315  return(status);
6316}
6317
6318/*
6319%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6320%                                                                             %
6321%                                                                             %
6322%                                                                             %
6323%   M a g i c k L i n e a r S t r e t c h I m a g e                           %
6324%                                                                             %
6325%                                                                             %
6326%                                                                             %
6327%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6328%
6329%  MagickLinearStretchImage() stretches with saturation the image intensity.
6330%
6331%  You can also reduce the influence of a particular channel with a gamma
6332%  value of 0.
6333%
6334%  The format of the MagickLinearStretchImage method is:
6335%
6336%      MagickBooleanType MagickLinearStretchImage(MagickWand *wand,
6337%        const double black_point,const double white_point)
6338%
6339%  A description of each parameter follows:
6340%
6341%    o wand: the magick wand.
6342%
6343%    o black_point: the black point.
6344%
6345%    o white_point: the white point.
6346%
6347*/
6348WandExport MagickBooleanType MagickLinearStretchImage(MagickWand *wand,
6349  const double black_point,const double white_point)
6350{
6351  MagickBooleanType
6352    status;
6353
6354  assert(wand != (MagickWand *) NULL);
6355  assert(wand->signature == WandSignature);
6356  if (IfMagickTrue(wand->debug))
6357    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6358  if (wand->images == (Image *) NULL)
6359    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6360  status=LinearStretchImage(wand->images,black_point,white_point,
6361    wand->exception);
6362  return(status);
6363}
6364
6365/*
6366%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6367%                                                                             %
6368%                                                                             %
6369%                                                                             %
6370%   M a g i c k L i q u i d R e s c a l e I m a g e                           %
6371%                                                                             %
6372%                                                                             %
6373%                                                                             %
6374%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6375%
6376%  MagickLiquidRescaleImage() rescales image with seam carving.
6377%
6378%      MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand,
6379%        const size_t columns,const size_t rows,
6380%        const double delta_x,const double rigidity)
6381%
6382%  A description of each parameter follows:
6383%
6384%    o wand: the magick wand.
6385%
6386%    o columns: the number of columns in the scaled image.
6387%
6388%    o rows: the number of rows in the scaled image.
6389%
6390%    o delta_x: maximum seam transversal step (0 means straight seams).
6391%
6392%    o rigidity: introduce a bias for non-straight seams (typically 0).
6393%
6394*/
6395WandExport MagickBooleanType MagickLiquidRescaleImage(MagickWand *wand,
6396  const size_t columns,const size_t rows,const double delta_x,
6397  const double rigidity)
6398{
6399  Image
6400    *rescale_image;
6401
6402  assert(wand != (MagickWand *) NULL);
6403  assert(wand->signature == WandSignature);
6404  if (IfMagickTrue(wand->debug))
6405    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6406  if (wand->images == (Image *) NULL)
6407    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6408  rescale_image=LiquidRescaleImage(wand->images,columns,rows,delta_x,
6409    rigidity,wand->exception);
6410  if (rescale_image == (Image *) NULL)
6411    return(MagickFalse);
6412  ReplaceImageInList(&wand->images,rescale_image);
6413  return(MagickTrue);
6414}
6415
6416/*
6417%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6418%                                                                             %
6419%                                                                             %
6420%                                                                             %
6421%   M a g i c k M a g n i f y I m a g e                                       %
6422%                                                                             %
6423%                                                                             %
6424%                                                                             %
6425%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6426%
6427%  MagickMagnifyImage() is a convenience method that scales an image
6428%  proportionally to twice its original size.
6429%
6430%  The format of the MagickMagnifyImage method is:
6431%
6432%      MagickBooleanType MagickMagnifyImage(MagickWand *wand)
6433%
6434%  A description of each parameter follows:
6435%
6436%    o wand: the magick wand.
6437%
6438*/
6439WandExport MagickBooleanType MagickMagnifyImage(MagickWand *wand)
6440{
6441  Image
6442    *magnify_image;
6443
6444  assert(wand != (MagickWand *) NULL);
6445  assert(wand->signature == WandSignature);
6446  if (IfMagickTrue(wand->debug))
6447    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6448  if (wand->images == (Image *) NULL)
6449    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6450  magnify_image=MagnifyImage(wand->images,wand->exception);
6451  if (magnify_image == (Image *) NULL)
6452    return(MagickFalse);
6453  ReplaceImageInList(&wand->images,magnify_image);
6454  return(MagickTrue);
6455}
6456
6457/*
6458%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6459%                                                                             %
6460%                                                                             %
6461%                                                                             %
6462%   M a g i c k M e r g e I m a g e L a y e r s                               %
6463%                                                                             %
6464%                                                                             %
6465%                                                                             %
6466%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6467%
6468%  MagickMergeImageLayers() composes all the image layers from the current
6469%  given image onward to produce a single image of the merged layers.
6470%
6471%  The inital canvas's size depends on the given LayerMethod, and is
6472%  initialized using the first images background color.  The images
6473%  are then compositied onto that image in sequence using the given
6474%  composition that has been assigned to each individual image.
6475%
6476%  The format of the MagickMergeImageLayers method is:
6477%
6478%      MagickWand *MagickMergeImageLayers(MagickWand *wand,
6479%        const LayerMethod method)
6480%
6481%  A description of each parameter follows:
6482%
6483%    o wand: the magick wand.
6484%
6485%    o method: the method of selecting the size of the initial canvas.
6486%
6487%        MergeLayer: Merge all layers onto a canvas just large enough
6488%           to hold all the actual images. The virtual canvas of the
6489%           first image is preserved but otherwise ignored.
6490%
6491%        FlattenLayer: Use the virtual canvas size of first image.
6492%           Images which fall outside this canvas is clipped.
6493%           This can be used to 'fill out' a given virtual canvas.
6494%
6495%        MosaicLayer: Start with the virtual canvas of the first image,
6496%           enlarging left and right edges to contain all images.
6497%           Images with negative offsets will be clipped.
6498%
6499*/
6500WandExport MagickWand *MagickMergeImageLayers(MagickWand *wand,
6501  const LayerMethod method)
6502{
6503  Image
6504    *mosaic_image;
6505
6506  assert(wand != (MagickWand *) NULL);
6507  assert(wand->signature == WandSignature);
6508  if (IfMagickTrue(wand->debug))
6509    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6510  if (wand->images == (Image *) NULL)
6511    return((MagickWand *) NULL);
6512  mosaic_image=MergeImageLayers(wand->images,method,wand->exception);
6513  if (mosaic_image == (Image *) NULL)
6514    return((MagickWand *) NULL);
6515  return(CloneMagickWandFromImages(wand,mosaic_image));
6516}
6517
6518/*
6519%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6520%                                                                             %
6521%                                                                             %
6522%                                                                             %
6523%   M a g i c k M i n i f y I m a g e                                         %
6524%                                                                             %
6525%                                                                             %
6526%                                                                             %
6527%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6528%
6529%  MagickMinifyImage() is a convenience method that scales an image
6530%  proportionally to one-half its original size
6531%
6532%  The format of the MagickMinifyImage method is:
6533%
6534%      MagickBooleanType MagickMinifyImage(MagickWand *wand)
6535%
6536%  A description of each parameter follows:
6537%
6538%    o wand: the magick wand.
6539%
6540*/
6541WandExport MagickBooleanType MagickMinifyImage(MagickWand *wand)
6542{
6543  Image
6544    *minify_image;
6545
6546  assert(wand != (MagickWand *) NULL);
6547  assert(wand->signature == WandSignature);
6548  if (IfMagickTrue(wand->debug))
6549    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6550  if (wand->images == (Image *) NULL)
6551    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6552  minify_image=MinifyImage(wand->images,wand->exception);
6553  if (minify_image == (Image *) NULL)
6554    return(MagickFalse);
6555  ReplaceImageInList(&wand->images,minify_image);
6556  return(MagickTrue);
6557}
6558
6559/*
6560%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6561%                                                                             %
6562%                                                                             %
6563%                                                                             %
6564%   M a g i c k M o d u l a t e I m a g e                                     %
6565%                                                                             %
6566%                                                                             %
6567%                                                                             %
6568%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6569%
6570%  MagickModulateImage() lets you control the brightness, saturation, and hue
6571%  of an image.  Hue is the percentage of absolute rotation from the current
6572%  position.  For example 50 results in a counter-clockwise rotation of 90
6573%  degrees, 150 results in a clockwise rotation of 90 degrees, with 0 and 200
6574%  both resulting in a rotation of 180 degrees.
6575%
6576%  To increase the color brightness by 20% and decrease the color saturation by
6577%  10% and leave the hue unchanged, use: 120,90,100.
6578%
6579%  The format of the MagickModulateImage method is:
6580%
6581%      MagickBooleanType MagickModulateImage(MagickWand *wand,
6582%        const double brightness,const double saturation,const double hue)
6583%
6584%  A description of each parameter follows:
6585%
6586%    o wand: the magick wand.
6587%
6588%    o brightness: the percent change in brighness.
6589%
6590%    o saturation: the percent change in saturation.
6591%
6592%    o hue: the percent change in hue.
6593%
6594*/
6595WandExport MagickBooleanType MagickModulateImage(MagickWand *wand,
6596  const double brightness,const double saturation,const double hue)
6597{
6598  char
6599    modulate[MaxTextExtent];
6600
6601  MagickBooleanType
6602    status;
6603
6604  assert(wand != (MagickWand *) NULL);
6605  assert(wand->signature == WandSignature);
6606  if (IfMagickTrue(wand->debug))
6607    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6608  if (wand->images == (Image *) NULL)
6609    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6610  (void) FormatLocaleString(modulate,MaxTextExtent,"%g,%g,%g",
6611    brightness,saturation,hue);
6612  status=ModulateImage(wand->images,modulate,wand->exception);
6613  return(status);
6614}
6615
6616/*
6617%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6618%                                                                             %
6619%                                                                             %
6620%                                                                             %
6621%   M a g i c k M o n t a g e I m a g e                                       %
6622%                                                                             %
6623%                                                                             %
6624%                                                                             %
6625%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6626%
6627%  MagickMontageImage() creates a composite image by combining several
6628%  separate images. The images are tiled on the composite image with the name
6629%  of the image optionally appearing just below the individual tile.
6630%
6631%  The format of the MagickMontageImage method is:
6632%
6633%      MagickWand *MagickMontageImage(MagickWand *wand,
6634%        const DrawingWand drawing_wand,const char *tile_geometry,
6635%        const char *thumbnail_geometry,const MontageMode mode,
6636%        const char *frame)
6637%
6638%  A description of each parameter follows:
6639%
6640%    o wand: the magick wand.
6641%
6642%    o drawing_wand: the drawing wand.  The font name, size, and color are
6643%      obtained from this wand.
6644%
6645%    o tile_geometry: the number of tiles per row and page (e.g. 6x4+0+0).
6646%
6647%    o thumbnail_geometry: Preferred image size and border size of each
6648%      thumbnail (e.g. 120x120+4+3>).
6649%
6650%    o mode: Thumbnail framing mode: Frame, Unframe, or Concatenate.
6651%
6652%    o frame: Surround the image with an ornamental border (e.g. 15x15+3+3).
6653%      The frame color is that of the thumbnail's matte color.
6654%
6655*/
6656WandExport MagickWand *MagickMontageImage(MagickWand *wand,
6657  const DrawingWand *drawing_wand,const char *tile_geometry,
6658  const char *thumbnail_geometry,const MontageMode mode,const char *frame)
6659{
6660  char
6661    *font;
6662
6663  Image
6664    *montage_image;
6665
6666  MontageInfo
6667    *montage_info;
6668
6669  PixelWand
6670    *pixel_wand;
6671
6672  assert(wand != (MagickWand *) NULL);
6673  assert(wand->signature == WandSignature);
6674  if (IfMagickTrue(wand->debug))
6675    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6676  if (wand->images == (Image *) NULL)
6677    return((MagickWand *) NULL);
6678  montage_info=CloneMontageInfo(wand->image_info,(MontageInfo *) NULL);
6679  switch (mode)
6680  {
6681    case FrameMode:
6682    {
6683      (void) CloneString(&montage_info->frame,"15x15+3+3");
6684      montage_info->shadow=MagickTrue;
6685      break;
6686    }
6687    case UnframeMode:
6688    {
6689      montage_info->frame=(char *) NULL;
6690      montage_info->shadow=MagickFalse;
6691      montage_info->border_width=0;
6692      break;
6693    }
6694    case ConcatenateMode:
6695    {
6696      montage_info->frame=(char *) NULL;
6697      montage_info->shadow=MagickFalse;
6698      (void) CloneString(&montage_info->geometry,"+0+0");
6699      montage_info->border_width=0;
6700      break;
6701    }
6702    default:
6703      break;
6704  }
6705  font=DrawGetFont(drawing_wand);
6706  if (font != (char *) NULL)
6707    (void) CloneString(&montage_info->font,font);
6708  if (frame != (char *) NULL)
6709    (void) CloneString(&montage_info->frame,frame);
6710  montage_info->pointsize=DrawGetFontSize(drawing_wand);
6711  pixel_wand=NewPixelWand();
6712  DrawGetFillColor(drawing_wand,pixel_wand);
6713  PixelGetQuantumPacket(pixel_wand,&montage_info->fill);
6714  DrawGetStrokeColor(drawing_wand,pixel_wand);
6715  PixelGetQuantumPacket(pixel_wand,&montage_info->stroke);
6716  pixel_wand=DestroyPixelWand(pixel_wand);
6717  if (thumbnail_geometry != (char *) NULL)
6718    (void) CloneString(&montage_info->geometry,thumbnail_geometry);
6719  if (tile_geometry != (char *) NULL)
6720    (void) CloneString(&montage_info->tile,tile_geometry);
6721  montage_image=MontageImageList(wand->image_info,montage_info,wand->images,
6722    wand->exception);
6723  montage_info=DestroyMontageInfo(montage_info);
6724  if (montage_image == (Image *) NULL)
6725    return((MagickWand *) NULL);
6726  return(CloneMagickWandFromImages(wand,montage_image));
6727}
6728
6729/*
6730%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6731%                                                                             %
6732%                                                                             %
6733%                                                                             %
6734%   M a g i c k M o r p h I m a g e s                                         %
6735%                                                                             %
6736%                                                                             %
6737%                                                                             %
6738%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6739%
6740%  MagickMorphImages() method morphs a set of images.  Both the image pixels
6741%  and size are linearly interpolated to give the appearance of a
6742%  meta-morphosis from one image to the next.
6743%
6744%  The format of the MagickMorphImages method is:
6745%
6746%      MagickWand *MagickMorphImages(MagickWand *wand,
6747%        const size_t number_frames)
6748%
6749%  A description of each parameter follows:
6750%
6751%    o wand: the magick wand.
6752%
6753%    o number_frames: the number of in-between images to generate.
6754%
6755*/
6756WandExport MagickWand *MagickMorphImages(MagickWand *wand,
6757  const size_t number_frames)
6758{
6759  Image
6760    *morph_image;
6761
6762  assert(wand != (MagickWand *) NULL);
6763  assert(wand->signature == WandSignature);
6764  if (IfMagickTrue(wand->debug))
6765    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6766  if (wand->images == (Image *) NULL)
6767    return((MagickWand *) NULL);
6768  morph_image=MorphImages(wand->images,number_frames,wand->exception);
6769  if (morph_image == (Image *) NULL)
6770    return((MagickWand *) NULL);
6771  return(CloneMagickWandFromImages(wand,morph_image));
6772}
6773
6774/*
6775%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6776%                                                                             %
6777%                                                                             %
6778%                                                                             %
6779%   M a g i c k M o r p h o l o g y I m a g e                                 %
6780%                                                                             %
6781%                                                                             %
6782%                                                                             %
6783%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6784%
6785%  MagickMorphologyImage() applies a user supplied kernel to the image
6786%  according to the given mophology method.
6787%
6788%  The format of the MagickMorphologyImage method is:
6789%
6790%      MagickBooleanType MagickMorphologyImage(MagickWand *wand,
6791%        MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
6792%
6793%  A description of each parameter follows:
6794%
6795%    o wand: the magick wand.
6796%
6797%    o method: the morphology method to be applied.
6798%
6799%    o iterations: apply the operation this many times (or no change).
6800%      A value of -1 means loop until no change found.  How this is applied
6801%      may depend on the morphology method.  Typically this is a value of 1.
6802%
6803%    o kernel: An array of doubles representing the morphology kernel.
6804%
6805*/
6806WandExport MagickBooleanType MagickMorphologyImage(MagickWand *wand,
6807  MorphologyMethod method,const ssize_t iterations,KernelInfo *kernel)
6808{
6809  Image
6810    *morphology_image;
6811
6812  assert(wand != (MagickWand *) NULL);
6813  assert(wand->signature == WandSignature);
6814  if (IfMagickTrue(wand->debug))
6815    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6816  if (kernel == (const KernelInfo *) NULL)
6817    return(MagickFalse);
6818  if (wand->images == (Image *) NULL)
6819    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6820  morphology_image=MorphologyImage(wand->images,method,iterations,kernel,
6821    wand->exception);
6822  if (morphology_image == (Image *) NULL)
6823    return(MagickFalse);
6824  ReplaceImageInList(&wand->images,morphology_image);
6825  return(MagickTrue);
6826}
6827
6828/*
6829%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6830%                                                                             %
6831%                                                                             %
6832%                                                                             %
6833%   M a g i c k M o t i o n B l u r I m a g e                                 %
6834%                                                                             %
6835%                                                                             %
6836%                                                                             %
6837%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6838%
6839%  MagickMotionBlurImage() simulates motion blur.  We convolve the image with a
6840%  Gaussian operator of the given radius and standard deviation (sigma).
6841%  For reasonable results, radius should be larger than sigma.  Use a
6842%  radius of 0 and MotionBlurImage() selects a suitable radius for you.
6843%  Angle gives the angle of the blurring motion.
6844%
6845%  The format of the MagickMotionBlurImage method is:
6846%
6847%      MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
6848%        const double radius,const double sigma,const double angle)
6849%
6850%  A description of each parameter follows:
6851%
6852%    o wand: the magick wand.
6853%
6854%    o radius: the radius of the Gaussian, in pixels, not counting
6855%      the center pixel.
6856%
6857%    o sigma: the standard deviation of the Gaussian, in pixels.
6858%
6859%    o angle: Apply the effect along this angle.
6860%
6861*/
6862WandExport MagickBooleanType MagickMotionBlurImage(MagickWand *wand,
6863  const double radius,const double sigma,const double angle)
6864{
6865  Image
6866    *blur_image;
6867
6868  assert(wand != (MagickWand *) NULL);
6869  assert(wand->signature == WandSignature);
6870  if (IfMagickTrue(wand->debug))
6871    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6872  if (wand->images == (Image *) NULL)
6873    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6874  blur_image=MotionBlurImage(wand->images,radius,sigma,angle,wand->exception);
6875  if (blur_image == (Image *) NULL)
6876    return(MagickFalse);
6877  ReplaceImageInList(&wand->images,blur_image);
6878  return(MagickTrue);
6879}
6880
6881/*
6882%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6883%                                                                             %
6884%                                                                             %
6885%                                                                             %
6886%   M a g i c k N e g a t e I m a g e                                         %
6887%                                                                             %
6888%                                                                             %
6889%                                                                             %
6890%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6891%
6892%  MagickNegateImage() negates the colors in the reference image.  The
6893%  Grayscale option means that only grayscale values within the image are
6894%  negated.
6895%
6896%  You can also reduce the influence of a particular channel with a gamma
6897%  value of 0.
6898%
6899%  The format of the MagickNegateImage method is:
6900%
6901%      MagickBooleanType MagickNegateImage(MagickWand *wand,
6902%        const MagickBooleanType gray)
6903%
6904%  A description of each parameter follows:
6905%
6906%    o wand: the magick wand.
6907%
6908%    o gray: If MagickTrue, only negate grayscale pixels within the image.
6909%
6910*/
6911WandExport MagickBooleanType MagickNegateImage(MagickWand *wand,
6912  const MagickBooleanType gray)
6913{
6914  MagickBooleanType
6915    status;
6916
6917  assert(wand != (MagickWand *) NULL);
6918  assert(wand->signature == WandSignature);
6919  if (IfMagickTrue(wand->debug))
6920    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6921  if (wand->images == (Image *) NULL)
6922    ThrowWandException(WandError,"ContainsNoImages",wand->name);
6923  status=NegateImage(wand->images,gray,wand->exception);
6924  return(status);
6925}
6926
6927/*
6928%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6929%                                                                             %
6930%                                                                             %
6931%                                                                             %
6932%   M a g i c k N e w I m a g e                                               %
6933%                                                                             %
6934%                                                                             %
6935%                                                                             %
6936%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6937%
6938%  MagickNewImage() adds a blank image canvas of the specified size and
6939%  background color to the wand.
6940%
6941%  The format of the MagickNewImage method is:
6942%
6943%      MagickBooleanType MagickNewImage(MagickWand *wand,
6944%        const size_t columns,const size_t rows,
6945%        const PixelWand *background)
6946%
6947%  A description of each parameter follows:
6948%
6949%    o wand: the magick wand.
6950%
6951%    o width: the image width.
6952%
6953%    o height: the image height.
6954%
6955%    o background: the image color.
6956%
6957*/
6958WandExport MagickBooleanType MagickNewImage(MagickWand *wand,const size_t width,
6959  const size_t height,const PixelWand *background)
6960{
6961  Image
6962    *images;
6963
6964  PixelInfo
6965    pixel;
6966
6967  assert(wand != (MagickWand *) NULL);
6968  assert(wand->signature == WandSignature);
6969  if (IfMagickTrue(wand->debug))
6970    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
6971  PixelGetMagickColor(background,&pixel);
6972  images=NewMagickImage(wand->image_info,width,height,&pixel,wand->exception);
6973  if (images == (Image *) NULL)
6974    return(MagickFalse);
6975  return(InsertImageInWand(wand,images));
6976}
6977
6978/*
6979%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6980%                                                                             %
6981%                                                                             %
6982%                                                                             %
6983%   M a g i c k N e x t I m a g e                                             %
6984%                                                                             %
6985%                                                                             %
6986%                                                                             %
6987%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6988%
6989%  MagickNextImage() sets the next image in the wand as the current image.
6990%
6991%  It is typically used after MagickResetIterator(), after which its first use
6992%  will set the first image as the current image (unless the wand is empty).
6993%
6994%  It will return MagickFalse when no more images are left to be returned
6995%  which happens when the wand is empty, or the current image is the last
6996%  image.
6997%
6998%  When the above condition (end of image list) is reached, the iterator is
6999%  automaticall set so that you can start using MagickPreviousImage() to
7000%  again iterate over the images in the reverse direction, starting with the
7001%  last image (again).  You can jump to this condition immeditally using
7002%  MagickSetLastIterator().
7003%
7004%  The format of the MagickNextImage method is:
7005%
7006%      MagickBooleanType MagickNextImage(MagickWand *wand)
7007%
7008%  A description of each parameter follows:
7009%
7010%    o wand: the magick wand.
7011%
7012*/
7013WandExport MagickBooleanType MagickNextImage(MagickWand *wand)
7014{
7015  assert(wand != (MagickWand *) NULL);
7016  assert(wand->signature == WandSignature);
7017  if (IfMagickTrue(wand->debug))
7018    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7019  if (wand->images == (Image *) NULL)
7020    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7021  wand->insert_before=MagickFalse; /* Inserts is now appended */
7022  if (IfMagickTrue(wand->image_pending))
7023    {
7024      wand->image_pending=MagickFalse;
7025      return(MagickTrue);
7026    }
7027  if (GetNextImageInList(wand->images) == (Image *) NULL)
7028    {
7029      wand->image_pending=MagickTrue; /* No image, PreviousImage re-gets */
7030      return(MagickFalse);
7031    }
7032  wand->images=GetNextImageInList(wand->images);
7033  return(MagickTrue);
7034}
7035
7036/*
7037%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7038%                                                                             %
7039%                                                                             %
7040%                                                                             %
7041%   M a g i c k N o r m a l i z e I m a g e                                   %
7042%                                                                             %
7043%                                                                             %
7044%                                                                             %
7045%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7046%
7047%  MagickNormalizeImage() enhances the contrast of a color image by adjusting
7048%  the pixels color to span the entire range of colors available
7049%
7050%  You can also reduce the influence of a particular channel with a gamma
7051%  value of 0.
7052%
7053%  The format of the MagickNormalizeImage method is:
7054%
7055%      MagickBooleanType MagickNormalizeImage(MagickWand *wand)
7056%
7057%  A description of each parameter follows:
7058%
7059%    o wand: the magick wand.
7060%
7061*/
7062WandExport MagickBooleanType MagickNormalizeImage(MagickWand *wand)
7063{
7064  MagickBooleanType
7065    status;
7066
7067  assert(wand != (MagickWand *) NULL);
7068  assert(wand->signature == WandSignature);
7069  if (IfMagickTrue(wand->debug))
7070    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7071  if (wand->images == (Image *) NULL)
7072    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7073  status=NormalizeImage(wand->images,wand->exception);
7074  return(status);
7075}
7076
7077/*
7078%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7079%                                                                             %
7080%                                                                             %
7081%                                                                             %
7082%   M a g i c k O i l P a i n t I m a g e                                     %
7083%                                                                             %
7084%                                                                             %
7085%                                                                             %
7086%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7087%
7088%  MagickOilPaintImage() applies a special effect filter that simulates an oil
7089%  painting.  Each pixel is replaced by the most frequent color occurring
7090%  in a circular region defined by radius.
7091%
7092%  The format of the MagickOilPaintImage method is:
7093%
7094%      MagickBooleanType MagickOilPaintImage(MagickWand *wand,
7095%        const double radius,const double sigma)
7096%
7097%  A description of each parameter follows:
7098%
7099%    o wand: the magick wand.
7100%
7101%    o radius: the radius of the circular neighborhood.
7102%
7103%    o sigma: the standard deviation of the Gaussian, in pixels.
7104%
7105*/
7106WandExport MagickBooleanType MagickOilPaintImage(MagickWand *wand,
7107  const double radius,const double sigma)
7108{
7109  Image
7110    *paint_image;
7111
7112  assert(wand != (MagickWand *) NULL);
7113  assert(wand->signature == WandSignature);
7114  if (IfMagickTrue(wand->debug))
7115    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7116  if (wand->images == (Image *) NULL)
7117    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7118  paint_image=OilPaintImage(wand->images,radius,sigma,wand->exception);
7119  if (paint_image == (Image *) NULL)
7120    return(MagickFalse);
7121  ReplaceImageInList(&wand->images,paint_image);
7122  return(MagickTrue);
7123}
7124
7125/*
7126%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7127%                                                                             %
7128%                                                                             %
7129%                                                                             %
7130%   M a g i c k O p a q u e P a i n t I m a g e                               %
7131%                                                                             %
7132%                                                                             %
7133%                                                                             %
7134%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7135%
7136%  MagickOpaquePaintImage() changes any pixel that matches color with the color
7137%  defined by fill.
7138%
7139%  The format of the MagickOpaquePaintImage method is:
7140%
7141%      MagickBooleanType MagickOpaquePaintImage(MagickWand *wand,
7142%        const PixelWand *target,const PixelWand *fill,const double fuzz,
7143%        const MagickBooleanType invert)
7144%
7145%  A description of each parameter follows:
7146%
7147%    o wand: the magick wand.
7148%
7149%    o target: Change this target color to the fill color within the image.
7150%
7151%    o fill: the fill pixel wand.
7152%
7153%    o fuzz: By default target must match a particular pixel color
7154%      exactly.  However, in many cases two colors may differ by a small amount.
7155%      The fuzz member of image defines how much tolerance is acceptable to
7156%      consider two colors as the same.  For example, set fuzz to 10 and the
7157%      color red at intensities of 100 and 102 respectively are now interpreted
7158%      as the same color for the purposes of the floodfill.
7159%
7160%    o invert: paint any pixel that does not match the target color.
7161%
7162*/
7163WandExport MagickBooleanType MagickOpaquePaintImage(MagickWand *wand,
7164  const PixelWand *target,const PixelWand *fill,const double fuzz,
7165  const MagickBooleanType invert)
7166{
7167  MagickBooleanType
7168    status;
7169
7170  PixelInfo
7171    fill_pixel,
7172    target_pixel;
7173
7174  assert(wand != (MagickWand *) NULL);
7175  assert(wand->signature == WandSignature);
7176  if (IfMagickTrue(wand->debug))
7177    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7178  if (wand->images == (Image *) NULL)
7179    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7180  PixelGetMagickColor(target,&target_pixel);
7181  PixelGetMagickColor(fill,&fill_pixel);
7182  wand->images->fuzz=fuzz;
7183  status=OpaquePaintImage(wand->images,&target_pixel,&fill_pixel,invert,
7184    wand->exception);
7185  return(status);
7186}
7187
7188/*
7189%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7190%                                                                             %
7191%                                                                             %
7192%                                                                             %
7193%   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                         %
7194%                                                                             %
7195%                                                                             %
7196%                                                                             %
7197%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7198%
7199%  MagickOptimizeImageLayers() compares each image the GIF disposed forms of the
7200%  previous image in the sequence.  From this it attempts to select the
7201%  smallest cropped image to replace each frame, while preserving the results
7202%  of the animation.
7203%
7204%  The format of the MagickOptimizeImageLayers method is:
7205%
7206%      MagickWand *MagickOptimizeImageLayers(MagickWand *wand)
7207%
7208%  A description of each parameter follows:
7209%
7210%    o wand: the magick wand.
7211%
7212*/
7213WandExport MagickWand *MagickOptimizeImageLayers(MagickWand *wand)
7214{
7215  Image
7216    *optimize_image;
7217
7218  assert(wand != (MagickWand *) NULL);
7219  assert(wand->signature == WandSignature);
7220  if (IfMagickTrue(wand->debug))
7221    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7222  if (wand->images == (Image *) NULL)
7223    return((MagickWand *) NULL);
7224  optimize_image=OptimizeImageLayers(wand->images,wand->exception);
7225  if (optimize_image == (Image *) NULL)
7226    return((MagickWand *) NULL);
7227  return(CloneMagickWandFromImages(wand,optimize_image));
7228}
7229
7230/*
7231%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7232%                                                                             %
7233%                                                                             %
7234%                                                                             %
7235%   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             %
7236%                                                                             %
7237%                                                                             %
7238%                                                                             %
7239%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7240%
7241%  MagickOptimizeImageTransparency() takes a frame optimized GIF animation, and
7242%  compares the overlayed pixels against the disposal image resulting from all
7243%  the previous frames in the animation.  Any pixel that does not change the
7244%  disposal image (and thus does not effect the outcome of an overlay) is made
7245%  transparent.
7246%
7247%  WARNING: This modifies the current images directly, rather than generate
7248%  a new image sequence.
7249%  The format of the MagickOptimizeImageTransparency method is:
7250%
7251%      MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand)
7252%
7253%  A description of each parameter follows:
7254%
7255%    o wand: the magick wand.
7256%
7257*/
7258WandExport MagickBooleanType MagickOptimizeImageTransparency(MagickWand *wand)
7259{
7260  assert(wand != (MagickWand *) NULL);
7261  assert(wand->signature == WandSignature);
7262  if (IfMagickTrue(wand->debug))
7263    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7264  if (wand->images == (Image *) NULL)
7265    return(MagickFalse);
7266  OptimizeImageTransparency(wand->images,wand->exception);
7267  return(MagickTrue);
7268}
7269
7270/*
7271%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7272%                                                                             %
7273%                                                                             %
7274%                                                                             %
7275%     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                   %
7276%                                                                             %
7277%                                                                             %
7278%                                                                             %
7279%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7280%
7281%  MagickOrderedPosterizeImage() performs an ordered dither based on a number
7282%  of pre-defined dithering threshold maps, but over multiple intensity levels,
7283%  which can be different for different channels, according to the input
7284%  arguments.
7285%
7286%  The format of the MagickOrderedPosterizeImage method is:
7287%
7288%      MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand,
7289%        const char *threshold_map)
7290%
7291%  A description of each parameter follows:
7292%
7293%    o image: the image.
7294%
7295%    o threshold_map: A string containing the name of the threshold dither
7296%      map to use, followed by zero or more numbers representing the number of
7297%      color levels tho dither between.
7298%
7299%      Any level number less than 2 is equivalent to 2, and means only binary
7300%      dithering will be applied to each color channel.
7301%
7302%      No numbers also means a 2 level (bitmap) dither will be applied to all
7303%      channels, while a single number is the number of levels applied to each
7304%      channel in sequence.  More numbers will be applied in turn to each of
7305%      the color channels.
7306%
7307%      For example: "o3x3,6" generates a 6 level posterization of the image
7308%      with a ordered 3x3 diffused pixel dither being applied between each
7309%      level. While checker,8,8,4 will produce a 332 colormaped image with
7310%      only a single checkerboard hash pattern (50% grey) between each color
7311%      level, to basically double the number of color levels with a bare
7312%      minimim of dithering.
7313%
7314*/
7315WandExport MagickBooleanType MagickOrderedPosterizeImage(MagickWand *wand,
7316  const char *threshold_map)
7317{
7318  MagickBooleanType
7319    status;
7320
7321  assert(wand != (MagickWand *) NULL);
7322  assert(wand->signature == WandSignature);
7323  if (IfMagickTrue(wand->debug))
7324    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7325  if (wand->images == (Image *) NULL)
7326    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7327  status=OrderedPosterizeImage(wand->images,threshold_map,wand->exception);
7328  return(status);
7329}
7330
7331/*
7332%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7333%                                                                             %
7334%                                                                             %
7335%                                                                             %
7336%   M a g i c k P i n g I m a g e                                             %
7337%                                                                             %
7338%                                                                             %
7339%                                                                             %
7340%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7341%
7342%  MagickPingImage() is the same as MagickReadImage() except the only valid
7343%  information returned is the image width, height, size, and format.  It
7344%  is designed to efficiently obtain this information from a file without
7345%  reading the entire image sequence into memory.
7346%
7347%  The format of the MagickPingImage method is:
7348%
7349%      MagickBooleanType MagickPingImage(MagickWand *wand,const char *filename)
7350%
7351%  A description of each parameter follows:
7352%
7353%    o wand: the magick wand.
7354%
7355%    o filename: the image filename.
7356%
7357*/
7358WandExport MagickBooleanType MagickPingImage(MagickWand *wand,
7359  const char *filename)
7360{
7361  Image
7362    *images;
7363
7364  ImageInfo
7365    *ping_info;
7366
7367  assert(wand != (MagickWand *) NULL);
7368  assert(wand->signature == WandSignature);
7369  if (IfMagickTrue(wand->debug))
7370    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7371  ping_info=CloneImageInfo(wand->image_info);
7372  if (filename != (const char *) NULL)
7373    (void) CopyMagickString(ping_info->filename,filename,MaxTextExtent);
7374  images=PingImage(ping_info,wand->exception);
7375  ping_info=DestroyImageInfo(ping_info);
7376  if (images == (Image *) NULL)
7377    return(MagickFalse);
7378  return(InsertImageInWand(wand,images));
7379}
7380
7381/*
7382%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7383%                                                                             %
7384%                                                                             %
7385%                                                                             %
7386%   M a g i c k P i n g I m a g e B l o b                                     %
7387%                                                                             %
7388%                                                                             %
7389%                                                                             %
7390%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7391%
7392%  MagickPingImageBlob() pings an image or image sequence from a blob.
7393%
7394%  The format of the MagickPingImageBlob method is:
7395%
7396%      MagickBooleanType MagickPingImageBlob(MagickWand *wand,
7397%        const void *blob,const size_t length)
7398%
7399%  A description of each parameter follows:
7400%
7401%    o wand: the magick wand.
7402%
7403%    o blob: the blob.
7404%
7405%    o length: the blob length.
7406%
7407*/
7408WandExport MagickBooleanType MagickPingImageBlob(MagickWand *wand,
7409  const void *blob,const size_t length)
7410{
7411  Image
7412    *images;
7413
7414  ImageInfo
7415    *read_info;
7416
7417  assert(wand != (MagickWand *) NULL);
7418  assert(wand->signature == WandSignature);
7419  if (IfMagickTrue(wand->debug))
7420    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7421  read_info=CloneImageInfo(wand->image_info);
7422  SetImageInfoBlob(read_info,blob,length);
7423  images=PingImage(read_info,wand->exception);
7424  read_info=DestroyImageInfo(read_info);
7425  if (images == (Image *) NULL)
7426    return(MagickFalse);
7427  return(InsertImageInWand(wand,images));
7428}
7429
7430/*
7431%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7432%                                                                             %
7433%                                                                             %
7434%                                                                             %
7435%   M a g i c k P i n g I m a g e F i l e                                     %
7436%                                                                             %
7437%                                                                             %
7438%                                                                             %
7439%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7440%
7441%  MagickPingImageFile() pings an image or image sequence from an open file
7442%  descriptor.
7443%
7444%  The format of the MagickPingImageFile method is:
7445%
7446%      MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file)
7447%
7448%  A description of each parameter follows:
7449%
7450%    o wand: the magick wand.
7451%
7452%    o file: the file descriptor.
7453%
7454*/
7455WandExport MagickBooleanType MagickPingImageFile(MagickWand *wand,FILE *file)
7456{
7457  Image
7458    *images;
7459
7460  ImageInfo
7461    *read_info;
7462
7463  assert(wand != (MagickWand *) NULL);
7464  assert(wand->signature == WandSignature);
7465  assert(file != (FILE *) NULL);
7466  if (IfMagickTrue(wand->debug))
7467    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7468  read_info=CloneImageInfo(wand->image_info);
7469  SetImageInfoFile(read_info,file);
7470  images=PingImage(read_info,wand->exception);
7471  read_info=DestroyImageInfo(read_info);
7472  if (images == (Image *) NULL)
7473    return(MagickFalse);
7474  return(InsertImageInWand(wand,images));
7475}
7476
7477/*
7478%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7479%                                                                             %
7480%                                                                             %
7481%                                                                             %
7482%   M a g i c k P o l a r o i d I m a g e                                     %
7483%                                                                             %
7484%                                                                             %
7485%                                                                             %
7486%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7487%
7488%  MagickPolaroidImage() simulates a Polaroid picture.
7489%
7490%  The format of the MagickPolaroidImage method is:
7491%
7492%      MagickBooleanType MagickPolaroidImage(MagickWand *wand,
7493%        const DrawingWand *drawing_wand,const char *caption,const double angle,
7494%        const PixelInterpolateMethod method)
7495%
7496%  A description of each parameter follows:
7497%
7498%    o wand: the magick wand.
7499%
7500%    o drawing_wand: the draw wand.
7501%
7502%    o caption: the Polaroid caption.
7503%
7504%    o angle: Apply the effect along this angle.
7505%
7506%    o method: the pixel interpolation method.
7507%
7508*/
7509WandExport MagickBooleanType MagickPolaroidImage(MagickWand *wand,
7510  const DrawingWand *drawing_wand,const char *caption,const double angle,
7511  const PixelInterpolateMethod method)
7512{
7513  DrawInfo
7514    *draw_info;
7515
7516  Image
7517    *polaroid_image;
7518
7519  assert(wand != (MagickWand *) NULL);
7520  assert(wand->signature == WandSignature);
7521  if (IfMagickTrue(wand->debug))
7522    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7523  if (wand->images == (Image *) NULL)
7524    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7525  draw_info=PeekDrawingWand(drawing_wand);
7526  if (draw_info == (DrawInfo *) NULL)
7527    return(MagickFalse);
7528  polaroid_image=PolaroidImage(wand->images,draw_info,caption,angle,method,
7529    wand->exception);
7530  if (polaroid_image == (Image *) NULL)
7531    return(MagickFalse);
7532  ReplaceImageInList(&wand->images,polaroid_image);
7533  return(MagickTrue);
7534}
7535
7536/*
7537%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7538%                                                                             %
7539%                                                                             %
7540%                                                                             %
7541%   M a g i c k P o s t e r i z e I m a g e                                   %
7542%                                                                             %
7543%                                                                             %
7544%                                                                             %
7545%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7546%
7547%  MagickPosterizeImage() reduces the image to a limited number of color level.
7548%
7549%  The format of the MagickPosterizeImage method is:
7550%
7551%      MagickBooleanType MagickPosterizeImage(MagickWand *wand,
7552%        const size_t levels,const DitherMethod method)
7553%
7554%  A description of each parameter follows:
7555%
7556%    o wand: the magick wand.
7557%
7558%    o levels: Number of color levels allowed in each channel.  Very low values
7559%      (2, 3, or 4) have the most visible effect.
7560%
7561%    o method: choose the dither method: UndefinedDitherMethod,
7562%      NoDitherMethod, RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
7563%
7564*/
7565WandExport MagickBooleanType MagickPosterizeImage(MagickWand *wand,
7566  const size_t levels,const DitherMethod dither)
7567{
7568  MagickBooleanType
7569    status;
7570
7571  assert(wand != (MagickWand *) NULL);
7572  assert(wand->signature == WandSignature);
7573  if (IfMagickTrue(wand->debug))
7574    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7575  if (wand->images == (Image *) NULL)
7576    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7577  status=PosterizeImage(wand->images,levels,dither,wand->exception);
7578  return(status);
7579}
7580
7581/*
7582%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7583%                                                                             %
7584%                                                                             %
7585%                                                                             %
7586%   M a g i c k P r e v i e w I m a g e s                                     %
7587%                                                                             %
7588%                                                                             %
7589%                                                                             %
7590%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7591%
7592%  MagickPreviewImages() tiles 9 thumbnails of the specified image with an
7593%  image processing operation applied at varying strengths.  This helpful
7594%  to quickly pin-point an appropriate parameter for an image processing
7595%  operation.
7596%
7597%  The format of the MagickPreviewImages method is:
7598%
7599%      MagickWand *MagickPreviewImages(MagickWand *wand,
7600%        const PreviewType preview)
7601%
7602%  A description of each parameter follows:
7603%
7604%    o wand: the magick wand.
7605%
7606%    o preview: the preview type.
7607%
7608*/
7609WandExport MagickWand *MagickPreviewImages(MagickWand *wand,
7610  const PreviewType preview)
7611{
7612  Image
7613    *preview_image;
7614
7615  assert(wand != (MagickWand *) NULL);
7616  assert(wand->signature == WandSignature);
7617  if (IfMagickTrue(wand->debug))
7618    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7619  if (wand->images == (Image *) NULL)
7620    return((MagickWand *) NULL);
7621  preview_image=PreviewImage(wand->images,preview,wand->exception);
7622  if (preview_image == (Image *) NULL)
7623    return((MagickWand *) NULL);
7624  return(CloneMagickWandFromImages(wand,preview_image));
7625}
7626
7627/*
7628%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7629%                                                                             %
7630%                                                                             %
7631%                                                                             %
7632%   M a g i c k P r e v i o u s I m a g e                                     %
7633%                                                                             %
7634%                                                                             %
7635%                                                                             %
7636%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7637%
7638%  MagickPreviousImage() sets the previous image in the wand as the current
7639%  image.
7640%
7641%  It is typically used after MagickSetLastIterator(), after which its first
7642%  use will set the last image as the current image (unless the wand is empty).
7643%
7644%  It will return MagickFalse when no more images are left to be returned
7645%  which happens when the wand is empty, or the current image is the first
7646%  image.  At that point the iterator is than reset to again process images in
7647%  the forward direction, again starting with the first image in list. Images
7648%  added at this point are prepended.
7649%
7650%  Also at that point any images added to the wand using MagickAddImages() or
7651%  MagickReadImages() will be prepended before the first image. In this sense
7652%  the condition is not quite exactly the same as MagickResetIterator().
7653%
7654%  The format of the MagickPreviousImage method is:
7655%
7656%      MagickBooleanType MagickPreviousImage(MagickWand *wand)
7657%
7658%  A description of each parameter follows:
7659%
7660%    o wand: the magick wand.
7661%
7662*/
7663WandExport MagickBooleanType MagickPreviousImage(MagickWand *wand)
7664{
7665  assert(wand != (MagickWand *) NULL);
7666  assert(wand->signature == WandSignature);
7667  if (IfMagickTrue(wand->debug))
7668    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7669  if (wand->images == (Image *) NULL)
7670    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7671  if (IfMagickTrue(wand->image_pending))
7672    {
7673      wand->image_pending=MagickFalse;  /* image returned no longer pending */
7674      return(MagickTrue);
7675    }
7676  if (GetPreviousImageInList(wand->images) == (Image *) NULL)
7677    {
7678      wand->image_pending=MagickTrue;   /* Next now re-gets first image */
7679      wand->insert_before=MagickTrue;   /* insert/add prepends new images */
7680      return(MagickFalse);
7681    }
7682  wand->images=GetPreviousImageInList(wand->images);
7683  return(MagickTrue);
7684}
7685
7686/*
7687%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7688%                                                                             %
7689%                                                                             %
7690%                                                                             %
7691%   M a g i c k Q u a n t i z e I m a g e                                     %
7692%                                                                             %
7693%                                                                             %
7694%                                                                             %
7695%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7696%
7697%  MagickQuantizeImage() analyzes the colors within a reference image and
7698%  chooses a fixed number of colors to represent the image.  The goal of the
7699%  algorithm is to minimize the color difference between the input and output
7700%  image while minimizing the processing time.
7701%
7702%  The format of the MagickQuantizeImage method is:
7703%
7704%      MagickBooleanType MagickQuantizeImage(MagickWand *wand,
7705%        const size_t number_colors,const ColorspaceType colorspace,
7706%        const size_t treedepth,const DitherMethod dither_method,
7707%        const MagickBooleanType measure_error)
7708%
7709%  A description of each parameter follows:
7710%
7711%    o wand: the magick wand.
7712%
7713%    o number_colors: the number of colors.
7714%
7715%    o colorspace: Perform color reduction in this colorspace, typically
7716%      RGBColorspace.
7717%
7718%    o treedepth: Normally, this integer value is zero or one.  A zero or
7719%      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
7720%      reference image with the least amount of memory and the fastest
7721%      computational speed.  In some cases, such as an image with low color
7722%      dispersion (a few number of colors), a value other than
7723%      Log4(number_colors) is required.  To expand the color tree completely,
7724%      use a value of 8.
7725%
7726%    o dither_method: choose from UndefinedDitherMethod, NoDitherMethod,
7727%      RiemersmaDitherMethod, FloydSteinbergDitherMethod.
7728%
7729%    o measure_error: A value other than zero measures the difference between
7730%      the original and quantized images.  This difference is the total
7731%      quantization error.  The error is computed by summing over all pixels
7732%      in an image the distance squared in RGB space between each reference
7733%      pixel value and its quantized value.
7734%
7735*/
7736WandExport MagickBooleanType MagickQuantizeImage(MagickWand *wand,
7737  const size_t number_colors,const ColorspaceType colorspace,
7738  const size_t treedepth,const DitherMethod dither_method,
7739  const MagickBooleanType measure_error)
7740{
7741  MagickBooleanType
7742    status;
7743
7744  QuantizeInfo
7745    *quantize_info;
7746
7747  assert(wand != (MagickWand *) NULL);
7748  assert(wand->signature == WandSignature);
7749  if (IfMagickTrue(wand->debug))
7750    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7751  if (wand->images == (Image *) NULL)
7752    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7753  quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
7754  quantize_info->number_colors=number_colors;
7755  quantize_info->dither_method=dither_method;
7756  quantize_info->tree_depth=treedepth;
7757  quantize_info->colorspace=colorspace;
7758  quantize_info->measure_error=measure_error;
7759  status=QuantizeImage(quantize_info,wand->images,wand->exception);
7760  quantize_info=DestroyQuantizeInfo(quantize_info);
7761  return(status);
7762}
7763
7764/*
7765%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7766%                                                                             %
7767%                                                                             %
7768%                                                                             %
7769%   M a g i c k Q u a n t i z e I m a g e s                                   %
7770%                                                                             %
7771%                                                                             %
7772%                                                                             %
7773%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7774%
7775%  MagickQuantizeImages() analyzes the colors within a sequence of images and
7776%  chooses a fixed number of colors to represent the image.  The goal of the
7777%  algorithm is to minimize the color difference between the input and output
7778%  image while minimizing the processing time.
7779%
7780%  The format of the MagickQuantizeImages method is:
7781%
7782%      MagickBooleanType MagickQuantizeImages(MagickWand *wand,
7783%        const size_t number_colors,const ColorspaceType colorspace,
7784%        const size_t treedepth,const DitherMethod dither_method,
7785%        const MagickBooleanType measure_error)
7786%
7787%  A description of each parameter follows:
7788%
7789%    o wand: the magick wand.
7790%
7791%    o number_colors: the number of colors.
7792%
7793%    o colorspace: Perform color reduction in this colorspace, typically
7794%      RGBColorspace.
7795%
7796%    o treedepth: Normally, this integer value is zero or one.  A zero or
7797%      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
7798%      reference image with the least amount of memory and the fastest
7799%      computational speed.  In some cases, such as an image with low color
7800%      dispersion (a few number of colors), a value other than
7801%      Log4(number_colors) is required.  To expand the color tree completely,
7802%      use a value of 8.
7803%
7804%    o dither_method: choose from these dither methods: NoDitherMethod,
7805%      RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
7806%
7807%    o measure_error: A value other than zero measures the difference between
7808%      the original and quantized images.  This difference is the total
7809%      quantization error.  The error is computed by summing over all pixels
7810%      in an image the distance squared in RGB space between each reference
7811%      pixel value and its quantized value.
7812%
7813*/
7814WandExport MagickBooleanType MagickQuantizeImages(MagickWand *wand,
7815  const size_t number_colors,const ColorspaceType colorspace,
7816  const size_t treedepth,const DitherMethod dither_method,
7817  const MagickBooleanType measure_error)
7818{
7819  MagickBooleanType
7820    status;
7821
7822  QuantizeInfo
7823    *quantize_info;
7824
7825  assert(wand != (MagickWand *) NULL);
7826  assert(wand->signature == WandSignature);
7827  if (IfMagickTrue(wand->debug))
7828    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7829  if (wand->images == (Image *) NULL)
7830    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7831  quantize_info=CloneQuantizeInfo((QuantizeInfo *) NULL);
7832  quantize_info->number_colors=number_colors;
7833  quantize_info->dither_method=dither_method;
7834  quantize_info->tree_depth=treedepth;
7835  quantize_info->colorspace=colorspace;
7836  quantize_info->measure_error=measure_error;
7837  status=QuantizeImages(quantize_info,wand->images,wand->exception);
7838  quantize_info=DestroyQuantizeInfo(quantize_info);
7839  return(status);
7840}
7841
7842/*
7843%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7844%                                                                             %
7845%                                                                             %
7846%                                                                             %
7847%   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                         %
7848%                                                                             %
7849%                                                                             %
7850%                                                                             %
7851%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7852%
7853%  MagickRotationalBlurImage() rotational blurs an image.
7854%
7855%  The format of the MagickRotationalBlurImage method is:
7856%
7857%      MagickBooleanType MagickRotationalBlurImage(MagickWand *wand,
7858%        const double angle)
7859%
7860%  A description of each parameter follows:
7861%
7862%    o wand: the magick wand.
7863%
7864%    o angle: the angle of the blur in degrees.
7865%
7866*/
7867WandExport MagickBooleanType MagickRotationalBlurImage(MagickWand *wand,
7868  const double angle)
7869{
7870  Image
7871    *blur_image;
7872
7873  assert(wand != (MagickWand *) NULL);
7874  assert(wand->signature == WandSignature);
7875  if (IfMagickTrue(wand->debug))
7876    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7877  if (wand->images == (Image *) NULL)
7878    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7879  blur_image=RotationalBlurImage(wand->images,angle,wand->exception);
7880  if (blur_image == (Image *) NULL)
7881    return(MagickFalse);
7882  ReplaceImageInList(&wand->images,blur_image);
7883  return(MagickTrue);
7884}
7885
7886/*
7887%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7888%                                                                             %
7889%                                                                             %
7890%                                                                             %
7891%   M a g i c k R a i s e I m a g e                                           %
7892%                                                                             %
7893%                                                                             %
7894%                                                                             %
7895%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7896%
7897%  MagickRaiseImage() creates a simulated three-dimensional button-like effect
7898%  by lightening and darkening the edges of the image.  Members width and
7899%  height of raise_info define the width of the vertical and horizontal
7900%  edge of the effect.
7901%
7902%  The format of the MagickRaiseImage method is:
7903%
7904%      MagickBooleanType MagickRaiseImage(MagickWand *wand,
7905%        const size_t width,const size_t height,const ssize_t x,
7906%        const ssize_t y,const MagickBooleanType raise)
7907%
7908%  A description of each parameter follows:
7909%
7910%    o wand: the magick wand.
7911%
7912%    o width,height,x,y:  Define the dimensions of the area to raise.
7913%
7914%    o raise: A value other than zero creates a 3-D raise effect,
7915%      otherwise it has a lowered effect.
7916%
7917*/
7918WandExport MagickBooleanType MagickRaiseImage(MagickWand *wand,
7919  const size_t width,const size_t height,const ssize_t x,
7920  const ssize_t y,const MagickBooleanType raise)
7921{
7922  MagickBooleanType
7923    status;
7924
7925  RectangleInfo
7926    raise_info;
7927
7928  assert(wand != (MagickWand *) NULL);
7929  assert(wand->signature == WandSignature);
7930  if (IfMagickTrue(wand->debug))
7931    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7932  if (wand->images == (Image *) NULL)
7933    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7934  raise_info.width=width;
7935  raise_info.height=height;
7936  raise_info.x=x;
7937  raise_info.y=y;
7938  status=RaiseImage(wand->images,&raise_info,raise,wand->exception);
7939  return(status);
7940}
7941
7942/*
7943%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7944%                                                                             %
7945%                                                                             %
7946%                                                                             %
7947%   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                       %
7948%                                                                             %
7949%                                                                             %
7950%                                                                             %
7951%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7952%
7953%  MagickRandomThresholdImage() changes the value of individual pixels based on
7954%  the intensity of each pixel compared to threshold.  The result is a
7955%  high-contrast, two color image.
7956%
7957%  The format of the MagickRandomThresholdImage method is:
7958%
7959%      MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
7960%        const double low,const double high)
7961%
7962%  A description of each parameter follows:
7963%
7964%    o wand: the magick wand.
7965%
7966%    o low,high: Specify the high and low thresholds.  These values range from
7967%      0 to QuantumRange.
7968%
7969*/
7970WandExport MagickBooleanType MagickRandomThresholdImage(MagickWand *wand,
7971  const double low,const double high)
7972{
7973  char
7974    threshold[MaxTextExtent];
7975
7976  assert(wand != (MagickWand *) NULL);
7977  assert(wand->signature == WandSignature);
7978  if (IfMagickTrue(wand->debug))
7979    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
7980  if (wand->images == (Image *) NULL)
7981    ThrowWandException(WandError,"ContainsNoImages",wand->name);
7982  (void) FormatLocaleString(threshold,MaxTextExtent,"%gx%g",low,high);
7983  return(RandomThresholdImage(wand->images,threshold,wand->exception));
7984}
7985
7986/*
7987%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7988%                                                                             %
7989%                                                                             %
7990%                                                                             %
7991%   M a g i c k R e a d I m a g e                                             %
7992%                                                                             %
7993%                                                                             %
7994%                                                                             %
7995%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7996%
7997%  MagickReadImage() reads an image or image sequence.  The images are inserted
7998%  jjust before the current image pointer position.
7999%
8000%  Use MagickSetFirstIterator(), to insert new images before all the current
8001%  images in the wand, MagickSetLastIterator() to append add to the end,
8002%  MagickSetImageIndex() to place images just after the given index.
8003%
8004%  The format of the MagickReadImage method is:
8005%
8006%      MagickBooleanType MagickReadImage(MagickWand *wand,const char *filename)
8007%
8008%  A description of each parameter follows:
8009%
8010%    o wand: the magick wand.
8011%
8012%    o filename: the image filename.
8013%
8014*/
8015WandExport MagickBooleanType MagickReadImage(MagickWand *wand,
8016  const char *filename)
8017{
8018  Image
8019    *images;
8020
8021  ImageInfo
8022    *read_info;
8023
8024  assert(wand != (MagickWand *) NULL);
8025  assert(wand->signature == WandSignature);
8026  if (IfMagickTrue(wand->debug))
8027    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8028  read_info=CloneImageInfo(wand->image_info);
8029  if (filename != (const char *) NULL)
8030    (void) CopyMagickString(read_info->filename,filename,MaxTextExtent);
8031  images=ReadImage(read_info,wand->exception);
8032  read_info=DestroyImageInfo(read_info);
8033  if (images == (Image *) NULL)
8034    return(MagickFalse);
8035  return(InsertImageInWand(wand,images));
8036}
8037
8038/*
8039%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8040%                                                                             %
8041%                                                                             %
8042%                                                                             %
8043%   M a g i c k R e a d I m a g e B l o b                                     %
8044%                                                                             %
8045%                                                                             %
8046%                                                                             %
8047%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8048%
8049%  MagickReadImageBlob() reads an image or image sequence from a blob.
8050%  In all other respects it is like MagickReadImage().
8051%
8052%  The format of the MagickReadImageBlob method is:
8053%
8054%      MagickBooleanType MagickReadImageBlob(MagickWand *wand,
8055%        const void *blob,const size_t length)
8056%
8057%  A description of each parameter follows:
8058%
8059%    o wand: the magick wand.
8060%
8061%    o blob: the blob.
8062%
8063%    o length: the blob length.
8064%
8065*/
8066WandExport MagickBooleanType MagickReadImageBlob(MagickWand *wand,
8067  const void *blob,const size_t length)
8068{
8069  Image
8070    *images;
8071
8072  assert(wand != (MagickWand *) NULL);
8073  assert(wand->signature == WandSignature);
8074  if (IfMagickTrue(wand->debug))
8075    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8076  images=BlobToImage(wand->image_info,blob,length,wand->exception);
8077  if (images == (Image *) NULL)
8078    return(MagickFalse);
8079  return(InsertImageInWand(wand,images));
8080}
8081
8082/*
8083%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8084%                                                                             %
8085%                                                                             %
8086%                                                                             %
8087%   M a g i c k R e a d I m a g e F i l e                                     %
8088%                                                                             %
8089%                                                                             %
8090%                                                                             %
8091%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8092%
8093%  MagickReadImageFile() reads an image or image sequence from an already
8094%  opened file descriptor.  Otherwise it is like MagickReadImage().
8095%
8096%  The format of the MagickReadImageFile method is:
8097%
8098%      MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file)
8099%
8100%  A description of each parameter follows:
8101%
8102%    o wand: the magick wand.
8103%
8104%    o file: the file descriptor.
8105%
8106*/
8107WandExport MagickBooleanType MagickReadImageFile(MagickWand *wand,FILE *file)
8108{
8109  Image
8110    *images;
8111
8112  ImageInfo
8113    *read_info;
8114
8115  assert(wand != (MagickWand *) NULL);
8116  assert(wand->signature == WandSignature);
8117  assert(file != (FILE *) NULL);
8118  if (IfMagickTrue(wand->debug))
8119    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8120  read_info=CloneImageInfo(wand->image_info);
8121  SetImageInfoFile(read_info,file);
8122  images=ReadImage(read_info,wand->exception);
8123  read_info=DestroyImageInfo(read_info);
8124  if (images == (Image *) NULL)
8125    return(MagickFalse);
8126  return(InsertImageInWand(wand,images));
8127}
8128
8129/*
8130%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8131%                                                                             %
8132%                                                                             %
8133%                                                                             %
8134%   M a g i c k R e m a p I m a g e                                           %
8135%                                                                             %
8136%                                                                             %
8137%                                                                             %
8138%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8139%
8140%  MagickRemapImage() replaces the colors of an image with the closest color
8141%  from a reference image.
8142%
8143%  The format of the MagickRemapImage method is:
8144%
8145%      MagickBooleanType MagickRemapImage(MagickWand *wand,
8146%        const MagickWand *remap_wand,const DitherMethod method)
8147%
8148%  A description of each parameter follows:
8149%
8150%    o wand: the magick wand.
8151%
8152%    o affinity: the affinity wand.
8153%
8154%    o method: choose from these dither methods: NoDitherMethod,
8155%      RiemersmaDitherMethod, or FloydSteinbergDitherMethod.
8156%
8157*/
8158WandExport MagickBooleanType MagickRemapImage(MagickWand *wand,
8159  const MagickWand *remap_wand,const DitherMethod dither_method)
8160{
8161  MagickBooleanType
8162    status;
8163
8164  QuantizeInfo
8165    *quantize_info;
8166
8167  assert(wand != (MagickWand *) NULL);
8168  assert(wand->signature == WandSignature);
8169  if (IfMagickTrue(wand->debug))
8170    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8171  if ((wand->images == (Image *) NULL) ||
8172      (remap_wand->images == (Image *) NULL))
8173    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8174  quantize_info=AcquireQuantizeInfo(wand->image_info);
8175  quantize_info->dither_method=dither_method;
8176  status=RemapImage(quantize_info,wand->images,remap_wand->images,
8177    wand->exception);
8178  quantize_info=DestroyQuantizeInfo(quantize_info);
8179  return(status);
8180}
8181
8182/*
8183%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8184%                                                                             %
8185%                                                                             %
8186%                                                                             %
8187%   M a g i c k R e m o v e I m a g e                                         %
8188%                                                                             %
8189%                                                                             %
8190%                                                                             %
8191%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8192%
8193%  MagickRemoveImage() removes an image from the image list.
8194%
8195%  The format of the MagickRemoveImage method is:
8196%
8197%      MagickBooleanType MagickRemoveImage(MagickWand *wand)
8198%
8199%  A description of each parameter follows:
8200%
8201%    o wand: the magick wand.
8202%
8203%    o insert: the splice wand.
8204%
8205*/
8206WandExport MagickBooleanType MagickRemoveImage(MagickWand *wand)
8207{
8208  assert(wand != (MagickWand *) NULL);
8209  assert(wand->signature == WandSignature);
8210  if (IfMagickTrue(wand->debug))
8211    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8212  if (wand->images == (Image *) NULL)
8213    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8214  DeleteImageFromList(&wand->images);
8215  return(MagickTrue);
8216}
8217
8218/*
8219%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8220%                                                                             %
8221%                                                                             %
8222%                                                                             %
8223%   M a g i c k R e s a m p l e I m a g e                                     %
8224%                                                                             %
8225%                                                                             %
8226%                                                                             %
8227%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8228%
8229%  MagickResampleImage() resample image to desired resolution.
8230%
8231%    Bessel   Blackman   Box
8232%    Catrom   Cubic      Gaussian
8233%    Hanning  Hermite    Lanczos
8234%    Mitchell Point      Quandratic
8235%    Sinc     Triangle
8236%
8237%  Most of the filters are FIR (finite impulse response), however, Bessel,
8238%  Gaussian, and Sinc are IIR (infinite impulse response).  Bessel and Sinc
8239%  are windowed (brought down to zero) with the Blackman filter.
8240%
8241%  The format of the MagickResampleImage method is:
8242%
8243%      MagickBooleanType MagickResampleImage(MagickWand *wand,
8244%        const double x_resolution,const double y_resolution,
8245%        const FilterTypes filter)
8246%
8247%  A description of each parameter follows:
8248%
8249%    o wand: the magick wand.
8250%
8251%    o x_resolution: the new image x resolution.
8252%
8253%    o y_resolution: the new image y resolution.
8254%
8255%    o filter: Image filter to use.
8256%
8257*/
8258WandExport MagickBooleanType MagickResampleImage(MagickWand *wand,
8259  const double x_resolution,const double y_resolution,const FilterTypes filter)
8260{
8261  Image
8262    *resample_image;
8263
8264  assert(wand != (MagickWand *) NULL);
8265  assert(wand->signature == WandSignature);
8266  if (IfMagickTrue(wand->debug))
8267    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8268  if (wand->images == (Image *) NULL)
8269    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8270  resample_image=ResampleImage(wand->images,x_resolution,y_resolution,filter,
8271    wand->exception);
8272  if (resample_image == (Image *) NULL)
8273    return(MagickFalse);
8274  ReplaceImageInList(&wand->images,resample_image);
8275  return(MagickTrue);
8276}
8277
8278/*
8279%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8280%                                                                             %
8281%                                                                             %
8282%                                                                             %
8283%   M a g i c k R e s e t I m a g e P a g e                                   %
8284%                                                                             %
8285%                                                                             %
8286%                                                                             %
8287%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8288%
8289%  MagickResetImagePage() resets the Wand page canvas and position.
8290%
8291%  The format of the MagickResetImagePage method is:
8292%
8293%      MagickBooleanType MagickResetImagePage(MagickWand *wand,
8294%        const char *page)
8295%
8296%  A description of each parameter follows:
8297%
8298%    o wand: the magick wand.
8299%
8300%    o page: the relative page specification.
8301%
8302*/
8303WandExport MagickBooleanType MagickResetImagePage(MagickWand *wand,
8304  const char *page)
8305{
8306  assert(wand != (MagickWand *) NULL);
8307  assert(wand->signature == WandSignature);
8308  if (IfMagickTrue(wand->debug))
8309    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8310  if (wand->images == (Image *) NULL)
8311    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8312  if ((page == (char *) NULL) || (*page == '\0'))
8313    {
8314      (void) ParseAbsoluteGeometry("0x0+0+0",&wand->images->page);
8315      return(MagickTrue);
8316    }
8317  return(ResetImagePage(wand->images,page));
8318}
8319
8320/*
8321%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8322%                                                                             %
8323%                                                                             %
8324%                                                                             %
8325%   M a g i c k R e s i z e I m a g e                                         %
8326%                                                                             %
8327%                                                                             %
8328%                                                                             %
8329%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8330%
8331%  MagickResizeImage() scales an image to the desired dimensions with one of
8332%  these filters:
8333%
8334%    Bessel   Blackman   Box
8335%    Catrom   Cubic      Gaussian
8336%    Hanning  Hermite    Lanczos
8337%    Mitchell Point      Quandratic
8338%    Sinc     Triangle
8339%
8340%  Most of the filters are FIR (finite impulse response), however, Bessel,
8341%  Gaussian, and Sinc are IIR (infinite impulse response).  Bessel and Sinc
8342%  are windowed (brought down to zero) with the Blackman filter.
8343%
8344%  The format of the MagickResizeImage method is:
8345%
8346%      MagickBooleanType MagickResizeImage(MagickWand *wand,
8347%        const size_t columns,const size_t rows,const FilterTypes filter)
8348%
8349%  A description of each parameter follows:
8350%
8351%    o wand: the magick wand.
8352%
8353%    o columns: the number of columns in the scaled image.
8354%
8355%    o rows: the number of rows in the scaled image.
8356%
8357%    o filter: Image filter to use.
8358%
8359*/
8360WandExport MagickBooleanType MagickResizeImage(MagickWand *wand,
8361  const size_t columns,const size_t rows,const FilterTypes filter)
8362{
8363  Image
8364    *resize_image;
8365
8366  assert(wand != (MagickWand *) NULL);
8367  assert(wand->signature == WandSignature);
8368  if (IfMagickTrue(wand->debug))
8369    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8370  if (wand->images == (Image *) NULL)
8371    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8372  resize_image=ResizeImage(wand->images,columns,rows,filter,wand->exception);
8373  if (resize_image == (Image *) NULL)
8374    return(MagickFalse);
8375  ReplaceImageInList(&wand->images,resize_image);
8376  return(MagickTrue);
8377}
8378
8379/*
8380%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8381%                                                                             %
8382%                                                                             %
8383%                                                                             %
8384%   M a g i c k R o l l I m a g e                                             %
8385%                                                                             %
8386%                                                                             %
8387%                                                                             %
8388%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8389%
8390%  MagickRollImage() offsets an image as defined by x and y.
8391%
8392%  The format of the MagickRollImage method is:
8393%
8394%      MagickBooleanType MagickRollImage(MagickWand *wand,const ssize_t x,
8395%        const size_t y)
8396%
8397%  A description of each parameter follows:
8398%
8399%    o wand: the magick wand.
8400%
8401%    o x: the x offset.
8402%
8403%    o y: the y offset.
8404%
8405%
8406*/
8407WandExport MagickBooleanType MagickRollImage(MagickWand *wand,
8408  const ssize_t x,const ssize_t y)
8409{
8410  Image
8411    *roll_image;
8412
8413  assert(wand != (MagickWand *) NULL);
8414  assert(wand->signature == WandSignature);
8415  if (IfMagickTrue(wand->debug))
8416    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8417  if (wand->images == (Image *) NULL)
8418    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8419  roll_image=RollImage(wand->images,x,y,wand->exception);
8420  if (roll_image == (Image *) NULL)
8421    return(MagickFalse);
8422  ReplaceImageInList(&wand->images,roll_image);
8423  return(MagickTrue);
8424}
8425
8426/*
8427%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8428%                                                                             %
8429%                                                                             %
8430%                                                                             %
8431%   M a g i c k R o t a t e I m a g e                                         %
8432%                                                                             %
8433%                                                                             %
8434%                                                                             %
8435%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8436%
8437%  MagickRotateImage() rotates an image the specified number of degrees. Empty
8438%  triangles left over from rotating the image are filled with the
8439%  background color.
8440%
8441%  The format of the MagickRotateImage method is:
8442%
8443%      MagickBooleanType MagickRotateImage(MagickWand *wand,
8444%        const PixelWand *background,const double degrees)
8445%
8446%  A description of each parameter follows:
8447%
8448%    o wand: the magick wand.
8449%
8450%    o background: the background pixel wand.
8451%
8452%    o degrees: the number of degrees to rotate the image.
8453%
8454%
8455*/
8456WandExport MagickBooleanType MagickRotateImage(MagickWand *wand,
8457  const PixelWand *background,const double degrees)
8458{
8459  Image
8460    *rotate_image;
8461
8462  assert(wand != (MagickWand *) NULL);
8463  assert(wand->signature == WandSignature);
8464  if (IfMagickTrue(wand->debug))
8465    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8466  if (wand->images == (Image *) NULL)
8467    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8468  PixelGetQuantumPacket(background,&wand->images->background_color);
8469  rotate_image=RotateImage(wand->images,degrees,wand->exception);
8470  if (rotate_image == (Image *) NULL)
8471    return(MagickFalse);
8472  ReplaceImageInList(&wand->images,rotate_image);
8473  return(MagickTrue);
8474}
8475
8476/*
8477%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8478%                                                                             %
8479%                                                                             %
8480%                                                                             %
8481%   M a g i c k S a m p l e I m a g e                                         %
8482%                                                                             %
8483%                                                                             %
8484%                                                                             %
8485%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8486%
8487%  MagickSampleImage() scales an image to the desired dimensions with pixel
8488%  sampling.  Unlike other scaling methods, this method does not introduce
8489%  any additional color into the scaled image.
8490%
8491%  The format of the MagickSampleImage method is:
8492%
8493%      MagickBooleanType MagickSampleImage(MagickWand *wand,
8494%        const size_t columns,const size_t rows)
8495%
8496%  A description of each parameter follows:
8497%
8498%    o wand: the magick wand.
8499%
8500%    o columns: the number of columns in the scaled image.
8501%
8502%    o rows: the number of rows in the scaled image.
8503%
8504%
8505*/
8506WandExport MagickBooleanType MagickSampleImage(MagickWand *wand,
8507  const size_t columns,const size_t rows)
8508{
8509  Image
8510    *sample_image;
8511
8512  assert(wand != (MagickWand *) NULL);
8513  assert(wand->signature == WandSignature);
8514  if (IfMagickTrue(wand->debug))
8515    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8516  if (wand->images == (Image *) NULL)
8517    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8518  sample_image=SampleImage(wand->images,columns,rows,wand->exception);
8519  if (sample_image == (Image *) NULL)
8520    return(MagickFalse);
8521  ReplaceImageInList(&wand->images,sample_image);
8522  return(MagickTrue);
8523}
8524
8525/*
8526%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8527%                                                                             %
8528%                                                                             %
8529%                                                                             %
8530%   M a g i c k S c a l e I m a g e                                           %
8531%                                                                             %
8532%                                                                             %
8533%                                                                             %
8534%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8535%
8536%  MagickScaleImage() scales the size of an image to the given dimensions.
8537%
8538%  The format of the MagickScaleImage method is:
8539%
8540%      MagickBooleanType MagickScaleImage(MagickWand *wand,
8541%        const size_t columns,const size_t rows)
8542%
8543%  A description of each parameter follows:
8544%
8545%    o wand: the magick wand.
8546%
8547%    o columns: the number of columns in the scaled image.
8548%
8549%    o rows: the number of rows in the scaled image.
8550%
8551%
8552*/
8553WandExport MagickBooleanType MagickScaleImage(MagickWand *wand,
8554  const size_t columns,const size_t rows)
8555{
8556  Image
8557    *scale_image;
8558
8559  assert(wand != (MagickWand *) NULL);
8560  assert(wand->signature == WandSignature);
8561  if (IfMagickTrue(wand->debug))
8562    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8563  if (wand->images == (Image *) NULL)
8564    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8565  scale_image=ScaleImage(wand->images,columns,rows,wand->exception);
8566  if (scale_image == (Image *) NULL)
8567    return(MagickFalse);
8568  ReplaceImageInList(&wand->images,scale_image);
8569  return(MagickTrue);
8570}
8571
8572/*
8573%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8574%                                                                             %
8575%                                                                             %
8576%                                                                             %
8577%   M a g i c k S e g m e n t I m a g e                                       %
8578%                                                                             %
8579%                                                                             %
8580%                                                                             %
8581%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8582%
8583%  MagickSegmentImage() segments an image by analyzing the histograms of the
8584%  color components and identifying units that are homogeneous with the fuzzy
8585%  C-means technique.
8586%
8587%  The format of the SegmentImage method is:
8588%
8589%      MagickBooleanType MagickSegmentImage(MagickWand *wand,
8590%        const ColorspaceType colorspace,const MagickBooleanType verbose,
8591%        const double cluster_threshold,const double smooth_threshold)
8592%
8593%  A description of each parameter follows.
8594%
8595%    o wand: the wand.
8596%
8597%    o colorspace: the image colorspace.
8598%
8599%    o verbose:  Set to MagickTrue to print detailed information about the
8600%      identified classes.
8601%
8602%    o cluster_threshold:  This represents the minimum number of pixels
8603%      contained in a hexahedra before it can be considered valid (expressed as
8604%      a percentage).
8605%
8606%    o smooth_threshold: the smoothing threshold eliminates noise in the second
8607%      derivative of the histogram.  As the value is increased, you can expect a
8608%      smoother second derivative.
8609%
8610*/
8611MagickExport MagickBooleanType MagickSegmentImage(MagickWand *wand,
8612  const ColorspaceType colorspace,const MagickBooleanType verbose,
8613  const double cluster_threshold,const double smooth_threshold)
8614{
8615  MagickBooleanType
8616    status;
8617
8618  assert(wand != (MagickWand *) NULL);
8619  assert(wand->signature == WandSignature);
8620  if (IfMagickTrue(wand->debug))
8621    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8622  if (wand->images == (Image *) NULL)
8623    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8624  status=SegmentImage(wand->images,colorspace,verbose,cluster_threshold,
8625    smooth_threshold,wand->exception);
8626  return(status);
8627}
8628
8629/*
8630%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8631%                                                                             %
8632%                                                                             %
8633%                                                                             %
8634%   M a g i c k S e l e c t i v e B l u r I m a g e                           %
8635%                                                                             %
8636%                                                                             %
8637%                                                                             %
8638%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8639%
8640%  MagickSelectiveBlurImage() selectively blur an image within a contrast
8641%  threshold. It is similar to the unsharpen mask that sharpens everything with
8642%  contrast above a certain threshold.
8643%
8644%  The format of the MagickSelectiveBlurImage method is:
8645%
8646%      MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
8647%        const double radius,const double sigma,const double threshold)
8648%
8649%  A description of each parameter follows:
8650%
8651%    o wand: the magick wand.
8652%
8653%    o radius: the radius of the gaussian, in pixels, not counting the center
8654%      pixel.
8655%
8656%    o sigma: the standard deviation of the gaussian, in pixels.
8657%
8658%    o threshold: only pixels within this contrast threshold are included
8659%      in the blur operation.
8660%
8661*/
8662WandExport MagickBooleanType MagickSelectiveBlurImage(MagickWand *wand,
8663  const double radius,const double sigma,const double threshold)
8664{
8665  Image
8666    *blur_image;
8667
8668  assert(wand != (MagickWand *) NULL);
8669  assert(wand->signature == WandSignature);
8670  if (IfMagickTrue(wand->debug))
8671    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8672  if (wand->images == (Image *) NULL)
8673    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8674  blur_image=SelectiveBlurImage(wand->images,radius,sigma,threshold,
8675    wand->exception);
8676  if (blur_image == (Image *) NULL)
8677    return(MagickFalse);
8678  ReplaceImageInList(&wand->images,blur_image);
8679  return(MagickTrue);
8680}
8681
8682/*
8683%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8684%                                                                             %
8685%                                                                             %
8686%                                                                             %
8687%   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                       %
8688%                                                                             %
8689%                                                                             %
8690%                                                                             %
8691%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8692%
8693%  MagickSeparateImage() separates a channel from the image and returns a
8694%  grayscale image.  A channel is a particular color component of each pixel
8695%  in the image.
8696%
8697%  The format of the MagickSeparateImage method is:
8698%
8699%      MagickBooleanType MagickSeparateImage(MagickWand *wand,
8700%        const ChannelType channel)
8701%
8702%  A description of each parameter follows:
8703%
8704%    o wand: the magick wand.
8705%
8706%    o channel: the channel.
8707%
8708*/
8709WandExport MagickBooleanType MagickSeparateImage(MagickWand *wand,
8710  const ChannelType channel)
8711{
8712  Image
8713    *separate_image;
8714
8715  assert(wand != (MagickWand *) NULL);
8716  assert(wand->signature == WandSignature);
8717  if (IfMagickTrue(wand->debug))
8718    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8719  if (wand->images == (Image *) NULL)
8720    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8721  separate_image=SeparateImage(wand->images,channel,wand->exception);
8722  if (separate_image == (Image *) NULL)
8723    return(MagickFalse);
8724  ReplaceImageInList(&wand->images,separate_image);
8725  return(MagickTrue);
8726}
8727
8728/*
8729%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8730%                                                                             %
8731%                                                                             %
8732%                                                                             %
8733%     M a g i c k S e p i a T o n e I m a g e                                 %
8734%                                                                             %
8735%                                                                             %
8736%                                                                             %
8737%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8738%
8739%  MagickSepiaToneImage() applies a special effect to the image, similar to the
8740%  effect achieved in a photo darkroom by sepia toning.  Threshold ranges from
8741%  0 to QuantumRange and is a measure of the extent of the sepia toning.  A
8742%  threshold of 80% is a good starting point for a reasonable tone.
8743%
8744%  The format of the MagickSepiaToneImage method is:
8745%
8746%      MagickBooleanType MagickSepiaToneImage(MagickWand *wand,
8747%        const double threshold)
8748%
8749%  A description of each parameter follows:
8750%
8751%    o wand: the magick wand.
8752%
8753%    o threshold:  Define the extent of the sepia toning.
8754%
8755*/
8756WandExport MagickBooleanType MagickSepiaToneImage(MagickWand *wand,
8757  const double threshold)
8758{
8759  Image
8760    *sepia_image;
8761
8762  assert(wand != (MagickWand *) NULL);
8763  assert(wand->signature == WandSignature);
8764  if (IfMagickTrue(wand->debug))
8765    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8766  if (wand->images == (Image *) NULL)
8767    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8768  sepia_image=SepiaToneImage(wand->images,threshold,wand->exception);
8769  if (sepia_image == (Image *) NULL)
8770    return(MagickFalse);
8771  ReplaceImageInList(&wand->images,sepia_image);
8772  return(MagickTrue);
8773}
8774
8775/*
8776%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8777%                                                                             %
8778%                                                                             %
8779%                                                                             %
8780%   M a g i c k S e t I m a g e                                               %
8781%                                                                             %
8782%                                                                             %
8783%                                                                             %
8784%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8785%
8786%  MagickSetImage() replaces the last image returned by MagickSetImageIndex(),
8787%  MagickNextImage(), MagickPreviousImage() with the images from the specified
8788%  wand.
8789%
8790%  The format of the MagickSetImage method is:
8791%
8792%      MagickBooleanType MagickSetImage(MagickWand *wand,
8793%        const MagickWand *set_wand)
8794%
8795%  A description of each parameter follows:
8796%
8797%    o wand: the magick wand.
8798%
8799%    o set_wand: the set_wand wand.
8800%
8801*/
8802WandExport MagickBooleanType MagickSetImage(MagickWand *wand,
8803  const MagickWand *set_wand)
8804{
8805  Image
8806    *images;
8807
8808  assert(wand != (MagickWand *) NULL);
8809  assert(wand->signature == WandSignature);
8810  if (IfMagickTrue(wand->debug))
8811    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8812  assert(set_wand != (MagickWand *) NULL);
8813  assert(set_wand->signature == WandSignature);
8814  if (IfMagickTrue(wand->debug))
8815    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",set_wand->name);
8816  if (set_wand->images == (Image *) NULL)
8817    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8818  images=CloneImageList(set_wand->images,wand->exception);
8819  if (images == (Image *) NULL)
8820    return(MagickFalse);
8821  ReplaceImageInList(&wand->images,images);
8822  return(MagickTrue);
8823}
8824
8825/*
8826%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8827%                                                                             %
8828%                                                                             %
8829%                                                                             %
8830%   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                       %
8831%                                                                             %
8832%                                                                             %
8833%                                                                             %
8834%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8835%
8836%  MagickSetImageAlphaChannel() activates, deactivates, resets, or sets the
8837%  alpha channel.
8838%
8839%  The format of the MagickSetImageAlphaChannel method is:
8840%
8841%      MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand,
8842%        const AlphaChannelOption alpha_type)
8843%
8844%  A description of each parameter follows:
8845%
8846%    o wand: the magick wand.
8847%
8848%    o alpha_type: the alpha channel type: ActivateAlphaChannel,
8849%      DeactivateAlphaChannel, OpaqueAlphaChannel, or SetAlphaChannel.
8850%
8851*/
8852WandExport MagickBooleanType MagickSetImageAlphaChannel(MagickWand *wand,
8853  const AlphaChannelOption alpha_type)
8854{
8855  assert(wand != (MagickWand *) NULL);
8856  assert(wand->signature == WandSignature);
8857  if (IfMagickTrue(wand->debug))
8858    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8859  if (wand->images == (Image *) NULL)
8860    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8861  return(SetImageAlphaChannel(wand->images,alpha_type,wand->exception));
8862}
8863
8864/*
8865%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8866%                                                                             %
8867%                                                                             %
8868%                                                                             %
8869%   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                 %
8870%                                                                             %
8871%                                                                             %
8872%                                                                             %
8873%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8874%
8875%  MagickSetImageBackgroundColor() sets the image background color.
8876%
8877%  The format of the MagickSetImageBackgroundColor method is:
8878%
8879%      MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand,
8880%        const PixelWand *background)
8881%
8882%  A description of each parameter follows:
8883%
8884%    o wand: the magick wand.
8885%
8886%    o background: the background pixel wand.
8887%
8888*/
8889WandExport MagickBooleanType MagickSetImageBackgroundColor(MagickWand *wand,
8890  const PixelWand *background)
8891{
8892  assert(wand != (MagickWand *) NULL);
8893  assert(wand->signature == WandSignature);
8894  if (IfMagickTrue(wand->debug))
8895    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8896  if (wand->images == (Image *) NULL)
8897    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8898  PixelGetQuantumPacket(background,&wand->images->background_color);
8899  return(MagickTrue);
8900}
8901
8902/*
8903%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8904%                                                                             %
8905%                                                                             %
8906%                                                                             %
8907%   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                         %
8908%                                                                             %
8909%                                                                             %
8910%                                                                             %
8911%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8912%
8913%  MagickSetImageBluePrimary() sets the image chromaticity blue primary point.
8914%
8915%  The format of the MagickSetImageBluePrimary method is:
8916%
8917%      MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand,
8918%        const double x,const double y)
8919%
8920%  A description of each parameter follows:
8921%
8922%    o wand: the magick wand.
8923%
8924%    o x: the blue primary x-point.
8925%
8926%    o y: the blue primary y-point.
8927%
8928*/
8929WandExport MagickBooleanType MagickSetImageBluePrimary(MagickWand *wand,
8930  const double x,const double y)
8931{
8932  assert(wand != (MagickWand *) NULL);
8933  assert(wand->signature == WandSignature);
8934  if (IfMagickTrue(wand->debug))
8935    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8936  if (wand->images == (Image *) NULL)
8937    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8938  wand->images->chromaticity.blue_primary.x=x;
8939  wand->images->chromaticity.blue_primary.y=y;
8940  return(MagickTrue);
8941}
8942
8943/*
8944%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8945%                                                                             %
8946%                                                                             %
8947%                                                                             %
8948%   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                         %
8949%                                                                             %
8950%                                                                             %
8951%                                                                             %
8952%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8953%
8954%  MagickSetImageBorderColor() sets the image border color.
8955%
8956%  The format of the MagickSetImageBorderColor method is:
8957%
8958%      MagickBooleanType MagickSetImageBorderColor(MagickWand *wand,
8959%        const PixelWand *border)
8960%
8961%  A description of each parameter follows:
8962%
8963%    o wand: the magick wand.
8964%
8965%    o border: the border pixel wand.
8966%
8967*/
8968WandExport MagickBooleanType MagickSetImageBorderColor(MagickWand *wand,
8969  const PixelWand *border)
8970{
8971  assert(wand != (MagickWand *) NULL);
8972  assert(wand->signature == WandSignature);
8973  if (IfMagickTrue(wand->debug))
8974    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
8975  if (wand->images == (Image *) NULL)
8976    ThrowWandException(WandError,"ContainsNoImages",wand->name);
8977  PixelGetQuantumPacket(border,&wand->images->border_color);
8978  return(MagickTrue);
8979}
8980
8981/*
8982%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8983%                                                                             %
8984%                                                                             %
8985%                                                                             %
8986%   M a g i c k S e t I m a g e C l i p M a s k                               %
8987%                                                                             %
8988%                                                                             %
8989%                                                                             %
8990%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8991%
8992%  MagickSetImageMask() sets image clip mask.
8993%
8994%  The format of the MagickSetImageMask method is:
8995%
8996%      MagickBooleanType MagickSetImageMask(MagickWand *wand,
8997%        const MagickWand *clip_mask)
8998%
8999%  A description of each parameter follows:
9000%
9001%    o wand: the magick wand.
9002%
9003%    o clip_mask: the clip_mask wand.
9004%
9005*/
9006WandExport MagickBooleanType MagickSetImageMask(MagickWand *wand,
9007  const MagickWand *clip_mask)
9008{
9009  assert(wand != (MagickWand *) NULL);
9010  assert(wand->signature == WandSignature);
9011  if (IfMagickTrue(wand->debug))
9012    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9013  assert(clip_mask != (MagickWand *) NULL);
9014  assert(clip_mask->signature == WandSignature);
9015  if (IfMagickTrue(clip_mask->debug))
9016    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",clip_mask->name);
9017  if (clip_mask->images == (Image *) NULL)
9018    ThrowWandException(WandError,"ContainsNoImages",clip_mask->name);
9019  return(SetImageMask(wand->images,clip_mask->images,wand->exception));
9020}
9021
9022/*
9023%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9024%                                                                             %
9025%                                                                             %
9026%                                                                             %
9027%   M a g i c k S e t I m a g e C o l o r                                     %
9028%                                                                             %
9029%                                                                             %
9030%                                                                             %
9031%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9032%
9033%  MagickSetImageColor() set the entire wand canvas to the specified color.
9034%
9035%  The format of the MagickSetImageColor method is:
9036%
9037%      MagickBooleanType MagickSetImageColor(MagickWand *wand,
9038%        const PixelWand *color)
9039%
9040%  A description of each parameter follows:
9041%
9042%    o wand: the magick wand.
9043%
9044%    o background: the image color.
9045%
9046*/
9047WandExport MagickBooleanType MagickSetImageColor(MagickWand *wand,
9048  const PixelWand *color)
9049{
9050  PixelInfo
9051    pixel;
9052
9053  assert(wand != (MagickWand *) NULL);
9054  assert(wand->signature == WandSignature);
9055  if (IfMagickTrue(wand->debug))
9056    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9057  PixelGetMagickColor(color,&pixel);
9058  return(SetImageColor(wand->images,&pixel,wand->exception));
9059}
9060
9061/*
9062%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9063%                                                                             %
9064%                                                                             %
9065%                                                                             %
9066%   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                     %
9067%                                                                             %
9068%                                                                             %
9069%                                                                             %
9070%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9071%
9072%  MagickSetImageColormapColor() sets the color of the specified colormap
9073%  index.
9074%
9075%  The format of the MagickSetImageColormapColor method is:
9076%
9077%      MagickBooleanType MagickSetImageColormapColor(MagickWand *wand,
9078%        const size_t index,const PixelWand *color)
9079%
9080%  A description of each parameter follows:
9081%
9082%    o wand: the magick wand.
9083%
9084%    o index: the offset into the image colormap.
9085%
9086%    o color: Return the colormap color in this wand.
9087%
9088*/
9089WandExport MagickBooleanType MagickSetImageColormapColor(MagickWand *wand,
9090  const size_t index,const PixelWand *color)
9091{
9092  assert(wand != (MagickWand *) NULL);
9093  assert(wand->signature == WandSignature);
9094  if (IfMagickTrue(wand->debug))
9095    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9096  if (wand->images == (Image *) NULL)
9097    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9098  if ((wand->images->colormap == (PixelInfo *) NULL) ||
9099      (index >= wand->images->colors))
9100    ThrowWandException(WandError,"InvalidColormapIndex",wand->name);
9101  PixelGetQuantumPacket(color,wand->images->colormap+index);
9102  return(SyncImage(wand->images,wand->exception));
9103}
9104
9105/*
9106%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9107%                                                                             %
9108%                                                                             %
9109%                                                                             %
9110%   M a g i c k S e t I m a g e C o l o r s p a c e                           %
9111%                                                                             %
9112%                                                                             %
9113%                                                                             %
9114%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9115%
9116%  MagickSetImageColorspace() sets the image colorspace. But does not modify
9117%  the image data.
9118%
9119%  The format of the MagickSetImageColorspace method is:
9120%
9121%      MagickBooleanType MagickSetImageColorspace(MagickWand *wand,
9122%        const ColorspaceType colorspace)
9123%
9124%  A description of each parameter follows:
9125%
9126%    o wand: the magick wand.
9127%
9128%    o colorspace: the image colorspace:   UndefinedColorspace, RGBColorspace,
9129%      GRAYColorspace, TransparentColorspace, OHTAColorspace, XYZColorspace,
9130%      YCbCrColorspace, YCCColorspace, YIQColorspace, YPbPrColorspace,
9131%      YPbPrColorspace, YUVColorspace, CMYKColorspace, sRGBColorspace,
9132%      HSLColorspace, or HWBColorspace.
9133%
9134*/
9135WandExport MagickBooleanType MagickSetImageColorspace(MagickWand *wand,
9136  const ColorspaceType colorspace)
9137{
9138  assert(wand != (MagickWand *) NULL);
9139  assert(wand->signature == WandSignature);
9140  if (IfMagickTrue(wand->debug))
9141    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9142  if (wand->images == (Image *) NULL)
9143    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9144  return(SetImageColorspace(wand->images,colorspace,wand->exception));
9145}
9146
9147/*
9148%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9149%                                                                             %
9150%                                                                             %
9151%                                                                             %
9152%   M a g i c k S e t I m a g e C o m p o s e                                 %
9153%                                                                             %
9154%                                                                             %
9155%                                                                             %
9156%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9157%
9158%  MagickSetImageCompose() sets the image composite operator, useful for
9159%  specifying how to composite the image thumbnail when using the
9160%  MagickMontageImage() method.
9161%
9162%  The format of the MagickSetImageCompose method is:
9163%
9164%      MagickBooleanType MagickSetImageCompose(MagickWand *wand,
9165%        const CompositeOperator compose)
9166%
9167%  A description of each parameter follows:
9168%
9169%    o wand: the magick wand.
9170%
9171%    o compose: the image composite operator.
9172%
9173*/
9174WandExport MagickBooleanType MagickSetImageCompose(MagickWand *wand,
9175  const CompositeOperator compose)
9176{
9177  assert(wand != (MagickWand *) NULL);
9178  assert(wand->signature == WandSignature);
9179  if (IfMagickTrue(wand->debug))
9180    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9181  if (wand->images == (Image *) NULL)
9182    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9183  wand->images->compose=compose;
9184  return(MagickTrue);
9185}
9186
9187/*
9188%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9189%                                                                             %
9190%                                                                             %
9191%                                                                             %
9192%   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                         %
9193%                                                                             %
9194%                                                                             %
9195%                                                                             %
9196%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9197%
9198%  MagickSetImageCompression() sets the image compression.
9199%
9200%  The format of the MagickSetImageCompression method is:
9201%
9202%      MagickBooleanType MagickSetImageCompression(MagickWand *wand,
9203%        const CompressionType compression)
9204%
9205%  A description of each parameter follows:
9206%
9207%    o wand: the magick wand.
9208%
9209%    o compression: the image compression type.
9210%
9211*/
9212WandExport MagickBooleanType MagickSetImageCompression(MagickWand *wand,
9213  const CompressionType compression)
9214{
9215  assert(wand != (MagickWand *) NULL);
9216  assert(wand->signature == WandSignature);
9217  if (IfMagickTrue(wand->debug))
9218    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9219  if (wand->images == (Image *) NULL)
9220    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9221  wand->images->compression=compression;
9222  return(MagickTrue);
9223}
9224
9225/*
9226%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9227%                                                                             %
9228%                                                                             %
9229%                                                                             %
9230%   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           %
9231%                                                                             %
9232%                                                                             %
9233%                                                                             %
9234%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9235%
9236%  MagickSetImageCompressionQuality() sets the image compression quality.
9237%
9238%  The format of the MagickSetImageCompressionQuality method is:
9239%
9240%      MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
9241%        const size_t quality)
9242%
9243%  A description of each parameter follows:
9244%
9245%    o wand: the magick wand.
9246%
9247%    o quality: the image compression tlityype.
9248%
9249*/
9250WandExport MagickBooleanType MagickSetImageCompressionQuality(MagickWand *wand,
9251  const size_t quality)
9252{
9253  assert(wand != (MagickWand *) NULL);
9254  assert(wand->signature == WandSignature);
9255  if (IfMagickTrue(wand->debug))
9256    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9257  if (wand->images == (Image *) NULL)
9258    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9259  wand->images->quality=quality;
9260  return(MagickTrue);
9261}
9262
9263/*
9264%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9265%                                                                             %
9266%                                                                             %
9267%                                                                             %
9268%   M a g i c k S e t I m a g e D e l a y                                     %
9269%                                                                             %
9270%                                                                             %
9271%                                                                             %
9272%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9273%
9274%  MagickSetImageDelay() sets the image delay.
9275%
9276%  The format of the MagickSetImageDelay method is:
9277%
9278%      MagickBooleanType MagickSetImageDelay(MagickWand *wand,
9279%        const size_t delay)
9280%
9281%  A description of each parameter follows:
9282%
9283%    o wand: the magick wand.
9284%
9285%    o delay: the image delay in ticks-per-second units.
9286%
9287*/
9288WandExport MagickBooleanType MagickSetImageDelay(MagickWand *wand,
9289  const size_t delay)
9290{
9291  assert(wand != (MagickWand *) NULL);
9292  assert(wand->signature == WandSignature);
9293  if (IfMagickTrue(wand->debug))
9294    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9295  if (wand->images == (Image *) NULL)
9296    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9297  wand->images->delay=delay;
9298  return(MagickTrue);
9299}
9300
9301/*
9302%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9303%                                                                             %
9304%                                                                             %
9305%                                                                             %
9306%   M a g i c k S e t I m a g e D e p t h                                     %
9307%                                                                             %
9308%                                                                             %
9309%                                                                             %
9310%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9311%
9312%  MagickSetImageDepth() sets the image depth.
9313%
9314%  The format of the MagickSetImageDepth method is:
9315%
9316%      MagickBooleanType MagickSetImageDepth(MagickWand *wand,
9317%        const size_t depth)
9318%
9319%  A description of each parameter follows:
9320%
9321%    o wand: the magick wand.
9322%
9323%    o depth: the image depth in bits: 8, 16, or 32.
9324%
9325*/
9326WandExport MagickBooleanType MagickSetImageDepth(MagickWand *wand,
9327  const size_t depth)
9328{
9329  assert(wand != (MagickWand *) NULL);
9330  assert(wand->signature == WandSignature);
9331  if (IfMagickTrue(wand->debug))
9332    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9333  if (wand->images == (Image *) NULL)
9334    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9335  return(SetImageDepth(wand->images,depth,wand->exception));
9336}
9337
9338/*
9339%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9340%                                                                             %
9341%                                                                             %
9342%                                                                             %
9343%   M a g i c k S e t I m a g e D i s p o s e                                 %
9344%                                                                             %
9345%                                                                             %
9346%                                                                             %
9347%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9348%
9349%  MagickSetImageDispose() sets the image disposal method.
9350%
9351%  The format of the MagickSetImageDispose method is:
9352%
9353%      MagickBooleanType MagickSetImageDispose(MagickWand *wand,
9354%        const DisposeType dispose)
9355%
9356%  A description of each parameter follows:
9357%
9358%    o wand: the magick wand.
9359%
9360%    o dispose: the image disposeal type.
9361%
9362*/
9363WandExport MagickBooleanType MagickSetImageDispose(MagickWand *wand,
9364  const DisposeType dispose)
9365{
9366  assert(wand != (MagickWand *) NULL);
9367  assert(wand->signature == WandSignature);
9368  if (IfMagickTrue(wand->debug))
9369    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9370  if (wand->images == (Image *) NULL)
9371    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9372  wand->images->dispose=dispose;
9373  return(MagickTrue);
9374}
9375
9376/*
9377%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9378%                                                                             %
9379%                                                                             %
9380%                                                                             %
9381%   M a g i c k S e t I m a g e E n d i a n                                   %
9382%                                                                             %
9383%                                                                             %
9384%                                                                             %
9385%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9386%
9387%  MagickSetImageEndian() sets the image endian method.
9388%
9389%  The format of the MagickSetImageEndian method is:
9390%
9391%      MagickBooleanType MagickSetImageEndian(MagickWand *wand,
9392%        const EndianType endian)
9393%
9394%  A description of each parameter follows:
9395%
9396%    o wand: the magick wand.
9397%
9398%    o endian: the image endian type.
9399%
9400*/
9401WandExport MagickBooleanType MagickSetImageEndian(MagickWand *wand,
9402  const EndianType endian)
9403{
9404  assert(wand != (MagickWand *) NULL);
9405  assert(wand->signature == WandSignature);
9406  if (wand->debug != MagickFalse)
9407    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9408  if (wand->images == (Image *) NULL)
9409    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9410  wand->images->endian=endian;
9411  return(MagickTrue);
9412}
9413
9414/*
9415%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9416%                                                                             %
9417%                                                                             %
9418%                                                                             %
9419%   M a g i c k S e t I m a g e E x t e n t                                   %
9420%                                                                             %
9421%                                                                             %
9422%                                                                             %
9423%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9424%
9425%  MagickSetImageExtent() sets the image size (i.e. columns & rows).
9426%
9427%  The format of the MagickSetImageExtent method is:
9428%
9429%      MagickBooleanType MagickSetImageExtent(MagickWand *wand,
9430%        const size_t columns,const unsigned rows)
9431%
9432%  A description of each parameter follows:
9433%
9434%    o wand: the magick wand.
9435%
9436%    o columns:  The image width in pixels.
9437%
9438%    o rows:  The image height in pixels.
9439%
9440*/
9441WandExport MagickBooleanType MagickSetImageExtent(MagickWand *wand,
9442  const size_t columns,const size_t rows)
9443{
9444  assert(wand != (MagickWand *) NULL);
9445  assert(wand->signature == WandSignature);
9446  if (IfMagickTrue(wand->debug))
9447    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9448  if (wand->images == (Image *) NULL)
9449    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9450  return(SetImageExtent(wand->images,columns,rows,wand->exception));
9451}
9452
9453/*
9454%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9455%                                                                             %
9456%                                                                             %
9457%                                                                             %
9458%   M a g i c k S e t I m a g e F i l e n a m e                               %
9459%                                                                             %
9460%                                                                             %
9461%                                                                             %
9462%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9463%
9464%  MagickSetImageFilename() sets the filename of a particular image in a
9465%  sequence.
9466%
9467%  The format of the MagickSetImageFilename method is:
9468%
9469%      MagickBooleanType MagickSetImageFilename(MagickWand *wand,
9470%        const char *filename)
9471%
9472%  A description of each parameter follows:
9473%
9474%    o wand: the magick wand.
9475%
9476%    o filename: the image filename.
9477%
9478*/
9479WandExport MagickBooleanType MagickSetImageFilename(MagickWand *wand,
9480  const char *filename)
9481{
9482  assert(wand != (MagickWand *) NULL);
9483  assert(wand->signature == WandSignature);
9484  if (IfMagickTrue(wand->debug))
9485    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9486  if (wand->images == (Image *) NULL)
9487    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9488  if (filename != (const char *) NULL)
9489    (void) CopyMagickString(wand->images->filename,filename,MaxTextExtent);
9490  return(MagickTrue);
9491}
9492
9493/*
9494%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9495%                                                                             %
9496%                                                                             %
9497%                                                                             %
9498%   M a g i c k S e t I m a g e F o r m a t                                   %
9499%                                                                             %
9500%                                                                             %
9501%                                                                             %
9502%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9503%
9504%  MagickSetImageFormat() sets the format of a particular image in a
9505%  sequence.
9506%
9507%  The format of the MagickSetImageFormat method is:
9508%
9509%      MagickBooleanType MagickSetImageFormat(MagickWand *wand,
9510%        const char *format)
9511%
9512%  A description of each parameter follows:
9513%
9514%    o wand: the magick wand.
9515%
9516%    o format: the image format.
9517%
9518*/
9519WandExport MagickBooleanType MagickSetImageFormat(MagickWand *wand,
9520  const char *format)
9521{
9522  const MagickInfo
9523    *magick_info;
9524
9525  assert(wand != (MagickWand *) NULL);
9526  assert(wand->signature == WandSignature);
9527  if (IfMagickTrue(wand->debug))
9528    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9529  if (wand->images == (Image *) NULL)
9530    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9531  if ((format == (char *) NULL) || (*format == '\0'))
9532    {
9533      *wand->images->magick='\0';
9534      return(MagickTrue);
9535    }
9536  magick_info=GetMagickInfo(format,wand->exception);
9537  if (magick_info == (const MagickInfo *) NULL)
9538    return(MagickFalse);
9539  ClearMagickException(wand->exception);
9540  (void) CopyMagickString(wand->images->magick,format,MaxTextExtent);
9541  return(MagickTrue);
9542}
9543
9544/*
9545%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9546%                                                                             %
9547%                                                                             %
9548%                                                                             %
9549%   M a g i c k S e t I m a g e F u z z                                       %
9550%                                                                             %
9551%                                                                             %
9552%                                                                             %
9553%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9554%
9555%  MagickSetImageFuzz() sets the image fuzz.
9556%
9557%  The format of the MagickSetImageFuzz method is:
9558%
9559%      MagickBooleanType MagickSetImageFuzz(MagickWand *wand,
9560%        const double fuzz)
9561%
9562%  A description of each parameter follows:
9563%
9564%    o wand: the magick wand.
9565%
9566%    o fuzz: the image fuzz.
9567%
9568*/
9569WandExport MagickBooleanType MagickSetImageFuzz(MagickWand *wand,
9570  const double fuzz)
9571{
9572  assert(wand != (MagickWand *) NULL);
9573  assert(wand->signature == WandSignature);
9574  if (IfMagickTrue(wand->debug))
9575    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9576  if (wand->images == (Image *) NULL)
9577    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9578  wand->images->fuzz=fuzz;
9579  return(MagickTrue);
9580}
9581
9582/*
9583%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9584%                                                                             %
9585%                                                                             %
9586%                                                                             %
9587%   M a g i c k S e t I m a g e G a m m a                                     %
9588%                                                                             %
9589%                                                                             %
9590%                                                                             %
9591%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9592%
9593%  MagickSetImageGamma() sets the image gamma.
9594%
9595%  The format of the MagickSetImageGamma method is:
9596%
9597%      MagickBooleanType MagickSetImageGamma(MagickWand *wand,
9598%        const double gamma)
9599%
9600%  A description of each parameter follows:
9601%
9602%    o wand: the magick wand.
9603%
9604%    o gamma: the image gamma.
9605%
9606*/
9607WandExport MagickBooleanType MagickSetImageGamma(MagickWand *wand,
9608  const double gamma)
9609{
9610  assert(wand != (MagickWand *) NULL);
9611  assert(wand->signature == WandSignature);
9612  if (IfMagickTrue(wand->debug))
9613    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9614  if (wand->images == (Image *) NULL)
9615    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9616  wand->images->gamma=gamma;
9617  return(MagickTrue);
9618}
9619
9620/*
9621%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9622%                                                                             %
9623%                                                                             %
9624%                                                                             %
9625%   M a g i c k S e t I m a g e G r a v i t y                                 %
9626%                                                                             %
9627%                                                                             %
9628%                                                                             %
9629%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9630%
9631%  MagickSetImageGravity() sets the image gravity type.
9632%
9633%  The format of the MagickSetImageGravity method is:
9634%
9635%      MagickBooleanType MagickSetImageGravity(MagickWand *wand,
9636%        const GravityType gravity)
9637%
9638%  A description of each parameter follows:
9639%
9640%    o wand: the magick wand.
9641%
9642%    o gravity: the image interlace scheme: NoInterlace, LineInterlace,
9643%      PlaneInterlace, PartitionInterlace.
9644%
9645*/
9646WandExport MagickBooleanType MagickSetImageGravity(MagickWand *wand,
9647  const GravityType gravity)
9648{
9649  assert(wand != (MagickWand *) NULL);
9650  assert(wand->signature == WandSignature);
9651  if (IfMagickTrue(wand->debug))
9652    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9653  if (wand->images == (Image *) NULL)
9654    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9655  wand->images->gravity=gravity;
9656  return(MagickTrue);
9657}
9658
9659/*
9660%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9661%                                                                             %
9662%                                                                             %
9663%                                                                             %
9664%   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                       %
9665%                                                                             %
9666%                                                                             %
9667%                                                                             %
9668%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9669%
9670%  MagickSetImageGreenPrimary() sets the image chromaticity green primary
9671%  point.
9672%
9673%  The format of the MagickSetImageGreenPrimary method is:
9674%
9675%      MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand,
9676%        const double x,const double y)
9677%
9678%  A description of each parameter follows:
9679%
9680%    o wand: the magick wand.
9681%
9682%    o x: the green primary x-point.
9683%
9684%    o y: the green primary y-point.
9685%
9686%
9687*/
9688WandExport MagickBooleanType MagickSetImageGreenPrimary(MagickWand *wand,
9689  const double x,const double y)
9690{
9691  assert(wand != (MagickWand *) NULL);
9692  assert(wand->signature == WandSignature);
9693  if (IfMagickTrue(wand->debug))
9694    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9695  if (wand->images == (Image *) NULL)
9696    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9697  wand->images->chromaticity.green_primary.x=x;
9698  wand->images->chromaticity.green_primary.y=y;
9699  return(MagickTrue);
9700}
9701
9702/*
9703%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9704%                                                                             %
9705%                                                                             %
9706%                                                                             %
9707%   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                 %
9708%                                                                             %
9709%                                                                             %
9710%                                                                             %
9711%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9712%
9713%  MagickSetImageInterlaceScheme() sets the image interlace scheme.
9714%
9715%  The format of the MagickSetImageInterlaceScheme method is:
9716%
9717%      MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand,
9718%        const InterlaceType interlace)
9719%
9720%  A description of each parameter follows:
9721%
9722%    o wand: the magick wand.
9723%
9724%    o interlace: the image interlace scheme: NoInterlace, LineInterlace,
9725%      PlaneInterlace, PartitionInterlace.
9726%
9727*/
9728WandExport MagickBooleanType MagickSetImageInterlaceScheme(MagickWand *wand,
9729  const InterlaceType interlace)
9730{
9731  assert(wand != (MagickWand *) NULL);
9732  assert(wand->signature == WandSignature);
9733  if (IfMagickTrue(wand->debug))
9734    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9735  if (wand->images == (Image *) NULL)
9736    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9737  wand->images->interlace=interlace;
9738  return(MagickTrue);
9739}
9740
9741/*
9742%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9743%                                                                             %
9744%                                                                             %
9745%                                                                             %
9746%   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             %
9747%                                                                             %
9748%                                                                             %
9749%                                                                             %
9750%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9751%
9752%  MagickSetImagePixelInterpolateMethod() sets the image interpolate pixel
9753%  method.
9754%
9755%  The format of the MagickSetImagePixelInterpolateMethod method is:
9756%
9757%      MagickBooleanType MagickSetImagePixelInterpolateMethod(MagickWand *wand,
9758%        const PixelInterpolateMethod method)
9759%
9760%  A description of each parameter follows:
9761%
9762%    o wand: the magick wand.
9763%
9764%    o method: the image interpole pixel methods: choose from Undefined,
9765%      Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor.
9766%
9767*/
9768WandExport MagickBooleanType MagickSetImagePixelInterpolateMethod(
9769  MagickWand *wand,const PixelInterpolateMethod method)
9770{
9771  assert(wand != (MagickWand *) NULL);
9772  assert(wand->signature == WandSignature);
9773  if (IfMagickTrue(wand->debug))
9774    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9775  if (wand->images == (Image *) NULL)
9776    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9777  wand->images->interpolate=method;
9778  return(MagickTrue);
9779}
9780
9781/*
9782%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9783%                                                                             %
9784%                                                                             %
9785%                                                                             %
9786%   M a g i c k S e t I m a g e I t e r a t i o n s                           %
9787%                                                                             %
9788%                                                                             %
9789%                                                                             %
9790%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9791%
9792%  MagickSetImageIterations() sets the image iterations.
9793%
9794%  The format of the MagickSetImageIterations method is:
9795%
9796%      MagickBooleanType MagickSetImageIterations(MagickWand *wand,
9797%        const size_t iterations)
9798%
9799%  A description of each parameter follows:
9800%
9801%    o wand: the magick wand.
9802%
9803%    o delay: the image delay in 1/100th of a second.
9804%
9805*/
9806WandExport MagickBooleanType MagickSetImageIterations(MagickWand *wand,
9807  const size_t iterations)
9808{
9809  assert(wand != (MagickWand *) NULL);
9810  assert(wand->signature == WandSignature);
9811  if (IfMagickTrue(wand->debug))
9812    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9813  if (wand->images == (Image *) NULL)
9814    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9815  wand->images->iterations=iterations;
9816  return(MagickTrue);
9817}
9818
9819/*
9820%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9821%                                                                             %
9822%                                                                             %
9823%                                                                             %
9824%   M a g i c k S e t I m a g e M a t t e                                     %
9825%                                                                             %
9826%                                                                             %
9827%                                                                             %
9828%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9829%
9830%  MagickSetImageMatte() sets the image matte channel.
9831%
9832%  The format of the MagickSetImageMatteColor method is:
9833%
9834%      MagickBooleanType MagickSetImageMatteColor(MagickWand *wand,
9835%        const MagickBooleanType *matte)
9836%
9837%  A description of each parameter follows:
9838%
9839%    o wand: the magick wand.
9840%
9841%    o matte: Set to MagickTrue to enable the image matte channel otherwise
9842%      MagickFalse.
9843%
9844*/
9845WandExport MagickBooleanType MagickSetImageMatte(MagickWand *wand,
9846  const MagickBooleanType matte)
9847{
9848  assert(wand != (MagickWand *) NULL);
9849  assert(wand->signature == WandSignature);
9850  if (IfMagickTrue(wand->debug))
9851    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9852  if (wand->images == (Image *) NULL)
9853    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9854  if ((wand->images->alpha_trait == UndefinedPixelTrait) && IsMagickTrue(matte))
9855    (void) SetImageAlpha(wand->images,OpaqueAlpha,wand->exception);
9856  wand->images->alpha_trait=matte != MagickFalse ? BlendPixelTrait :
9857    UndefinedPixelTrait;
9858  return(MagickTrue);
9859}
9860
9861/*
9862%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9863%                                                                             %
9864%                                                                             %
9865%                                                                             %
9866%   M a g i c k S e t I m a g e M a t t e C o l o r                           %
9867%                                                                             %
9868%                                                                             %
9869%                                                                             %
9870%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9871%
9872%  MagickSetImageMatteColor() sets the image matte color.
9873%
9874%  The format of the MagickSetImageMatteColor method is:
9875%
9876%      MagickBooleanType MagickSetImageMatteColor(MagickWand *wand,
9877%        const PixelWand *matte)
9878%
9879%  A description of each parameter follows:
9880%
9881%    o wand: the magick wand.
9882%
9883%    o matte: the matte pixel wand.
9884%
9885*/
9886WandExport MagickBooleanType MagickSetImageMatteColor(MagickWand *wand,
9887  const PixelWand *matte)
9888{
9889  assert(wand != (MagickWand *) NULL);
9890  assert(wand->signature == WandSignature);
9891  if (IfMagickTrue(wand->debug))
9892    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9893  if (wand->images == (Image *) NULL)
9894    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9895  PixelGetQuantumPacket(matte,&wand->images->matte_color);
9896  return(MagickTrue);
9897}
9898
9899/*
9900%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9901%                                                                             %
9902%                                                                             %
9903%                                                                             %
9904%   M a g i c k S e t I m a g e O p a c i t y                                 %
9905%                                                                             %
9906%                                                                             %
9907%                                                                             %
9908%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9909%
9910%  MagickSetImageAlpha() sets the image to the specified alpha level.
9911%
9912%  The format of the MagickSetImageAlpha method is:
9913%
9914%      MagickBooleanType MagickSetImageAlpha(MagickWand *wand,
9915%        const double alpha)
9916%
9917%  A description of each parameter follows:
9918%
9919%    o wand: the magick wand.
9920%
9921%    o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
9922%      transparent.
9923%
9924*/
9925WandExport MagickBooleanType MagickSetImageAlpha(MagickWand *wand,
9926  const double alpha)
9927{
9928  MagickBooleanType
9929    status;
9930
9931  assert(wand != (MagickWand *) NULL);
9932  assert(wand->signature == WandSignature);
9933  if (IfMagickTrue(wand->debug))
9934    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9935  if (wand->images == (Image *) NULL)
9936    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9937  status=SetImageAlpha(wand->images,ClampToQuantum(QuantumRange*alpha),
9938    wand->exception);
9939  return(status);
9940}
9941
9942/*
9943%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9944%                                                                             %
9945%                                                                             %
9946%                                                                             %
9947%   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                         %
9948%                                                                             %
9949%                                                                             %
9950%                                                                             %
9951%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9952%
9953%  MagickSetImageOrientation() sets the image orientation.
9954%
9955%  The format of the MagickSetImageOrientation method is:
9956%
9957%      MagickBooleanType MagickSetImageOrientation(MagickWand *wand,
9958%        const OrientationType orientation)
9959%
9960%  A description of each parameter follows:
9961%
9962%    o wand: the magick wand.
9963%
9964%    o orientation: the image orientation type.
9965%
9966*/
9967WandExport MagickBooleanType MagickSetImageOrientation(MagickWand *wand,
9968  const OrientationType orientation)
9969{
9970  assert(wand != (MagickWand *) NULL);
9971  assert(wand->signature == WandSignature);
9972  if (IfMagickTrue(wand->debug))
9973    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
9974  if (wand->images == (Image *) NULL)
9975    ThrowWandException(WandError,"ContainsNoImages",wand->name);
9976  wand->images->orientation=orientation;
9977  return(MagickTrue);
9978}
9979
9980/*
9981%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9982%                                                                             %
9983%                                                                             %
9984%                                                                             %
9985%   M a g i c k S e t I m a g e P a g e                                       %
9986%                                                                             %
9987%                                                                             %
9988%                                                                             %
9989%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9990%
9991%  MagickSetImagePage() sets the page geometry of the image.
9992%
9993%  The format of the MagickSetImagePage method is:
9994%
9995%      MagickBooleanType MagickSetImagePage(MagickWand *wand,const size_t width,%        const size_t height,const ssize_t x,const ssize_t y)
9996%
9997%  A description of each parameter follows:
9998%
9999%    o wand: the magick wand.
10000%
10001%    o width: the page width.
10002%
10003%    o height: the page height.
10004%
10005%    o x: the page x-offset.
10006%
10007%    o y: the page y-offset.
10008%
10009*/
10010WandExport MagickBooleanType MagickSetImagePage(MagickWand *wand,
10011  const size_t width,const size_t height,const ssize_t x,
10012  const ssize_t y)
10013{
10014  assert(wand != (MagickWand *) NULL);
10015  assert(wand->signature == WandSignature);
10016  if (IfMagickTrue(wand->debug))
10017    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10018  if (wand->images == (Image *) NULL)
10019    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10020  wand->images->page.width=width;
10021  wand->images->page.height=height;
10022  wand->images->page.x=x;
10023  wand->images->page.y=y;
10024  return(MagickTrue);
10025}
10026
10027/*
10028%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10029%                                                                             %
10030%                                                                             %
10031%                                                                             %
10032%   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                 %
10033%                                                                             %
10034%                                                                             %
10035%                                                                             %
10036%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10037%
10038%  MagickSetImageProgressMonitor() sets the wand image progress monitor to the
10039%  specified method and returns the previous progress monitor if any.  The
10040%  progress monitor method looks like this:
10041%
10042%    MagickBooleanType MagickProgressMonitor(const char *text,
10043%      const MagickOffsetType offset,const MagickSizeType span,
10044%      void *client_data)
10045%
10046%  If the progress monitor returns MagickFalse, the current operation is
10047%  interrupted.
10048%
10049%  The format of the MagickSetImageProgressMonitor method is:
10050%
10051%      MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand
10052%        const MagickProgressMonitor progress_monitor,void *client_data)
10053%
10054%  A description of each parameter follows:
10055%
10056%    o wand: the magick wand.
10057%
10058%    o progress_monitor: Specifies a pointer to a method to monitor progress
10059%      of an image operation.
10060%
10061%    o client_data: Specifies a pointer to any client data.
10062%
10063*/
10064WandExport MagickProgressMonitor MagickSetImageProgressMonitor(MagickWand *wand,
10065  const MagickProgressMonitor progress_monitor,void *client_data)
10066{
10067  MagickProgressMonitor
10068    previous_monitor;
10069
10070  assert(wand != (MagickWand *) NULL);
10071  assert(wand->signature == WandSignature);
10072  if (IfMagickTrue(wand->debug))
10073    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10074  if (wand->images == (Image *) NULL)
10075    {
10076      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
10077        "ContainsNoImages","`%s'",wand->name);
10078      return((MagickProgressMonitor) NULL);
10079    }
10080  previous_monitor=SetImageProgressMonitor(wand->images,
10081    progress_monitor,client_data);
10082  return(previous_monitor);
10083}
10084
10085/*
10086%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10087%                                                                             %
10088%                                                                             %
10089%                                                                             %
10090%   M a g i c k S e t I m a g e R e d P r i m a r y                           %
10091%                                                                             %
10092%                                                                             %
10093%                                                                             %
10094%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10095%
10096%  MagickSetImageRedPrimary() sets the image chromaticity red primary point.
10097%
10098%  The format of the MagickSetImageRedPrimary method is:
10099%
10100%      MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand,
10101%        const double x,const double y)
10102%
10103%  A description of each parameter follows:
10104%
10105%    o wand: the magick wand.
10106%
10107%    o x: the red primary x-point.
10108%
10109%    o y: the red primary y-point.
10110%
10111*/
10112WandExport MagickBooleanType MagickSetImageRedPrimary(MagickWand *wand,
10113  const double x,const double y)
10114{
10115  assert(wand != (MagickWand *) NULL);
10116  assert(wand->signature == WandSignature);
10117  if (IfMagickTrue(wand->debug))
10118    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10119  if (wand->images == (Image *) NULL)
10120    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10121  wand->images->chromaticity.red_primary.x=x;
10122  wand->images->chromaticity.red_primary.y=y;
10123  return(MagickTrue);
10124}
10125
10126/*
10127%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10128%                                                                             %
10129%                                                                             %
10130%                                                                             %
10131%   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                 %
10132%                                                                             %
10133%                                                                             %
10134%                                                                             %
10135%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10136%
10137%  MagickSetImageRenderingIntent() sets the image rendering intent.
10138%
10139%  The format of the MagickSetImageRenderingIntent method is:
10140%
10141%      MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand,
10142%        const RenderingIntent rendering_intent)
10143%
10144%  A description of each parameter follows:
10145%
10146%    o wand: the magick wand.
10147%
10148%    o rendering_intent: the image rendering intent: UndefinedIntent,
10149%      SaturationIntent, PerceptualIntent, AbsoluteIntent, or RelativeIntent.
10150%
10151*/
10152WandExport MagickBooleanType MagickSetImageRenderingIntent(MagickWand *wand,
10153  const RenderingIntent rendering_intent)
10154{
10155  assert(wand != (MagickWand *) NULL);
10156  assert(wand->signature == WandSignature);
10157  if (IfMagickTrue(wand->debug))
10158    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10159  if (wand->images == (Image *) NULL)
10160    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10161  wand->images->rendering_intent=rendering_intent;
10162  return(MagickTrue);
10163}
10164
10165/*
10166%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10167%                                                                             %
10168%                                                                             %
10169%                                                                             %
10170%   M a g i c k S e t I m a g e R e s o l u t i o n                           %
10171%                                                                             %
10172%                                                                             %
10173%                                                                             %
10174%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10175%
10176%  MagickSetImageResolution() sets the image resolution.
10177%
10178%  The format of the MagickSetImageResolution method is:
10179%
10180%      MagickBooleanType MagickSetImageResolution(MagickWand *wand,
10181%        const double x_resolution,const double y_resolution)
10182%
10183%  A description of each parameter follows:
10184%
10185%    o wand: the magick wand.
10186%
10187%    o x_resolution: the image x resolution.
10188%
10189%    o y_resolution: the image y resolution.
10190%
10191*/
10192WandExport MagickBooleanType MagickSetImageResolution(MagickWand *wand,
10193  const double x_resolution,const double y_resolution)
10194{
10195  assert(wand != (MagickWand *) NULL);
10196  assert(wand->signature == WandSignature);
10197  if (IfMagickTrue(wand->debug))
10198    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10199  if (wand->images == (Image *) NULL)
10200    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10201  wand->images->resolution.x=x_resolution;
10202  wand->images->resolution.y=y_resolution;
10203  return(MagickTrue);
10204}
10205
10206/*
10207%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10208%                                                                             %
10209%                                                                             %
10210%                                                                             %
10211%   M a g i c k S e t I m a g e S c e n e                                     %
10212%                                                                             %
10213%                                                                             %
10214%                                                                             %
10215%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10216%
10217%  MagickSetImageScene() sets the image scene.
10218%
10219%  The format of the MagickSetImageScene method is:
10220%
10221%      MagickBooleanType MagickSetImageScene(MagickWand *wand,
10222%        const size_t scene)
10223%
10224%  A description of each parameter follows:
10225%
10226%    o wand: the magick wand.
10227%
10228%    o delay: the image scene number.
10229%
10230*/
10231WandExport MagickBooleanType MagickSetImageScene(MagickWand *wand,
10232  const size_t scene)
10233{
10234  assert(wand != (MagickWand *) NULL);
10235  assert(wand->signature == WandSignature);
10236  if (IfMagickTrue(wand->debug))
10237    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10238  if (wand->images == (Image *) NULL)
10239    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10240  wand->images->scene=scene;
10241  return(MagickTrue);
10242}
10243
10244/*
10245%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10246%                                                                             %
10247%                                                                             %
10248%                                                                             %
10249%   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                   %
10250%                                                                             %
10251%                                                                             %
10252%                                                                             %
10253%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10254%
10255%  MagickSetImageTicksPerSecond() sets the image ticks-per-second.
10256%
10257%  The format of the MagickSetImageTicksPerSecond method is:
10258%
10259%      MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand,
10260%        const ssize_t ticks_per-second)
10261%
10262%  A description of each parameter follows:
10263%
10264%    o wand: the magick wand.
10265%
10266%    o ticks_per_second: the units to use for the image delay.
10267%
10268*/
10269WandExport MagickBooleanType MagickSetImageTicksPerSecond(MagickWand *wand,
10270  const ssize_t ticks_per_second)
10271{
10272  assert(wand != (MagickWand *) NULL);
10273  assert(wand->signature == WandSignature);
10274  if (IfMagickTrue(wand->debug))
10275    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10276  if (wand->images == (Image *) NULL)
10277    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10278  wand->images->ticks_per_second=ticks_per_second;
10279  return(MagickTrue);
10280}
10281
10282/*
10283%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10284%                                                                             %
10285%                                                                             %
10286%                                                                             %
10287%   M a g i c k S e t I m a g e T y p e                                       %
10288%                                                                             %
10289%                                                                             %
10290%                                                                             %
10291%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10292%
10293%  MagickSetImageType() sets the image type.
10294%
10295%  The format of the MagickSetImageType method is:
10296%
10297%      MagickBooleanType MagickSetImageType(MagickWand *wand,
10298%        const ImageType image_type)
10299%
10300%  A description of each parameter follows:
10301%
10302%    o wand: the magick wand.
10303%
10304%    o image_type: the image type:   UndefinedType, BilevelType, GrayscaleType,
10305%      GrayscaleAlphaType, PaletteType, PaletteAlphaType, TrueColorType,
10306%      TrueColorAlphaType, ColorSeparationType, ColorSeparationAlphaType,
10307%      or OptimizeType.
10308%
10309*/
10310WandExport MagickBooleanType MagickSetImageType(MagickWand *wand,
10311  const ImageType image_type)
10312{
10313  assert(wand != (MagickWand *) NULL);
10314  assert(wand->signature == WandSignature);
10315  if (IfMagickTrue(wand->debug))
10316    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10317  if (wand->images == (Image *) NULL)
10318    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10319  return(SetImageType(wand->images,image_type,wand->exception));
10320}
10321
10322/*
10323%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10324%                                                                             %
10325%                                                                             %
10326%                                                                             %
10327%   M a g i c k S e t I m a g e U n i t s                                     %
10328%                                                                             %
10329%                                                                             %
10330%                                                                             %
10331%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10332%
10333%  MagickSetImageUnits() sets the image units of resolution.
10334%
10335%  The format of the MagickSetImageUnits method is:
10336%
10337%      MagickBooleanType MagickSetImageUnits(MagickWand *wand,
10338%        const ResolutionType units)
10339%
10340%  A description of each parameter follows:
10341%
10342%    o wand: the magick wand.
10343%
10344%    o units: the image units of resolution : UndefinedResolution,
10345%      PixelsPerInchResolution, or PixelsPerCentimeterResolution.
10346%
10347*/
10348WandExport MagickBooleanType MagickSetImageUnits(MagickWand *wand,
10349  const ResolutionType units)
10350{
10351  assert(wand != (MagickWand *) NULL);
10352  assert(wand->signature == WandSignature);
10353  if (IfMagickTrue(wand->debug))
10354    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10355  if (wand->images == (Image *) NULL)
10356    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10357  wand->images->units=units;
10358  return(MagickTrue);
10359}
10360
10361/*
10362%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10363%                                                                             %
10364%                                                                             %
10365%                                                                             %
10366%   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           %
10367%                                                                             %
10368%                                                                             %
10369%                                                                             %
10370%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10371%
10372%  MagickSetImageVirtualPixelMethod() sets the image virtual pixel method.
10373%
10374%  The format of the MagickSetImageVirtualPixelMethod method is:
10375%
10376%      VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand,
10377%        const VirtualPixelMethod method)
10378%
10379%  A description of each parameter follows:
10380%
10381%    o wand: the magick wand.
10382%
10383%    o method: the image virtual pixel method : UndefinedVirtualPixelMethod,
10384%      ConstantVirtualPixelMethod,  EdgeVirtualPixelMethod,
10385%      MirrorVirtualPixelMethod, or TileVirtualPixelMethod.
10386%
10387*/
10388WandExport VirtualPixelMethod MagickSetImageVirtualPixelMethod(MagickWand *wand,
10389  const VirtualPixelMethod method)
10390{
10391  assert(wand != (MagickWand *) NULL);
10392  assert(wand->signature == WandSignature);
10393  if (IfMagickTrue(wand->debug))
10394    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10395  if (wand->images == (Image *) NULL)
10396    return(UndefinedVirtualPixelMethod);
10397  return(SetImageVirtualPixelMethod(wand->images,method,wand->exception));
10398}
10399
10400/*
10401%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10402%                                                                             %
10403%                                                                             %
10404%                                                                             %
10405%   M a g i c k S e t I m a g e W h i t e P o i n t                           %
10406%                                                                             %
10407%                                                                             %
10408%                                                                             %
10409%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10410%
10411%  MagickSetImageWhitePoint() sets the image chromaticity white point.
10412%
10413%  The format of the MagickSetImageWhitePoint method is:
10414%
10415%      MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand,
10416%        const double x,const double y)
10417%
10418%  A description of each parameter follows:
10419%
10420%    o wand: the magick wand.
10421%
10422%    o x: the white x-point.
10423%
10424%    o y: the white y-point.
10425%
10426*/
10427WandExport MagickBooleanType MagickSetImageWhitePoint(MagickWand *wand,
10428  const double x,const double y)
10429{
10430  assert(wand != (MagickWand *) NULL);
10431  assert(wand->signature == WandSignature);
10432  if (IfMagickTrue(wand->debug))
10433    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10434  if (wand->images == (Image *) NULL)
10435    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10436  wand->images->chromaticity.white_point.x=x;
10437  wand->images->chromaticity.white_point.y=y;
10438  return(MagickTrue);
10439}
10440
10441/*
10442%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10443%                                                                             %
10444%                                                                             %
10445%                                                                             %
10446%   M a g i c k S h a d e I m a g e C h a n n e l                             %
10447%                                                                             %
10448%                                                                             %
10449%                                                                             %
10450%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10451%
10452%  MagickShadeImage() shines a distant light on an image to create a
10453%  three-dimensional effect. You control the positioning of the light with
10454%  azimuth and elevation; azimuth is measured in degrees off the x axis
10455%  and elevation is measured in pixels above the Z axis.
10456%
10457%  The format of the MagickShadeImage method is:
10458%
10459%      MagickBooleanType MagickShadeImage(MagickWand *wand,
10460%        const MagickBooleanType gray,const double azimuth,
10461%        const double elevation)
10462%
10463%  A description of each parameter follows:
10464%
10465%    o wand: the magick wand.
10466%
10467%    o gray: A value other than zero shades the intensity of each pixel.
10468%
10469%    o azimuth, elevation:  Define the light source direction.
10470%
10471*/
10472WandExport MagickBooleanType MagickShadeImage(MagickWand *wand,
10473  const MagickBooleanType gray,const double asimuth,const double elevation)
10474{
10475  Image
10476    *shade_image;
10477
10478  assert(wand != (MagickWand *) NULL);
10479  assert(wand->signature == WandSignature);
10480  if (IfMagickTrue(wand->debug))
10481    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10482  if (wand->images == (Image *) NULL)
10483    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10484  shade_image=ShadeImage(wand->images,gray,asimuth,elevation,wand->exception);
10485  if (shade_image == (Image *) NULL)
10486    return(MagickFalse);
10487  ReplaceImageInList(&wand->images,shade_image);
10488  return(MagickTrue);
10489}
10490
10491/*
10492%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10493%                                                                             %
10494%                                                                             %
10495%                                                                             %
10496%   M a g i c k S h a d o w I m a g e                                         %
10497%                                                                             %
10498%                                                                             %
10499%                                                                             %
10500%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10501%
10502%  MagickShadowImage() simulates an image shadow.
10503%
10504%  The format of the MagickShadowImage method is:
10505%
10506%      MagickBooleanType MagickShadowImage(MagickWand *wand,const double alpha,
10507%        const double sigma,const ssize_t x,const ssize_t y)
10508%
10509%  A description of each parameter follows:
10510%
10511%    o wand: the magick wand.
10512%
10513%    o alpha: percentage transparency.
10514%
10515%    o sigma: the standard deviation of the Gaussian, in pixels.
10516%
10517%    o x: the shadow x-offset.
10518%
10519%    o y: the shadow y-offset.
10520%
10521*/
10522WandExport MagickBooleanType MagickShadowImage(MagickWand *wand,
10523  const double alpha,const double sigma,const ssize_t x,const ssize_t y)
10524{
10525  Image
10526    *shadow_image;
10527
10528  assert(wand != (MagickWand *) NULL);
10529  assert(wand->signature == WandSignature);
10530  if (IfMagickTrue(wand->debug))
10531    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10532  if (wand->images == (Image *) NULL)
10533    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10534  shadow_image=ShadowImage(wand->images,alpha,sigma,x,y,wand->exception);
10535  if (shadow_image == (Image *) NULL)
10536    return(MagickFalse);
10537  ReplaceImageInList(&wand->images,shadow_image);
10538  return(MagickTrue);
10539}
10540
10541/*
10542%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10543%                                                                             %
10544%                                                                             %
10545%                                                                             %
10546%   M a g i c k S h a r p e n I m a g e                                       %
10547%                                                                             %
10548%                                                                             %
10549%                                                                             %
10550%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10551%
10552%  MagickSharpenImage() sharpens an image.  We convolve the image with a
10553%  Gaussian operator of the given radius and standard deviation (sigma).
10554%  For reasonable results, the radius should be larger than sigma.  Use a
10555%  radius of 0 and MagickSharpenImage() selects a suitable radius for you.
10556%
10557%  The format of the MagickSharpenImage method is:
10558%
10559%      MagickBooleanType MagickSharpenImage(MagickWand *wand,
10560%        const double radius,const double sigma)
10561%
10562%  A description of each parameter follows:
10563%
10564%    o wand: the magick wand.
10565%
10566%    o radius: the radius of the Gaussian, in pixels, not counting the center
10567%      pixel.
10568%
10569%    o sigma: the standard deviation of the Gaussian, in pixels.
10570%
10571*/
10572WandExport MagickBooleanType MagickSharpenImage(MagickWand *wand,
10573  const double radius,const double sigma)
10574{
10575  Image
10576    *sharp_image;
10577
10578  assert(wand != (MagickWand *) NULL);
10579  assert(wand->signature == WandSignature);
10580  if (IfMagickTrue(wand->debug))
10581    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10582  if (wand->images == (Image *) NULL)
10583    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10584  sharp_image=SharpenImage(wand->images,radius,sigma,wand->exception);
10585  if (sharp_image == (Image *) NULL)
10586    return(MagickFalse);
10587  ReplaceImageInList(&wand->images,sharp_image);
10588  return(MagickTrue);
10589}
10590
10591/*
10592%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10593%                                                                             %
10594%                                                                             %
10595%                                                                             %
10596%   M a g i c k S h a v e I m a g e                                           %
10597%                                                                             %
10598%                                                                             %
10599%                                                                             %
10600%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10601%
10602%  MagickShaveImage() shaves pixels from the image edges.  It allocates the
10603%  memory necessary for the new Image structure and returns a pointer to the
10604%  new image.
10605%
10606%  The format of the MagickShaveImage method is:
10607%
10608%      MagickBooleanType MagickShaveImage(MagickWand *wand,
10609%        const size_t columns,const size_t rows)
10610%
10611%  A description of each parameter follows:
10612%
10613%    o wand: the magick wand.
10614%
10615%    o columns: the number of columns in the scaled image.
10616%
10617%    o rows: the number of rows in the scaled image.
10618%
10619%
10620*/
10621WandExport MagickBooleanType MagickShaveImage(MagickWand *wand,
10622  const size_t columns,const size_t rows)
10623{
10624  Image
10625    *shave_image;
10626
10627  RectangleInfo
10628    shave_info;
10629
10630  assert(wand != (MagickWand *) NULL);
10631  assert(wand->signature == WandSignature);
10632  if (IfMagickTrue(wand->debug))
10633    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10634  if (wand->images == (Image *) NULL)
10635    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10636  shave_info.width=columns;
10637  shave_info.height=rows;
10638  shave_info.x=0;
10639  shave_info.y=0;
10640  shave_image=ShaveImage(wand->images,&shave_info,wand->exception);
10641  if (shave_image == (Image *) NULL)
10642    return(MagickFalse);
10643  ReplaceImageInList(&wand->images,shave_image);
10644  return(MagickTrue);
10645}
10646
10647/*
10648%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10649%                                                                             %
10650%                                                                             %
10651%                                                                             %
10652%   M a g i c k S h e a r I m a g e                                           %
10653%                                                                             %
10654%                                                                             %
10655%                                                                             %
10656%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10657%
10658%  MagickShearImage() slides one edge of an image along the X or Y axis,
10659%  creating a parallelogram.  An X direction shear slides an edge along the X
10660%  axis, while a Y direction shear slides an edge along the Y axis.  The amount
10661%  of the shear is controlled by a shear angle.  For X direction shears, x_shear
10662%  is measured relative to the Y axis, and similarly, for Y direction shears
10663%  y_shear is measured relative to the X axis.  Empty triangles left over from
10664%  shearing the image are filled with the background color.
10665%
10666%  The format of the MagickShearImage method is:
10667%
10668%      MagickBooleanType MagickShearImage(MagickWand *wand,
10669%        const PixelWand *background,const double x_shear,const double y_shear)
10670%
10671%  A description of each parameter follows:
10672%
10673%    o wand: the magick wand.
10674%
10675%    o background: the background pixel wand.
10676%
10677%    o x_shear: the number of degrees to shear the image.
10678%
10679%    o y_shear: the number of degrees to shear the image.
10680%
10681*/
10682WandExport MagickBooleanType MagickShearImage(MagickWand *wand,
10683  const PixelWand *background,const double x_shear,const double y_shear)
10684{
10685  Image
10686    *shear_image;
10687
10688  assert(wand != (MagickWand *) NULL);
10689  assert(wand->signature == WandSignature);
10690  if (IfMagickTrue(wand->debug))
10691    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10692  if (wand->images == (Image *) NULL)
10693    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10694  PixelGetQuantumPacket(background,&wand->images->background_color);
10695  shear_image=ShearImage(wand->images,x_shear,y_shear,wand->exception);
10696  if (shear_image == (Image *) NULL)
10697    return(MagickFalse);
10698  ReplaceImageInList(&wand->images,shear_image);
10699  return(MagickTrue);
10700}
10701
10702/*
10703%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10704%                                                                             %
10705%                                                                             %
10706%                                                                             %
10707%   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                   %
10708%                                                                             %
10709%                                                                             %
10710%                                                                             %
10711%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10712%
10713%  MagickSigmoidalContrastImage() adjusts the contrast of an image with a
10714%  non-linear sigmoidal contrast algorithm.  Increase the contrast of the
10715%  image using a sigmoidal transfer function without saturating highlights or
10716%  shadows.  Contrast indicates how much to increase the contrast (0 is none;
10717%  3 is typical; 20 is pushing it); mid-point indicates where midtones fall in
10718%  the resultant image (0 is white; 50% is middle-gray; 100% is black).  Set
10719%  sharpen to MagickTrue to increase the image contrast otherwise the contrast
10720%  is reduced.
10721%
10722%  The format of the MagickSigmoidalContrastImage method is:
10723%
10724%      MagickBooleanType MagickSigmoidalContrastImage(MagickWand *wand,
10725%        const MagickBooleanType sharpen,const double alpha,const double beta)
10726%
10727%  A description of each parameter follows:
10728%
10729%    o wand: the magick wand.
10730%
10731%    o sharpen: Increase or decrease image contrast.
10732%
10733%    o alpha: strength of the contrast, the larger the number the more
10734%      'threshold-like' it becomes.
10735%
10736%    o beta: midpoint of the function as a color value 0 to QuantumRange.
10737%
10738*/
10739WandExport MagickBooleanType MagickSigmoidalContrastImage(
10740  MagickWand *wand,const MagickBooleanType sharpen,const double alpha,
10741  const double beta)
10742{
10743  MagickBooleanType
10744    status;
10745
10746  assert(wand != (MagickWand *) NULL);
10747  assert(wand->signature == WandSignature);
10748  if (IfMagickTrue(wand->debug))
10749    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10750  if (wand->images == (Image *) NULL)
10751    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10752  status=SigmoidalContrastImage(wand->images,sharpen,alpha,beta,
10753    wand->exception);
10754  return(status);
10755}
10756
10757/*
10758%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10759%                                                                             %
10760%                                                                             %
10761%                                                                             %
10762%   M a g i c k S i m i l a r i t y I m a g e                                 %
10763%                                                                             %
10764%                                                                             %
10765%                                                                             %
10766%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10767%
10768%  MagickSimilarityImage() compares the reference image of the image and
10769%  returns the best match offset.  In addition, it returns a similarity image
10770%  such that an exact match location is completely white and if none of the
10771%  pixels match, black, otherwise some gray level in-between.
10772%
10773%  The format of the MagickSimilarityImage method is:
10774%
10775%      MagickWand *MagickSimilarityImage(MagickWand *wand,
10776%        const MagickWand *reference,const MetricType metric,
10777%        const double similarity_threshold,RectangeInfo *offset,
10778%        double *similarity)
10779%
10780%  A description of each parameter follows:
10781%
10782%    o wand: the magick wand.
10783%
10784%    o reference: the reference wand.
10785%
10786%    o metric: the metric.
10787%
10788%    o similarity_threshold: minimum distortion for (sub)image match.
10789%
10790%    o offset: the best match offset of the reference image within the image.
10791%
10792%    o similarity: the computed similarity between the images.
10793%
10794*/
10795WandExport MagickWand *MagickSimilarityImage(MagickWand *wand,
10796  const MagickWand *reference,const MetricType metric,
10797  const double similarity_threshold,RectangleInfo *offset,double *similarity)
10798{
10799  Image
10800    *similarity_image;
10801
10802  assert(wand != (MagickWand *) NULL);
10803  assert(wand->signature == WandSignature);
10804  if (IfMagickTrue(wand->debug))
10805    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10806  if ((wand->images == (Image *) NULL) || (reference->images == (Image *) NULL))
10807    {
10808      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
10809        "ContainsNoImages","`%s'",wand->name);
10810      return((MagickWand *) NULL);
10811    }
10812  similarity_image=SimilarityImage(wand->images,reference->images,metric,
10813    similarity_threshold,offset,similarity,wand->exception);
10814  if (similarity_image == (Image *) NULL)
10815    return((MagickWand *) NULL);
10816  return(CloneMagickWandFromImages(wand,similarity_image));
10817}
10818
10819/*
10820%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10821%                                                                             %
10822%                                                                             %
10823%                                                                             %
10824%   M a g i c k S k e t c h I m a g e                                         %
10825%                                                                             %
10826%                                                                             %
10827%                                                                             %
10828%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10829%
10830%  MagickSketchImage() simulates a pencil sketch.  We convolve the image with
10831%  a Gaussian operator of the given radius and standard deviation (sigma).
10832%  For reasonable results, radius should be larger than sigma.  Use a
10833%  radius of 0 and SketchImage() selects a suitable radius for you.
10834%  Angle gives the angle of the blurring motion.
10835%
10836%  The format of the MagickSketchImage method is:
10837%
10838%      MagickBooleanType MagickSketchImage(MagickWand *wand,
10839%        const double radius,const double sigma,const double angle)
10840%
10841%  A description of each parameter follows:
10842%
10843%    o wand: the magick wand.
10844%
10845%    o radius: the radius of the Gaussian, in pixels, not counting
10846%      the center pixel.
10847%
10848%    o sigma: the standard deviation of the Gaussian, in pixels.
10849%
10850%    o angle: apply the effect along this angle.
10851%
10852*/
10853WandExport MagickBooleanType MagickSketchImage(MagickWand *wand,
10854  const double radius,const double sigma,const double angle)
10855{
10856  Image
10857    *sketch_image;
10858
10859  assert(wand != (MagickWand *) NULL);
10860  assert(wand->signature == WandSignature);
10861  if (IfMagickTrue(wand->debug))
10862    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10863  if (wand->images == (Image *) NULL)
10864    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10865  sketch_image=SketchImage(wand->images,radius,sigma,angle,wand->exception);
10866  if (sketch_image == (Image *) NULL)
10867    return(MagickFalse);
10868  ReplaceImageInList(&wand->images,sketch_image);
10869  return(MagickTrue);
10870}
10871
10872/*
10873%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10874%                                                                             %
10875%                                                                             %
10876%                                                                             %
10877%   M a g i c k S m u s h I m a g e s                                         %
10878%                                                                             %
10879%                                                                             %
10880%                                                                             %
10881%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10882%
10883%  MagickSmushImages() takes all images from the current image pointer to the
10884%  end of the image list and smushs them to each other top-to-bottom if the
10885%  stack parameter is true, otherwise left-to-right.
10886%
10887%  The format of the MagickSmushImages method is:
10888%
10889%      MagickWand *MagickSmushImages(MagickWand *wand,
10890%        const MagickBooleanType stack,const ssize_t offset)
10891%
10892%  A description of each parameter follows:
10893%
10894%    o wand: the magick wand.
10895%
10896%    o stack: By default, images are stacked left-to-right. Set stack to
10897%      MagickTrue to stack them top-to-bottom.
10898%
10899%    o offset: minimum distance in pixels between images.
10900%
10901*/
10902WandExport MagickWand *MagickSmushImages(MagickWand *wand,
10903  const MagickBooleanType stack,const ssize_t offset)
10904{
10905  Image
10906    *smush_image;
10907
10908  assert(wand != (MagickWand *) NULL);
10909  assert(wand->signature == WandSignature);
10910  if (IfMagickTrue(wand->debug))
10911    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10912  if (wand->images == (Image *) NULL)
10913    return((MagickWand *) NULL);
10914  smush_image=SmushImages(wand->images,stack,offset,wand->exception);
10915  if (smush_image == (Image *) NULL)
10916    return((MagickWand *) NULL);
10917  return(CloneMagickWandFromImages(wand,smush_image));
10918}
10919
10920/*
10921%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10922%                                                                             %
10923%                                                                             %
10924%                                                                             %
10925%     M a g i c k S o l a r i z e I m a g e                                   %
10926%                                                                             %
10927%                                                                             %
10928%                                                                             %
10929%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10930%
10931%  MagickSolarizeImage() applies a special effect to the image, similar to the
10932%  effect achieved in a photo darkroom by selectively exposing areas of photo
10933%  sensitive paper to light.  Threshold ranges from 0 to QuantumRange and is a
10934%  measure of the extent of the solarization.
10935%
10936%  The format of the MagickSolarizeImage method is:
10937%
10938%      MagickBooleanType MagickSolarizeImage(MagickWand *wand,
10939%        const double threshold)
10940%
10941%  A description of each parameter follows:
10942%
10943%    o wand: the magick wand.
10944%
10945%    o threshold:  Define the extent of the solarization.
10946%
10947*/
10948WandExport MagickBooleanType MagickSolarizeImage(MagickWand *wand,
10949  const double threshold)
10950{
10951  MagickBooleanType
10952    status;
10953
10954  assert(wand != (MagickWand *) NULL);
10955  assert(wand->signature == WandSignature);
10956  if (IfMagickTrue(wand->debug))
10957    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
10958  if (wand->images == (Image *) NULL)
10959    ThrowWandException(WandError,"ContainsNoImages",wand->name);
10960  status=SolarizeImage(wand->images,threshold,wand->exception);
10961  return(status);
10962}
10963
10964/*
10965%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10966%                                                                             %
10967%                                                                             %
10968%                                                                             %
10969%   M a g i c k S p a r s e C o l o r I m a g e                               %
10970%                                                                             %
10971%                                                                             %
10972%                                                                             %
10973%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10974%
10975%  MagickSparseColorImage(), given a set of coordinates, interpolates the
10976%  colors found at those coordinates, across the whole image, using various
10977%  methods.
10978%
10979%  The format of the MagickSparseColorImage method is:
10980%
10981%      MagickBooleanType MagickSparseColorImage(MagickWand *wand,
10982%        const SparseColorMethod method,const size_t number_arguments,
10983%        const double *arguments)
10984%
10985%  A description of each parameter follows:
10986%
10987%    o image: the image to be sparseed.
10988%
10989%    o method: the method of image sparseion.
10990%
10991%        ArcSparseColorion will always ignore source image offset, and always
10992%        'bestfit' the destination image with the top left corner offset
10993%        relative to the polar mapping center.
10994%
10995%        Bilinear has no simple inverse mapping so will not allow 'bestfit'
10996%        style of image sparseion.
10997%
10998%        Affine, Perspective, and Bilinear, will do least squares fitting of
10999%        the distrotion when more than the minimum number of control point
11000%        pairs are provided.
11001%
11002%        Perspective, and Bilinear, will fall back to a Affine sparseion when
11003%        less than 4 control point pairs are provided. While Affine sparseions
11004%        will let you use any number of control point pairs, that is Zero pairs
11005%        is a No-Op (viewport only) distrotion, one pair is a translation and
11006%        two pairs of control points will do a scale-rotate-translate, without
11007%        any shearing.
11008%
11009%    o number_arguments: the number of arguments given for this sparseion
11010%      method.
11011%
11012%    o arguments: the arguments for this sparseion method.
11013%
11014*/
11015WandExport MagickBooleanType MagickSparseColorImage(MagickWand *wand,
11016  const SparseColorMethod method,const size_t number_arguments,
11017  const double *arguments)
11018{
11019  Image
11020    *sparse_image;
11021
11022  assert(wand != (MagickWand *) NULL);
11023  assert(wand->signature == WandSignature);
11024  if (IfMagickTrue(wand->debug))
11025    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11026  if (wand->images == (Image *) NULL)
11027    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11028  sparse_image=SparseColorImage(wand->images,method,number_arguments,arguments,
11029    wand->exception);
11030  if (sparse_image == (Image *) NULL)
11031    return(MagickFalse);
11032  ReplaceImageInList(&wand->images,sparse_image);
11033  return(MagickTrue);
11034}
11035
11036/*
11037%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11038%                                                                             %
11039%                                                                             %
11040%                                                                             %
11041%   M a g i c k S p l i c e I m a g e                                         %
11042%                                                                             %
11043%                                                                             %
11044%                                                                             %
11045%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11046%
11047%  MagickSpliceImage() splices a solid color into the image.
11048%
11049%  The format of the MagickSpliceImage method is:
11050%
11051%      MagickBooleanType MagickSpliceImage(MagickWand *wand,
11052%        const size_t width,const size_t height,const ssize_t x,
11053%        const ssize_t y)
11054%
11055%  A description of each parameter follows:
11056%
11057%    o wand: the magick wand.
11058%
11059%    o width: the region width.
11060%
11061%    o height: the region height.
11062%
11063%    o x: the region x offset.
11064%
11065%    o y: the region y offset.
11066%
11067*/
11068WandExport MagickBooleanType MagickSpliceImage(MagickWand *wand,
11069  const size_t width,const size_t height,const ssize_t x,
11070  const ssize_t y)
11071{
11072  Image
11073    *splice_image;
11074
11075  RectangleInfo
11076    splice;
11077
11078  assert(wand != (MagickWand *) NULL);
11079  assert(wand->signature == WandSignature);
11080  if (IfMagickTrue(wand->debug))
11081    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11082  if (wand->images == (Image *) NULL)
11083    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11084  splice.width=width;
11085  splice.height=height;
11086  splice.x=x;
11087  splice.y=y;
11088  splice_image=SpliceImage(wand->images,&splice,wand->exception);
11089  if (splice_image == (Image *) NULL)
11090    return(MagickFalse);
11091  ReplaceImageInList(&wand->images,splice_image);
11092  return(MagickTrue);
11093}
11094
11095/*
11096%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11097%                                                                             %
11098%                                                                             %
11099%                                                                             %
11100%   M a g i c k S p r e a d I m a g e                                         %
11101%                                                                             %
11102%                                                                             %
11103%                                                                             %
11104%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11105%
11106%  MagickSpreadImage() is a special effects method that randomly displaces each
11107%  pixel in a block defined by the radius parameter.
11108%
11109%  The format of the MagickSpreadImage method is:
11110%
11111%      MagickBooleanType MagickSpreadImage(MagickWand *wand,const double radius,
11112%        const PixelInterpolateMethod method)
11113%
11114%  A description of each parameter follows:
11115%
11116%    o wand: the magick wand.
11117%
11118%    o radius:  Choose a random pixel in a neighborhood of this extent.
11119%
11120%    o method: the pixel interpolation method.
11121%
11122*/
11123WandExport MagickBooleanType MagickSpreadImage(MagickWand *wand,
11124  const double radius,const PixelInterpolateMethod method)
11125{
11126  Image
11127    *spread_image;
11128
11129  assert(wand != (MagickWand *) NULL);
11130  assert(wand->signature == WandSignature);
11131  if (IfMagickTrue(wand->debug))
11132    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11133  if (wand->images == (Image *) NULL)
11134    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11135  spread_image=SpreadImage(wand->images,radius,method,wand->exception);
11136  if (spread_image == (Image *) NULL)
11137    return(MagickFalse);
11138  ReplaceImageInList(&wand->images,spread_image);
11139  return(MagickTrue);
11140}
11141
11142/*
11143%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11144%                                                                             %
11145%                                                                             %
11146%                                                                             %
11147%   M a g i c k S t a t i s t i c I m a g e                                   %
11148%                                                                             %
11149%                                                                             %
11150%                                                                             %
11151%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11152%
11153%  MagickStatisticImage() replace each pixel with corresponding statistic from
11154%  the neighborhood of the specified width and height.
11155%
11156%  The format of the MagickStatisticImage method is:
11157%
11158%      MagickBooleanType MagickStatisticImage(MagickWand *wand,
11159%        const StatisticType type,const double width,const size_t height)
11160%
11161%  A description of each parameter follows:
11162%
11163%    o wand: the magick wand.
11164%
11165%    o type: the statistic type (e.g. median, mode, etc.).
11166%
11167%    o width: the width of the pixel neighborhood.
11168%
11169%    o height: the height of the pixel neighborhood.
11170%
11171*/
11172WandExport MagickBooleanType MagickStatisticImage(MagickWand *wand,
11173  const StatisticType type,const size_t width,const size_t height)
11174{
11175  Image
11176    *statistic_image;
11177
11178  assert(wand != (MagickWand *) NULL);
11179  assert(wand->signature == WandSignature);
11180  if (IfMagickTrue(wand->debug))
11181    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11182  if (wand->images == (Image *) NULL)
11183    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11184  statistic_image=StatisticImage(wand->images,type,width,height,
11185    wand->exception);
11186  if (statistic_image == (Image *) NULL)
11187    return(MagickFalse);
11188  ReplaceImageInList(&wand->images,statistic_image);
11189  return(MagickTrue);
11190}
11191
11192/*
11193%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11194%                                                                             %
11195%                                                                             %
11196%                                                                             %
11197%   M a g i c k S t e g a n o I m a g e                                       %
11198%                                                                             %
11199%                                                                             %
11200%                                                                             %
11201%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11202%
11203%  MagickSteganoImage() hides a digital watermark within the image.
11204%  Recover the hidden watermark later to prove that the authenticity of
11205%  an image.  Offset defines the start position within the image to hide
11206%  the watermark.
11207%
11208%  The format of the MagickSteganoImage method is:
11209%
11210%      MagickWand *MagickSteganoImage(MagickWand *wand,
11211%        const MagickWand *watermark_wand,const ssize_t offset)
11212%
11213%  A description of each parameter follows:
11214%
11215%    o wand: the magick wand.
11216%
11217%    o watermark_wand: the watermark wand.
11218%
11219%    o offset: Start hiding at this offset into the image.
11220%
11221*/
11222WandExport MagickWand *MagickSteganoImage(MagickWand *wand,
11223  const MagickWand *watermark_wand,const ssize_t offset)
11224{
11225  Image
11226    *stegano_image;
11227
11228  assert(wand != (MagickWand *) NULL);
11229  assert(wand->signature == WandSignature);
11230  if (IfMagickTrue(wand->debug))
11231    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11232  if ((wand->images == (Image *) NULL) ||
11233      (watermark_wand->images == (Image *) NULL))
11234    {
11235      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11236        "ContainsNoImages","`%s'",wand->name);
11237      return((MagickWand *) NULL);
11238    }
11239  wand->images->offset=offset;
11240  stegano_image=SteganoImage(wand->images,watermark_wand->images,
11241    wand->exception);
11242  if (stegano_image == (Image *) NULL)
11243    return((MagickWand *) NULL);
11244  return(CloneMagickWandFromImages(wand,stegano_image));
11245}
11246
11247/*
11248%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11249%                                                                             %
11250%                                                                             %
11251%                                                                             %
11252%   M a g i c k S t e r e o I m a g e                                         %
11253%                                                                             %
11254%                                                                             %
11255%                                                                             %
11256%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11257%
11258%  MagickStereoImage() composites two images and produces a single image that
11259%  is the composite of a left and right image of a stereo pair
11260%
11261%  The format of the MagickStereoImage method is:
11262%
11263%      MagickWand *MagickStereoImage(MagickWand *wand,
11264%        const MagickWand *offset_wand)
11265%
11266%  A description of each parameter follows:
11267%
11268%    o wand: the magick wand.
11269%
11270%    o offset_wand: Another image wand.
11271%
11272*/
11273WandExport MagickWand *MagickStereoImage(MagickWand *wand,
11274  const MagickWand *offset_wand)
11275{
11276  Image
11277    *stereo_image;
11278
11279  assert(wand != (MagickWand *) NULL);
11280  assert(wand->signature == WandSignature);
11281  if (IfMagickTrue(wand->debug))
11282    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11283  if ((wand->images == (Image *) NULL) ||
11284      (offset_wand->images == (Image *) NULL))
11285    {
11286      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11287        "ContainsNoImages","`%s'",wand->name);
11288      return((MagickWand *) NULL);
11289    }
11290  stereo_image=StereoImage(wand->images,offset_wand->images,wand->exception);
11291  if (stereo_image == (Image *) NULL)
11292    return((MagickWand *) NULL);
11293  return(CloneMagickWandFromImages(wand,stereo_image));
11294}
11295
11296/*
11297%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11298%                                                                             %
11299%                                                                             %
11300%                                                                             %
11301%   M a g i c k S t r i p I m a g e                                           %
11302%                                                                             %
11303%                                                                             %
11304%                                                                             %
11305%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11306%
11307%  MagickStripImage() strips an image of all profiles and comments.
11308%
11309%  The format of the MagickStripImage method is:
11310%
11311%      MagickBooleanType MagickStripImage(MagickWand *wand)
11312%
11313%  A description of each parameter follows:
11314%
11315%    o wand: the magick wand.
11316%
11317*/
11318WandExport MagickBooleanType MagickStripImage(MagickWand *wand)
11319{
11320  assert(wand != (MagickWand *) NULL);
11321  assert(wand->signature == WandSignature);
11322  if (IfMagickTrue(wand->debug))
11323    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11324  if (wand->images == (Image *) NULL)
11325    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11326  return(StripImage(wand->images,wand->exception));
11327}
11328
11329/*
11330%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11331%                                                                             %
11332%                                                                             %
11333%                                                                             %
11334%   M a g i c k S w i r l I m a g e                                           %
11335%                                                                             %
11336%                                                                             %
11337%                                                                             %
11338%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11339%
11340%  MagickSwirlImage() swirls the pixels about the center of the image, where
11341%  degrees indicates the sweep of the arc through which each pixel is moved.
11342%  You get a more dramatic effect as the degrees move from 1 to 360.
11343%
11344%  The format of the MagickSwirlImage method is:
11345%
11346%      MagickBooleanType MagickSwirlImage(MagickWand *wand,const double degrees,
11347%        const PixelInterpolateMethod method)
11348%
11349%  A description of each parameter follows:
11350%
11351%    o wand: the magick wand.
11352%
11353%    o degrees: Define the tightness of the swirling effect.
11354%
11355%    o method: the pixel interpolation method.
11356%
11357*/
11358WandExport MagickBooleanType MagickSwirlImage(MagickWand *wand,
11359  const double degrees,const PixelInterpolateMethod method)
11360{
11361  Image
11362    *swirl_image;
11363
11364  assert(wand != (MagickWand *) NULL);
11365  assert(wand->signature == WandSignature);
11366  if (IfMagickTrue(wand->debug))
11367    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11368  if (wand->images == (Image *) NULL)
11369    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11370  swirl_image=SwirlImage(wand->images,degrees,method,wand->exception);
11371  if (swirl_image == (Image *) NULL)
11372    return(MagickFalse);
11373  ReplaceImageInList(&wand->images,swirl_image);
11374  return(MagickTrue);
11375}
11376
11377/*
11378%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11379%                                                                             %
11380%                                                                             %
11381%                                                                             %
11382%   M a g i c k T e x t u r e I m a g e                                       %
11383%                                                                             %
11384%                                                                             %
11385%                                                                             %
11386%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11387%
11388%  MagickTextureImage() repeatedly tiles the texture image across and down the
11389%  image canvas.
11390%
11391%  The format of the MagickTextureImage method is:
11392%
11393%      MagickWand *MagickTextureImage(MagickWand *wand,
11394%        const MagickWand *texture_wand)
11395%
11396%  A description of each parameter follows:
11397%
11398%    o wand: the magick wand.
11399%
11400%    o texture_wand: the texture wand
11401%
11402*/
11403WandExport MagickWand *MagickTextureImage(MagickWand *wand,
11404  const MagickWand *texture_wand)
11405{
11406  Image
11407    *texture_image;
11408
11409  MagickBooleanType
11410    status;
11411
11412  assert(wand != (MagickWand *) NULL);
11413  assert(wand->signature == WandSignature);
11414  if (IfMagickTrue(wand->debug))
11415    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11416  if ((wand->images == (Image *) NULL) ||
11417      (texture_wand->images == (Image *) NULL))
11418    {
11419      (void) ThrowMagickException(wand->exception,GetMagickModule(),WandError,
11420        "ContainsNoImages","`%s'",wand->name);
11421      return((MagickWand *) NULL);
11422    }
11423  texture_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
11424  if (texture_image == (Image *) NULL)
11425    return((MagickWand *) NULL);
11426  status=TextureImage(texture_image,texture_wand->images,wand->exception);
11427  if (IfMagickFalse(status))
11428    {
11429      texture_image=DestroyImage(texture_image);
11430      return((MagickWand *) NULL);
11431    }
11432  return(CloneMagickWandFromImages(wand,texture_image));
11433}
11434
11435/*
11436%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11437%                                                                             %
11438%                                                                             %
11439%                                                                             %
11440%   M a g i c k T h r e s h o l d I m a g e                                   %
11441%                                                                             %
11442%                                                                             %
11443%                                                                             %
11444%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11445%
11446%  MagickThresholdImage() changes the value of individual pixels based on
11447%  the intensity of each pixel compared to threshold.  The result is a
11448%  high-contrast, two color image.
11449%
11450%  The format of the MagickThresholdImage method is:
11451%
11452%      MagickBooleanType MagickThresholdImage(MagickWand *wand,
11453%        const double threshold)
11454%      MagickBooleanType MagickThresholdImageChannel(MagickWand *wand,
11455%        const ChannelType channel,const double threshold)
11456%
11457%  A description of each parameter follows:
11458%
11459%    o wand: the magick wand.
11460%
11461%    o channel: the image channel(s).
11462%
11463%    o threshold: Define the threshold value.
11464%
11465*/
11466WandExport MagickBooleanType MagickThresholdImage(MagickWand *wand,
11467  const double threshold)
11468{
11469  MagickBooleanType
11470    status;
11471
11472  status=MagickThresholdImageChannel(wand,DefaultChannels,threshold);
11473  return(status);
11474}
11475
11476WandExport MagickBooleanType MagickThresholdImageChannel(MagickWand *wand,
11477  const ChannelType channel,const double threshold)
11478{
11479  MagickBooleanType
11480    status;
11481
11482  assert(wand != (MagickWand *) NULL);
11483  assert(wand->signature == WandSignature);
11484  if (IfMagickTrue(wand->debug))
11485    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11486  if (wand->images == (Image *) NULL)
11487    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11488  status=BilevelImage(wand->images,threshold,wand->exception);
11489  return(status);
11490}
11491
11492/*
11493%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11494%                                                                             %
11495%                                                                             %
11496%                                                                             %
11497%   M a g i c k T h u m b n a i l I m a g e                                   %
11498%                                                                             %
11499%                                                                             %
11500%                                                                             %
11501%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11502%
11503%  MagickThumbnailImage()  changes the size of an image to the given dimensions
11504%  and removes any associated profiles.  The goal is to produce small low cost
11505%  thumbnail images suited for display on the Web.
11506%
11507%  The format of the MagickThumbnailImage method is:
11508%
11509%      MagickBooleanType MagickThumbnailImage(MagickWand *wand,
11510%        const size_t columns,const size_t rows)
11511%
11512%  A description of each parameter follows:
11513%
11514%    o wand: the magick wand.
11515%
11516%    o columns: the number of columns in the scaled image.
11517%
11518%    o rows: the number of rows in the scaled image.
11519%
11520*/
11521WandExport MagickBooleanType MagickThumbnailImage(MagickWand *wand,
11522  const size_t columns,const size_t rows)
11523{
11524  Image
11525    *thumbnail_image;
11526
11527  assert(wand != (MagickWand *) NULL);
11528  assert(wand->signature == WandSignature);
11529  if (IfMagickTrue(wand->debug))
11530    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11531  if (wand->images == (Image *) NULL)
11532    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11533  thumbnail_image=ThumbnailImage(wand->images,columns,rows,wand->exception);
11534  if (thumbnail_image == (Image *) NULL)
11535    return(MagickFalse);
11536  ReplaceImageInList(&wand->images,thumbnail_image);
11537  return(MagickTrue);
11538}
11539
11540/*
11541%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11542%                                                                             %
11543%                                                                             %
11544%                                                                             %
11545%   M a g i c k T i n t I m a g e                                             %
11546%                                                                             %
11547%                                                                             %
11548%                                                                             %
11549%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11550%
11551%  MagickTintImage() applies a color vector to each pixel in the image.  The
11552%  length of the vector is 0 for black and white and at its maximum for the
11553%  midtones.  The vector weighting function is
11554%  f(x)=(1-(4.0*((x-0.5)*(x-0.5)))).
11555%
11556%  The format of the MagickTintImage method is:
11557%
11558%      MagickBooleanType MagickTintImage(MagickWand *wand,
11559%        const PixelWand *tint,const PixelWand *blend)
11560%
11561%  A description of each parameter follows:
11562%
11563%    o wand: the magick wand.
11564%
11565%    o tint: the tint pixel wand.
11566%
11567%    o alpha: the alpha pixel wand.
11568%
11569*/
11570WandExport MagickBooleanType MagickTintImage(MagickWand *wand,
11571  const PixelWand *tint,const PixelWand *blend)
11572{
11573  char
11574    percent_blend[MaxTextExtent];
11575
11576  Image
11577    *tint_image;
11578
11579  PixelInfo
11580    target;
11581
11582  assert(wand != (MagickWand *) NULL);
11583  assert(wand->signature == WandSignature);
11584  if (IfMagickTrue(wand->debug))
11585    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11586  if (wand->images == (Image *) NULL)
11587    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11588  if (wand->images->colorspace != CMYKColorspace)
11589    (void) FormatLocaleString(percent_blend,MaxTextExtent,
11590      "%g,%g,%g,%g",(double) (100.0*QuantumScale*
11591      PixelGetRedQuantum(blend)),(double) (100.0*QuantumScale*
11592      PixelGetGreenQuantum(blend)),(double) (100.0*QuantumScale*
11593      PixelGetBlueQuantum(blend)),(double) (100.0*QuantumScale*
11594      PixelGetAlphaQuantum(blend)));
11595  else
11596    (void) FormatLocaleString(percent_blend,MaxTextExtent,
11597      "%g,%g,%g,%g,%g",(double) (100.0*QuantumScale*
11598      PixelGetCyanQuantum(blend)),(double) (100.0*QuantumScale*
11599      PixelGetMagentaQuantum(blend)),(double) (100.0*QuantumScale*
11600      PixelGetYellowQuantum(blend)),(double) (100.0*QuantumScale*
11601      PixelGetBlackQuantum(blend)),(double) (100.0*QuantumScale*
11602      PixelGetAlphaQuantum(blend)));
11603  target=PixelGetPixel(tint);
11604  tint_image=TintImage(wand->images,percent_blend,&target,wand->exception);
11605  if (tint_image == (Image *) NULL)
11606    return(MagickFalse);
11607  ReplaceImageInList(&wand->images,tint_image);
11608  return(MagickTrue);
11609}
11610
11611/*
11612%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11613%                                                                             %
11614%                                                                             %
11615%                                                                             %
11616%   M a g i c k T r a n s f o r m I m a g e                                   %
11617%                                                                             %
11618%                                                                             %
11619%                                                                             %
11620%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11621%
11622%  MagickTransformImage() is a convenience method that behaves like
11623%  MagickResizeImage() or MagickCropImage() but accepts scaling and/or cropping
11624%  information as a region geometry specification.  If the operation fails,
11625%  a NULL image handle is returned.
11626%
11627%  The format of the MagickTransformImage method is:
11628%
11629%      MagickWand *MagickTransformImage(MagickWand *wand,const char *crop,
11630%        const char *geometry)
11631%
11632%  A description of each parameter follows:
11633%
11634%    o wand: the magick wand.
11635%
11636%    o crop: A crop geometry string.  This geometry defines a subregion of the
11637%      image to crop.
11638%
11639%    o geometry: An image geometry string.  This geometry defines the final
11640%      size of the image.
11641%
11642*/
11643WandExport MagickWand *MagickTransformImage(MagickWand *wand,
11644  const char *crop,const char *geometry)
11645{
11646  Image
11647    *transform_image;
11648
11649  MagickBooleanType
11650    status;
11651
11652  assert(wand != (MagickWand *) NULL);
11653  assert(wand->signature == WandSignature);
11654  if (IfMagickTrue(wand->debug))
11655    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11656  if (wand->images == (Image *) NULL)
11657    return((MagickWand *) NULL);
11658  transform_image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
11659  if (transform_image == (Image *) NULL)
11660    return((MagickWand *) NULL);
11661  status=TransformImage(&transform_image,crop,geometry,wand->exception);
11662  if (IfMagickFalse(status))
11663    {
11664      transform_image=DestroyImage(transform_image);
11665      return((MagickWand *) NULL);
11666    }
11667  return(CloneMagickWandFromImages(wand,transform_image));
11668}
11669
11670/*
11671%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11672%                                                                             %
11673%                                                                             %
11674%                                                                             %
11675%   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               %
11676%                                                                             %
11677%                                                                             %
11678%                                                                             %
11679%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11680%
11681%  MagickTransformImageColorspace() transform the image colorspace, setting
11682%  the images colorspace while transforming the images data to that
11683%  colorspace.
11684%
11685%  The format of the MagickTransformImageColorspace method is:
11686%
11687%      MagickBooleanType MagickTransformImageColorspace(MagickWand *wand,
11688%        const ColorspaceType colorspace)
11689%
11690%  A description of each parameter follows:
11691%
11692%    o wand: the magick wand.
11693%
11694%    o colorspace: the image colorspace:   UndefinedColorspace,
11695%      sRGBColorspace, RGBColorspace, GRAYColorspace,
11696%      OHTAColorspace, XYZColorspace, YCbCrColorspace,
11697%      YCCColorspace, YIQColorspace, YPbPrColorspace,
11698%      YPbPrColorspace, YUVColorspace, CMYKColorspace,
11699%      HSLColorspace, HWBColorspace.
11700%
11701*/
11702WandExport MagickBooleanType MagickTransformImageColorspace(MagickWand *wand,
11703  const ColorspaceType colorspace)
11704{
11705  assert(wand != (MagickWand *) NULL);
11706  assert(wand->signature == WandSignature);
11707  if (IfMagickTrue(wand->debug))
11708    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11709  if (wand->images == (Image *) NULL)
11710    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11711  return(TransformImageColorspace(wand->images,colorspace,wand->exception));
11712}
11713
11714/*
11715%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11716%                                                                             %
11717%                                                                             %
11718%                                                                             %
11719%   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                     %
11720%                                                                             %
11721%                                                                             %
11722%                                                                             %
11723%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11724%
11725%  MagickTransparentPaintImage() changes any pixel that matches color with the
11726%  color defined by fill.
11727%
11728%  The format of the MagickTransparentPaintImage method is:
11729%
11730%      MagickBooleanType MagickTransparentPaintImage(MagickWand *wand,
11731%        const PixelWand *target,const double alpha,const double fuzz,
11732%        const MagickBooleanType invert)
11733%
11734%  A description of each parameter follows:
11735%
11736%    o wand: the magick wand.
11737%
11738%    o target: Change this target color to specified alpha value within
11739%      the image.
11740%
11741%    o alpha: the level of transparency: 1.0 is fully opaque and 0.0 is fully
11742%      transparent.
11743%
11744%    o fuzz: By default target must match a particular pixel color
11745%      exactly.  However, in many cases two colors may differ by a small amount.
11746%      The fuzz member of image defines how much tolerance is acceptable to
11747%      consider two colors as the same.  For example, set fuzz to 10 and the
11748%      color red at intensities of 100 and 102 respectively are now interpreted
11749%      as the same color for the purposes of the floodfill.
11750%
11751%    o invert: paint any pixel that does not match the target color.
11752%
11753*/
11754WandExport MagickBooleanType MagickTransparentPaintImage(MagickWand *wand,
11755  const PixelWand *target,const double alpha,const double fuzz,
11756  const MagickBooleanType invert)
11757{
11758  MagickBooleanType
11759    status;
11760
11761  PixelInfo
11762    target_pixel;
11763
11764  assert(wand != (MagickWand *) NULL);
11765  assert(wand->signature == WandSignature);
11766  if (IfMagickTrue(wand->debug))
11767    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11768  if (wand->images == (Image *) NULL)
11769    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11770  PixelGetMagickColor(target,&target_pixel);
11771  wand->images->fuzz=fuzz;
11772  status=TransparentPaintImage(wand->images,&target_pixel,ClampToQuantum(
11773    QuantumRange*alpha),invert,wand->exception);
11774  return(status);
11775}
11776
11777/*
11778%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11779%                                                                             %
11780%                                                                             %
11781%                                                                             %
11782%   M a g i c k T r a n s p o s e I m a g e                                   %
11783%                                                                             %
11784%                                                                             %
11785%                                                                             %
11786%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11787%
11788%  MagickTransposeImage() creates a vertical mirror image by reflecting the
11789%  pixels around the central x-axis while rotating them 90-degrees.
11790%
11791%  The format of the MagickTransposeImage method is:
11792%
11793%      MagickBooleanType MagickTransposeImage(MagickWand *wand)
11794%
11795%  A description of each parameter follows:
11796%
11797%    o wand: the magick wand.
11798%
11799*/
11800WandExport MagickBooleanType MagickTransposeImage(MagickWand *wand)
11801{
11802  Image
11803    *transpose_image;
11804
11805  assert(wand != (MagickWand *) NULL);
11806  assert(wand->signature == WandSignature);
11807  if (IfMagickTrue(wand->debug))
11808    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11809  if (wand->images == (Image *) NULL)
11810    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11811  transpose_image=TransposeImage(wand->images,wand->exception);
11812  if (transpose_image == (Image *) NULL)
11813    return(MagickFalse);
11814  ReplaceImageInList(&wand->images,transpose_image);
11815  return(MagickTrue);
11816}
11817
11818/*
11819%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11820%                                                                             %
11821%                                                                             %
11822%                                                                             %
11823%   M a g i c k T r a n s v e r s e I m a g e                                 %
11824%                                                                             %
11825%                                                                             %
11826%                                                                             %
11827%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11828%
11829%  MagickTransverseImage() creates a horizontal mirror image by reflecting the
11830%  pixels around the central y-axis while rotating them 270-degrees.
11831%
11832%  The format of the MagickTransverseImage method is:
11833%
11834%      MagickBooleanType MagickTransverseImage(MagickWand *wand)
11835%
11836%  A description of each parameter follows:
11837%
11838%    o wand: the magick wand.
11839%
11840*/
11841WandExport MagickBooleanType MagickTransverseImage(MagickWand *wand)
11842{
11843  Image
11844    *transverse_image;
11845
11846  assert(wand != (MagickWand *) NULL);
11847  assert(wand->signature == WandSignature);
11848  if (IfMagickTrue(wand->debug))
11849    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11850  if (wand->images == (Image *) NULL)
11851    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11852  transverse_image=TransverseImage(wand->images,wand->exception);
11853  if (transverse_image == (Image *) NULL)
11854    return(MagickFalse);
11855  ReplaceImageInList(&wand->images,transverse_image);
11856  return(MagickTrue);
11857}
11858
11859/*
11860%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11861%                                                                             %
11862%                                                                             %
11863%                                                                             %
11864%   M a g i c k T r i m I m a g e                                             %
11865%                                                                             %
11866%                                                                             %
11867%                                                                             %
11868%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11869%
11870%  MagickTrimImage() remove edges that are the background color from the image.
11871%
11872%  The format of the MagickTrimImage method is:
11873%
11874%      MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz)
11875%
11876%  A description of each parameter follows:
11877%
11878%    o wand: the magick wand.
11879%
11880%    o fuzz: By default target must match a particular pixel color
11881%      exactly.  However, in many cases two colors may differ by a small amount.
11882%      The fuzz member of image defines how much tolerance is acceptable to
11883%      consider two colors as the same.  For example, set fuzz to 10 and the
11884%      color red at intensities of 100 and 102 respectively are now interpreted
11885%      as the same color for the purposes of the floodfill.
11886%
11887*/
11888WandExport MagickBooleanType MagickTrimImage(MagickWand *wand,const double fuzz)
11889{
11890  Image
11891    *trim_image;
11892
11893  assert(wand != (MagickWand *) NULL);
11894  assert(wand->signature == WandSignature);
11895  if (IfMagickTrue(wand->debug))
11896    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11897  if (wand->images == (Image *) NULL)
11898    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11899  wand->images->fuzz=fuzz;
11900  trim_image=TrimImage(wand->images,wand->exception);
11901  if (trim_image == (Image *) NULL)
11902    return(MagickFalse);
11903  ReplaceImageInList(&wand->images,trim_image);
11904  return(MagickTrue);
11905}
11906
11907/*
11908%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11909%                                                                             %
11910%                                                                             %
11911%                                                                             %
11912%   M a g i c k U n i q u e I m a g e C o l o r s                             %
11913%                                                                             %
11914%                                                                             %
11915%                                                                             %
11916%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11917%
11918%  MagickUniqueImageColors() discards all but one of any pixel color.
11919%
11920%  The format of the MagickUniqueImageColors method is:
11921%
11922%      MagickBooleanType MagickUniqueImageColors(MagickWand *wand)
11923%
11924%  A description of each parameter follows:
11925%
11926%    o wand: the magick wand.
11927%
11928*/
11929WandExport MagickBooleanType MagickUniqueImageColors(MagickWand *wand)
11930{
11931  Image
11932    *unique_image;
11933
11934  assert(wand != (MagickWand *) NULL);
11935  assert(wand->signature == WandSignature);
11936  if (IfMagickTrue(wand->debug))
11937    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11938  if (wand->images == (Image *) NULL)
11939    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11940  unique_image=UniqueImageColors(wand->images,wand->exception);
11941  if (unique_image == (Image *) NULL)
11942    return(MagickFalse);
11943  ReplaceImageInList(&wand->images,unique_image);
11944  return(MagickTrue);
11945}
11946
11947/*
11948%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11949%                                                                             %
11950%                                                                             %
11951%                                                                             %
11952%   M a g i c k U n s h a r p M a s k I m a g e                               %
11953%                                                                             %
11954%                                                                             %
11955%                                                                             %
11956%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11957%
11958%  MagickUnsharpMaskImage() sharpens an image.  We convolve the image with a
11959%  Gaussian operator of the given radius and standard deviation (sigma).
11960%  For reasonable results, radius should be larger than sigma.  Use a radius
11961%  of 0 and UnsharpMaskImage() selects a suitable radius for you.
11962%
11963%  The format of the MagickUnsharpMaskImage method is:
11964%
11965%      MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
11966%        const double radius,const double sigma,const double gain,
11967%        const double threshold)
11968%
11969%  A description of each parameter follows:
11970%
11971%    o wand: the magick wand.
11972%
11973%    o radius: the radius of the Gaussian, in pixels, not counting the center
11974%      pixel.
11975%
11976%    o sigma: the standard deviation of the Gaussian, in pixels.
11977%
11978%    o gain: the percentage of the difference between the original and the
11979%      blur image that is added back into the original.
11980%
11981%    o threshold: the threshold in pixels needed to apply the diffence gain.
11982%
11983*/
11984WandExport MagickBooleanType MagickUnsharpMaskImage(MagickWand *wand,
11985  const double radius,const double sigma,const double gain,
11986  const double threshold)
11987{
11988  Image
11989    *unsharp_image;
11990
11991  assert(wand != (MagickWand *) NULL);
11992  assert(wand->signature == WandSignature);
11993  if (IfMagickTrue(wand->debug))
11994    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
11995  if (wand->images == (Image *) NULL)
11996    ThrowWandException(WandError,"ContainsNoImages",wand->name);
11997  unsharp_image=UnsharpMaskImage(wand->images,radius,sigma,gain,threshold,
11998    wand->exception);
11999  if (unsharp_image == (Image *) NULL)
12000    return(MagickFalse);
12001  ReplaceImageInList(&wand->images,unsharp_image);
12002  return(MagickTrue);
12003}
12004
12005/*
12006%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12007%                                                                             %
12008%                                                                             %
12009%                                                                             %
12010%   M a g i c k V i g n e t t e I m a g e                                     %
12011%                                                                             %
12012%                                                                             %
12013%                                                                             %
12014%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12015%
12016%  MagickVignetteImage() softens the edges of the image in vignette style.
12017%
12018%  The format of the MagickVignetteImage method is:
12019%
12020%      MagickBooleanType MagickVignetteImage(MagickWand *wand,
12021%        const double radius,const double sigma,const ssize_t x,
12022%        const ssize_t y)
12023%
12024%  A description of each parameter follows:
12025%
12026%    o wand: the magick wand.
12027%
12028%    o radius: the radius.
12029%
12030%    o sigma: the sigma.
12031%
12032%    o x, y:  Define the x and y ellipse offset.
12033%
12034*/
12035WandExport MagickBooleanType MagickVignetteImage(MagickWand *wand,
12036  const double radius,const double sigma,const ssize_t x,const ssize_t y)
12037{
12038  Image
12039    *vignette_image;
12040
12041  assert(wand != (MagickWand *) NULL);
12042  assert(wand->signature == WandSignature);
12043  if (IfMagickTrue(wand->debug))
12044    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12045  if (wand->images == (Image *) NULL)
12046    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12047  vignette_image=VignetteImage(wand->images,radius,sigma,x,y,wand->exception);
12048  if (vignette_image == (Image *) NULL)
12049    return(MagickFalse);
12050  ReplaceImageInList(&wand->images,vignette_image);
12051  return(MagickTrue);
12052}
12053
12054/*
12055%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12056%                                                                             %
12057%                                                                             %
12058%                                                                             %
12059%   M a g i c k W a v e I m a g e                                             %
12060%                                                                             %
12061%                                                                             %
12062%                                                                             %
12063%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12064%
12065%  MagickWaveImage()  creates a "ripple" effect in the image by shifting
12066%  the pixels vertically along a sine wave whose amplitude and wavelength
12067%  is specified by the given parameters.
12068%
12069%  The format of the MagickWaveImage method is:
12070%
12071%      MagickBooleanType MagickWaveImage(MagickWand *wand,
12072%        const double amplitude,const double wave_length,
12073%        const PixelInterpolateMethod method)
12074%
12075%  A description of each parameter follows:
12076%
12077%    o wand: the magick wand.
12078%
12079%    o amplitude, wave_length:  Define the amplitude and wave length of the
12080%      sine wave.
12081%
12082%    o method: the pixel interpolation method.
12083%
12084*/
12085WandExport MagickBooleanType MagickWaveImage(MagickWand *wand,
12086  const double amplitude,const double wave_length,
12087  const PixelInterpolateMethod method)
12088{
12089  Image
12090    *wave_image;
12091
12092  assert(wand != (MagickWand *) NULL);
12093  assert(wand->signature == WandSignature);
12094  if (IfMagickTrue(wand->debug))
12095    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12096  if (wand->images == (Image *) NULL)
12097    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12098  wave_image=WaveImage(wand->images,amplitude,wave_length,method,
12099    wand->exception);
12100  if (wave_image == (Image *) NULL)
12101    return(MagickFalse);
12102  ReplaceImageInList(&wand->images,wave_image);
12103  return(MagickTrue);
12104}
12105
12106/*
12107%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12108%                                                                             %
12109%                                                                             %
12110%                                                                             %
12111%   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                         %
12112%                                                                             %
12113%                                                                             %
12114%                                                                             %
12115%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12116%
12117%  MagickWhiteThresholdImage() is like ThresholdImage() but  force all pixels
12118%  above the threshold into white while leaving all pixels below the threshold
12119%  unchanged.
12120%
12121%  The format of the MagickWhiteThresholdImage method is:
12122%
12123%      MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand,
12124%        const PixelWand *threshold)
12125%
12126%  A description of each parameter follows:
12127%
12128%    o wand: the magick wand.
12129%
12130%    o threshold: the pixel wand.
12131%
12132*/
12133WandExport MagickBooleanType MagickWhiteThresholdImage(MagickWand *wand,
12134  const PixelWand *threshold)
12135{
12136  char
12137    thresholds[MaxTextExtent];
12138
12139  assert(wand != (MagickWand *) NULL);
12140  assert(wand->signature == WandSignature);
12141  if (IfMagickTrue(wand->debug))
12142    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12143  if (wand->images == (Image *) NULL)
12144    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12145  (void) FormatLocaleString(thresholds,MaxTextExtent,
12146    QuantumFormat "," QuantumFormat "," QuantumFormat "," QuantumFormat,
12147    PixelGetRedQuantum(threshold),PixelGetGreenQuantum(threshold),
12148    PixelGetBlueQuantum(threshold),PixelGetAlphaQuantum(threshold));
12149  return(WhiteThresholdImage(wand->images,thresholds,wand->exception));
12150}
12151
12152/*
12153%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12154%                                                                             %
12155%                                                                             %
12156%                                                                             %
12157%   M a g i c k W r i t e I m a g e                                           %
12158%                                                                             %
12159%                                                                             %
12160%                                                                             %
12161%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12162%
12163%  MagickWriteImage() writes an image to the specified filename.  If the
12164%  filename parameter is NULL, the image is written to the filename set
12165%  by MagickReadImage() or MagickSetImageFilename().
12166%
12167%  The format of the MagickWriteImage method is:
12168%
12169%      MagickBooleanType MagickWriteImage(MagickWand *wand,
12170%        const char *filename)
12171%
12172%  A description of each parameter follows:
12173%
12174%    o wand: the magick wand.
12175%
12176%    o filename: the image filename.
12177%
12178%
12179*/
12180WandExport MagickBooleanType MagickWriteImage(MagickWand *wand,
12181  const char *filename)
12182{
12183  Image
12184    *image;
12185
12186  ImageInfo
12187    *write_info;
12188
12189  MagickBooleanType
12190    status;
12191
12192  assert(wand != (MagickWand *) NULL);
12193  assert(wand->signature == WandSignature);
12194  if (IfMagickTrue(wand->debug))
12195    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12196  if (wand->images == (Image *) NULL)
12197    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12198  if (filename != (const char *) NULL)
12199    (void) CopyMagickString(wand->images->filename,filename,MaxTextExtent);
12200  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
12201  if (image == (Image *) NULL)
12202    return(MagickFalse);
12203  write_info=CloneImageInfo(wand->image_info);
12204  write_info->adjoin=MagickTrue;
12205  status=WriteImage(write_info,image,wand->exception);
12206  image=DestroyImage(image);
12207  write_info=DestroyImageInfo(write_info);
12208  return(status);
12209}
12210
12211/*
12212%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12213%                                                                             %
12214%                                                                             %
12215%                                                                             %
12216%   M a g i c k W r i t e I m a g e F i l e                                   %
12217%                                                                             %
12218%                                                                             %
12219%                                                                             %
12220%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12221%
12222%  MagickWriteImageFile() writes an image to an open file descriptor.
12223%
12224%  The format of the MagickWriteImageFile method is:
12225%
12226%      MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file)
12227%
12228%  A description of each parameter follows:
12229%
12230%    o wand: the magick wand.
12231%
12232%    o file: the file descriptor.
12233%
12234*/
12235WandExport MagickBooleanType MagickWriteImageFile(MagickWand *wand,FILE *file)
12236{
12237  Image
12238    *image;
12239
12240  ImageInfo
12241    *write_info;
12242
12243  MagickBooleanType
12244    status;
12245
12246  assert(wand != (MagickWand *) NULL);
12247  assert(wand->signature == WandSignature);
12248  assert(file != (FILE *) NULL);
12249  if (IfMagickTrue(wand->debug))
12250    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12251  if (wand->images == (Image *) NULL)
12252    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12253  image=CloneImage(wand->images,0,0,MagickTrue,wand->exception);
12254  if (image == (Image *) NULL)
12255    return(MagickFalse);
12256  write_info=CloneImageInfo(wand->image_info);
12257  SetImageInfoFile(write_info,file);
12258  write_info->adjoin=MagickTrue;
12259  status=WriteImage(write_info,image,wand->exception);
12260  write_info=DestroyImageInfo(write_info);
12261  image=DestroyImage(image);
12262  return(status);
12263}
12264
12265/*
12266%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12267%                                                                             %
12268%                                                                             %
12269%                                                                             %
12270%   M a g i c k W r i t e I m a g e s                                         %
12271%                                                                             %
12272%                                                                             %
12273%                                                                             %
12274%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12275%
12276%  MagickWriteImages() writes an image or image sequence.
12277%
12278%  The format of the MagickWriteImages method is:
12279%
12280%      MagickBooleanType MagickWriteImages(MagickWand *wand,
12281%        const char *filename,const MagickBooleanType adjoin)
12282%
12283%  A description of each parameter follows:
12284%
12285%    o wand: the magick wand.
12286%
12287%    o filename: the image filename.
12288%
12289%    o adjoin: join images into a single multi-image file.
12290%
12291*/
12292WandExport MagickBooleanType MagickWriteImages(MagickWand *wand,
12293  const char *filename,const MagickBooleanType adjoin)
12294{
12295  ImageInfo
12296    *write_info;
12297
12298  MagickBooleanType
12299    status;
12300
12301  assert(wand != (MagickWand *) NULL);
12302  assert(wand->signature == WandSignature);
12303  if (IfMagickTrue(wand->debug))
12304    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12305  if (wand->images == (Image *) NULL)
12306    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12307  write_info=CloneImageInfo(wand->image_info);
12308  write_info->adjoin=adjoin;
12309  status=WriteImages(write_info,wand->images,filename,wand->exception);
12310  write_info=DestroyImageInfo(write_info);
12311  return(status);
12312}
12313
12314/*
12315%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12316%                                                                             %
12317%                                                                             %
12318%                                                                             %
12319%   M a g i c k W r i t e I m a g e s F i l e                                 %
12320%                                                                             %
12321%                                                                             %
12322%                                                                             %
12323%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12324%
12325%  MagickWriteImagesFile() writes an image sequence to an open file descriptor.
12326%
12327%  The format of the MagickWriteImagesFile method is:
12328%
12329%      MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file)
12330%
12331%  A description of each parameter follows:
12332%
12333%    o wand: the magick wand.
12334%
12335%    o file: the file descriptor.
12336%
12337*/
12338WandExport MagickBooleanType MagickWriteImagesFile(MagickWand *wand,FILE *file)
12339{
12340  ImageInfo
12341    *write_info;
12342
12343  MagickBooleanType
12344    status;
12345
12346  assert(wand != (MagickWand *) NULL);
12347  assert(wand->signature == WandSignature);
12348  if (IfMagickTrue(wand->debug))
12349    (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
12350  if (wand->images == (Image *) NULL)
12351    ThrowWandException(WandError,"ContainsNoImages",wand->name);
12352  write_info=CloneImageInfo(wand->image_info);
12353  SetImageInfoFile(write_info,file);
12354  write_info->adjoin=MagickTrue;
12355  status=WriteImages(write_info,wand->images,(const char *) NULL,
12356    wand->exception);
12357  write_info=DestroyImageInfo(write_info);
12358  return(status);
12359}
12360