42 #include "magick/studio.h" 43 #include "magick/attribute.h" 44 #include "magick/cache.h" 45 #include "magick/cache-view.h" 46 #include "magick/color.h" 47 #include "magick/color-private.h" 48 #include "magick/colorspace-private.h" 49 #include "magick/composite.h" 50 #include "magick/distort.h" 51 #include "magick/draw.h" 52 #include "magick/effect.h" 53 #include "magick/exception.h" 54 #include "magick/exception-private.h" 55 #include "magick/geometry.h" 56 #include "magick/image.h" 57 #include "magick/memory_.h" 58 #include "magick/layer.h" 59 #include "magick/list.h" 60 #include "magick/monitor.h" 61 #include "magick/monitor-private.h" 62 #include "magick/pixel-private.h" 63 #include "magick/property.h" 64 #include "magick/resource_.h" 65 #include "magick/resize.h" 66 #include "magick/statistic.h" 67 #include "magick/string_.h" 68 #include "magick/thread-private.h" 69 #include "magick/transform.h" 99 MagickExport
Image *AutoOrientImage(
const Image *image,
105 assert(image != (
const Image *) NULL);
106 assert(image->signature == MagickCoreSignature);
108 assert(exception->signature == MagickCoreSignature);
109 orient_image=(
Image *) NULL;
112 case UndefinedOrientation:
113 case TopLeftOrientation:
116 orient_image=CloneImage(image,0,0,MagickTrue,exception);
119 case TopRightOrientation:
121 orient_image=FlopImage(image,exception);
124 case BottomRightOrientation:
126 orient_image=RotateImage(image,180.0,exception);
129 case BottomLeftOrientation:
131 orient_image=FlipImage(image,exception);
134 case LeftTopOrientation:
136 orient_image=TransposeImage(image,exception);
139 case RightTopOrientation:
141 orient_image=RotateImage(image,90.0,exception);
144 case RightBottomOrientation:
146 orient_image=TransverseImage(image,exception);
149 case LeftBottomOrientation:
151 orient_image=RotateImage(image,270.0,exception);
155 if (orient_image != (
Image *) NULL)
156 orient_image->orientation=TopLeftOrientation;
157 return(orient_image);
191 #define ChopImageTag "Chop/Image" 215 assert(image != (
const Image *) NULL);
216 assert(image->signature == MagickCoreSignature);
218 assert(exception->signature == MagickCoreSignature);
220 if (IsEventLogging() != MagickFalse)
221 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
222 if (((chop_info->x+(ssize_t) chop_info->width) < 0) ||
223 ((chop_info->y+(ssize_t) chop_info->height) < 0) ||
224 (chop_info->x > (ssize_t) image->columns) ||
225 (chop_info->y > (ssize_t) image->rows))
226 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
228 if ((extent.x+(ssize_t) extent.width) > (ssize_t) image->columns)
229 extent.width=(size_t) ((ssize_t) image->columns-extent.x);
230 if ((extent.y+(ssize_t) extent.height) > (ssize_t) image->rows)
231 extent.height=(size_t) ((ssize_t) image->rows-extent.y);
234 extent.width-=(size_t) (-extent.x);
239 extent.height-=(size_t) (-extent.y);
242 if ((extent.width >= image->columns) || (extent.height >= image->rows))
243 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
244 chop_image=CloneImage(image,image->columns-extent.width,image->rows-
245 extent.height,MagickTrue,exception);
246 if (chop_image == (
Image *) NULL)
247 return((
Image *) NULL);
253 image_view=AcquireVirtualCacheView(image,exception);
254 chop_view=AcquireAuthenticCacheView(chop_image,exception);
255 #if defined(MAGICKCORE_OPENMP_SUPPORT) 256 #pragma omp parallel for schedule(static) shared(status) \ 257 magick_number_threads(image,chop_image,extent.y,2) 259 for (y=0; y < (ssize_t) extent.y; y++)
265 *magick_restrict chop_indexes,
266 *magick_restrict indexes;
274 if (status == MagickFalse)
276 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
277 q=QueueCacheViewAuthenticPixels(chop_view,0,y,chop_image->columns,1,
284 indexes=GetCacheViewAuthenticIndexQueue(image_view);
285 chop_indexes=GetCacheViewAuthenticIndexQueue(chop_view);
286 for (x=0; x < (ssize_t) image->columns; x++)
288 if ((x < extent.x) || (x >= (ssize_t) (extent.x+extent.width)))
291 if (indexes != (IndexPacket *) NULL)
293 if (chop_indexes != (IndexPacket *) NULL)
294 *chop_indexes++=GetPixelIndex(indexes+x);
300 if (SyncCacheViewAuthenticPixels(chop_view,exception) == MagickFalse)
302 if (image->progress_monitor != (MagickProgressMonitor) NULL)
307 #if defined(MAGICKCORE_OPENMP_SUPPORT) 311 proceed=SetImageProgress(image,ChopImageTag,progress,image->rows);
312 if (proceed == MagickFalse)
319 #if defined(MAGICKCORE_OPENMP_SUPPORT) 320 #pragma omp parallel for schedule(static) shared(status) \ 321 magick_number_threads(image,image,image->rows,2) 323 for (y=0; y < (ssize_t) (image->rows-(extent.y+extent.height)); y++)
329 *magick_restrict chop_indexes,
330 *magick_restrict indexes;
338 if (status == MagickFalse)
340 p=GetCacheViewVirtualPixels(image_view,0,extent.y+extent.height+y,
341 image->columns,1,exception);
342 q=QueueCacheViewAuthenticPixels(chop_view,0,extent.y+y,chop_image->columns,
349 indexes=GetCacheViewAuthenticIndexQueue(image_view);
350 chop_indexes=GetCacheViewAuthenticIndexQueue(chop_view);
351 for (x=0; x < (ssize_t) image->columns; x++)
353 if ((x < extent.x) || (x >= (ssize_t) (extent.x+extent.width)))
356 if (indexes != (IndexPacket *) NULL)
358 if (chop_indexes != (IndexPacket *) NULL)
359 *chop_indexes++=GetPixelIndex(indexes+x);
365 if (SyncCacheViewAuthenticPixels(chop_view,exception) == MagickFalse)
367 if (image->progress_monitor != (MagickProgressMonitor) NULL)
372 #if defined(MAGICKCORE_OPENMP_SUPPORT) 376 proceed=SetImageProgress(image,ChopImageTag,progress,image->rows);
377 if (proceed == MagickFalse)
381 chop_view=DestroyCacheView(chop_view);
382 image_view=DestroyCacheView(image_view);
383 chop_image->type=image->type;
384 if (status == MagickFalse)
385 chop_image=DestroyImage(chop_image);
414 MagickExport
Image *ConsolidateCMYKImages(
const Image *images,
434 assert(images != (
Image *) NULL);
435 assert(images->signature == MagickCoreSignature);
437 assert(exception->signature == MagickCoreSignature);
438 if (IsEventLogging() != MagickFalse)
439 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",images->filename);
440 cmyk_images=NewImageList();
441 for (i=0; i < (ssize_t) GetImageListLength(images); i+=4)
443 cmyk_image=CloneImage(images,0,0,MagickTrue,exception);
444 if (cmyk_image == (
Image *) NULL)
446 if (SetImageStorageClass(cmyk_image,DirectClass) == MagickFalse)
448 (void) SetImageColorspace(cmyk_image,CMYKColorspace);
449 image_view=AcquireVirtualCacheView(images,exception);
450 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
451 for (y=0; y < (ssize_t) images->rows; y++)
462 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
463 q=QueueCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
467 for (x=0; x < (ssize_t) images->columns; x++)
469 SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange-
470 GetPixelIntensity(images,p)));
474 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
477 cmyk_view=DestroyCacheView(cmyk_view);
478 image_view=DestroyCacheView(image_view);
479 images=GetNextImageInList(images);
480 if (images == (
Image *) NULL)
482 image_view=AcquireVirtualCacheView(images,exception);
483 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
484 for (y=0; y < (ssize_t) images->rows; y++)
495 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
496 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
500 for (x=0; x < (ssize_t) images->columns; x++)
502 q->green=ClampToQuantum((MagickRealType) QuantumRange-(MagickRealType)
503 GetPixelIntensity(images,p));
507 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
510 cmyk_view=DestroyCacheView(cmyk_view);
511 image_view=DestroyCacheView(image_view);
512 images=GetNextImageInList(images);
513 if (images == (
Image *) NULL)
515 image_view=AcquireVirtualCacheView(images,exception);
516 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
517 for (y=0; y < (ssize_t) images->rows; y++)
528 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
529 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
533 for (x=0; x < (ssize_t) images->columns; x++)
535 q->blue=ClampToQuantum((MagickRealType) QuantumRange-(MagickRealType)
536 GetPixelIntensity(images,p));
540 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
543 cmyk_view=DestroyCacheView(cmyk_view);
544 image_view=DestroyCacheView(image_view);
545 images=GetNextImageInList(images);
546 if (images == (
Image *) NULL)
548 image_view=AcquireVirtualCacheView(images,exception);
549 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
550 for (y=0; y < (ssize_t) images->rows; y++)
556 *magick_restrict indexes;
564 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
565 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
569 indexes=GetCacheViewAuthenticIndexQueue(cmyk_view);
570 for (x=0; x < (ssize_t) images->columns; x++)
572 SetPixelIndex(indexes+x,ClampToQuantum((MagickRealType) QuantumRange-
573 GetPixelIntensity(images,p)));
576 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
579 cmyk_view=DestroyCacheView(cmyk_view);
580 image_view=DestroyCacheView(image_view);
581 AppendImageToList(&cmyk_images,cmyk_image);
582 images=GetNextImageInList(images);
583 if (images == (
Image *) NULL)
622 #define CropImageTag "Crop/Image" 647 assert(image != (
const Image *) NULL);
648 assert(image->signature == MagickCoreSignature);
651 assert(exception->signature == MagickCoreSignature);
652 if (IsEventLogging() != MagickFalse)
653 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
654 bounding_box=image->page;
655 if ((bounding_box.width == 0) || (bounding_box.height == 0))
657 bounding_box.width=image->columns;
658 bounding_box.height=image->rows;
662 page.width=bounding_box.width;
663 if (page.height == 0)
664 page.height=bounding_box.height;
665 if ((((
double) bounding_box.x-page.x) >= (double) page.width) ||
666 (((double) bounding_box.y-page.y) >= (double) page.height) ||
667 (((double) page.x-bounding_box.x) > (double) image->columns) ||
668 (((double) page.y-bounding_box.y) > (double) image->rows))
673 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
674 "GeometryDoesNotContainImage",
"`%s'",image->filename);
675 crop_image=CloneImage(image,1,1,MagickTrue,exception);
676 if (crop_image == (
Image *) NULL)
677 return((
Image *) NULL);
678 crop_image->background_color.opacity=(Quantum) TransparentOpacity;
679 (void) SetImageBackgroundColor(crop_image);
680 crop_image->page=bounding_box;
681 crop_image->page.x=(-1);
682 crop_image->page.y=(-1);
683 if (crop_image->dispose == BackgroundDispose)
684 crop_image->dispose=NoneDispose;
687 if ((page.x < 0) && (bounding_box.x >= 0))
689 page.width+=page.x-bounding_box.x;
694 page.width-=bounding_box.x-page.x;
695 page.x-=bounding_box.x;
699 if ((page.y < 0) && (bounding_box.y >= 0))
701 page.height+=page.y-bounding_box.y;
706 page.height-=bounding_box.y-page.y;
707 page.y-=bounding_box.y;
711 if ((page.x+(ssize_t) page.width) > (ssize_t) image->columns)
712 page.width=image->columns-page.x;
713 if ((geometry->width != 0) && (page.width > geometry->width))
714 page.width=geometry->width;
715 if ((page.y+(ssize_t) page.height) > (ssize_t) image->rows)
716 page.height=image->rows-page.y;
717 if ((geometry->height != 0) && (page.height > geometry->height))
718 page.height=geometry->height;
719 bounding_box.x+=page.x;
720 bounding_box.y+=page.y;
721 if ((page.width == 0) || (page.height == 0))
723 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
724 "GeometryDoesNotContainImage",
"`%s'",image->filename);
725 return((
Image *) NULL);
730 crop_image=CloneImage(image,page.width,page.height,MagickTrue,exception);
731 if (crop_image == (
Image *) NULL)
732 return((
Image *) NULL);
733 crop_image->page.width=image->page.width;
734 crop_image->page.height=image->page.height;
735 if (((ssize_t) (bounding_box.x+bounding_box.width) > (ssize_t) image->page.width) ||
736 ((ssize_t) (bounding_box.y+bounding_box.height) > (ssize_t) image->page.height))
738 crop_image->page.width=bounding_box.width;
739 crop_image->page.height=bounding_box.height;
741 crop_image->page.x=bounding_box.x;
742 crop_image->page.y=bounding_box.y;
748 image_view=AcquireVirtualCacheView(image,exception);
749 crop_view=AcquireAuthenticCacheView(crop_image,exception);
750 #if defined(MAGICKCORE_OPENMP_SUPPORT) 751 #pragma omp parallel for schedule(static) shared(status) \ 752 magick_number_threads(image,crop_image,crop_image->rows,2) 754 for (y=0; y < (ssize_t) crop_image->rows; y++)
757 *magick_restrict indexes;
763 *magick_restrict crop_indexes;
768 if (status == MagickFalse)
770 p=GetCacheViewVirtualPixels(image_view,page.x,page.y+y,crop_image->columns,
772 q=QueueCacheViewAuthenticPixels(crop_view,0,y,crop_image->columns,1,
779 indexes=GetCacheViewVirtualIndexQueue(image_view);
780 crop_indexes=GetCacheViewAuthenticIndexQueue(crop_view);
781 (void) memcpy(q,p,(
size_t) crop_image->columns*
sizeof(*p));
782 if ((indexes != (IndexPacket *) NULL) &&
783 (crop_indexes != (IndexPacket *) NULL))
784 (
void) memcpy(crop_indexes,indexes,(
size_t) crop_image->columns*
785 sizeof(*crop_indexes));
786 if (SyncCacheViewAuthenticPixels(crop_view,exception) == MagickFalse)
788 if (image->progress_monitor != (MagickProgressMonitor) NULL)
793 #if defined(MAGICKCORE_OPENMP_SUPPORT) 797 proceed=SetImageProgress(image,CropImageTag,progress,image->rows);
798 if (proceed == MagickFalse)
802 crop_view=DestroyCacheView(crop_view);
803 image_view=DestroyCacheView(image_view);
804 crop_image->type=image->type;
805 if (status == MagickFalse)
806 crop_image=DestroyImage(crop_image);
838 static inline ssize_t PixelRoundOffset(
double x)
843 if ((x-floor(x)) < (ceil(x)-x))
844 return(CastDoubleToLong(floor(x)));
845 return(CastDoubleToLong(ceil(x)));
848 MagickExport
Image *CropImageToTiles(
const Image *image,
861 assert(image != (
Image *) NULL);
862 assert(image->signature == MagickCoreSignature);
863 if (IsEventLogging() != MagickFalse)
864 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
865 flags=ParseGravityGeometry(image,crop_geometry,&geometry,exception);
866 if ((flags & AreaValue) != 0)
882 crop_image=NewImageList();
883 width=image->columns;
885 if (geometry.width == 0)
887 if (geometry.height == 0)
889 if ((flags & AspectValue) == 0)
891 width-=(geometry.x < 0 ? -1 : 1)*geometry.x;
892 height-=(geometry.y < 0 ? -1 : 1)*geometry.y;
896 width+=(geometry.x < 0 ? -1 : 1)*geometry.x;
897 height+=(geometry.y < 0 ? -1 : 1)*geometry.y;
899 delta.x=(double) width/geometry.width;
900 delta.y=(
double) height/geometry.height;
905 for (offset.y=0; offset.y < (
double) height; )
907 if ((flags & AspectValue) == 0)
909 crop.y=PixelRoundOffset((MagickRealType) (offset.y-
910 (geometry.y > 0 ? 0 : geometry.y)));
912 crop.height=(size_t) PixelRoundOffset((MagickRealType) (offset.y+
913 (geometry.y < 0 ? 0 : geometry.y)));
917 crop.y=PixelRoundOffset((MagickRealType) (offset.y-
918 (geometry.y > 0 ? geometry.y : 0)));
920 crop.height=(size_t) PixelRoundOffset((MagickRealType) (offset.y+
921 (geometry.y < 0 ? geometry.y : 0)));
924 crop.y+=image->page.y;
925 for (offset.x=0; offset.x < (
double) width; )
927 if ((flags & AspectValue) == 0)
929 crop.x=PixelRoundOffset((MagickRealType) (offset.x-
930 (geometry.x > 0 ? 0 : geometry.x)));
932 crop.width=(size_t) PixelRoundOffset((MagickRealType) (offset.x+
933 (geometry.x < 0 ? 0 : geometry.x)));
937 crop.x=PixelRoundOffset((MagickRealType) (offset.x-
938 (geometry.x > 0 ? geometry.x : 0)));
940 crop.width=(size_t) PixelRoundOffset((MagickRealType) (offset.x+
941 (geometry.x < 0 ? geometry.x : 0)));
944 crop.x+=image->page.x;
945 next=CropImage(image,&crop,exception);
946 if (next != (
Image *) NULL)
947 AppendImageToList(&crop_image,next);
950 ClearMagickException(exception);
953 if (((geometry.width == 0) && (geometry.height == 0)) ||
954 ((flags & XValue) != 0) || ((flags & YValue) != 0))
959 crop_image=CropImage(image,&geometry,exception);
960 if ((crop_image != (
Image *) NULL) && ((flags & AspectValue) != 0))
962 crop_image->page.width=geometry.width;
963 crop_image->page.height=geometry.height;
964 crop_image->page.x-=geometry.x;
965 crop_image->page.y-=geometry.y;
969 if ((image->columns > geometry.width) || (image->rows > geometry.height))
987 page.width=image->columns;
988 if (page.height == 0)
989 page.height=image->rows;
990 width=geometry.width;
993 height=geometry.height;
996 crop_image=NewImageList();
998 for (y=0; y < (ssize_t) page.height; y+=(ssize_t) height)
1000 for (x=0; x < (ssize_t) page.width; x+=(ssize_t) width)
1002 geometry.width=width;
1003 geometry.height=height;
1006 next=CropImage(image,&geometry,exception);
1007 if (next == (
Image *) NULL)
1009 AppendImageToList(&crop_image,next);
1011 if (next == (
Image *) NULL)
1016 return(CloneImage(image,0,0,MagickTrue,exception));
1047 MagickExport
Image *ExcerptImage(
const Image *image,
1050 #define ExcerptImageTag "Excerpt/Image" 1071 assert(image != (
const Image *) NULL);
1072 assert(image->signature == MagickCoreSignature);
1075 assert(exception->signature == MagickCoreSignature);
1076 if (IsEventLogging() != MagickFalse)
1077 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1078 excerpt_image=CloneImage(image,geometry->width,geometry->height,MagickTrue,
1080 if (excerpt_image == (
Image *) NULL)
1081 return((
Image *) NULL);
1087 image_view=AcquireVirtualCacheView(image,exception);
1088 excerpt_view=AcquireAuthenticCacheView(excerpt_image,exception);
1089 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1090 #pragma omp parallel for schedule(static) shared(progress,status) \ 1091 magick_number_threads(image,excerpt_image,excerpt_image->rows,2) 1093 for (y=0; y < (ssize_t) excerpt_image->rows; y++)
1099 *magick_restrict excerpt_indexes,
1100 *magick_restrict indexes;
1105 if (status == MagickFalse)
1107 p=GetCacheViewVirtualPixels(image_view,geometry->x,geometry->y+y,
1108 geometry->width,1,exception);
1109 q=GetCacheViewAuthenticPixels(excerpt_view,0,y,excerpt_image->columns,1,
1116 (void) memcpy(q,p,(
size_t) excerpt_image->columns*
sizeof(*q));
1117 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1118 if (indexes != (IndexPacket *) NULL)
1120 excerpt_indexes=GetCacheViewAuthenticIndexQueue(excerpt_view);
1121 if (excerpt_indexes != (IndexPacket *) NULL)
1122 (void) memcpy(excerpt_indexes,indexes,(
size_t)
1123 excerpt_image->columns*
sizeof(*excerpt_indexes));
1125 if (SyncCacheViewAuthenticPixels(excerpt_view,exception) == MagickFalse)
1127 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1132 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1136 proceed=SetImageProgress(image,ExcerptImageTag,progress,image->rows);
1137 if (proceed == MagickFalse)
1141 excerpt_view=DestroyCacheView(excerpt_view);
1142 image_view=DestroyCacheView(image_view);
1143 excerpt_image->type=image->type;
1144 if (status == MagickFalse)
1145 excerpt_image=DestroyImage(excerpt_image);
1146 return(excerpt_image);
1179 MagickExport
Image *ExtentImage(
const Image *image,
1191 assert(image != (
const Image *) NULL);
1192 assert(image->signature == MagickCoreSignature);
1195 assert(exception->signature == MagickCoreSignature);
1196 if (IsEventLogging() != MagickFalse)
1197 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1198 extent_image=CloneImage(image,geometry->width,geometry->height,MagickTrue,
1200 if (extent_image == (
Image *) NULL)
1201 return((
Image *) NULL);
1202 (void) DeleteImageProfile(extent_image,
"8bim");
1203 status=SetImageBackgroundColor(extent_image);
1204 if (status == MagickFalse)
1206 InheritException(exception,&extent_image->exception);
1207 extent_image=DestroyImage(extent_image);
1208 return((
Image *) NULL);
1210 status=CompositeImage(extent_image,image->compose,image,-geometry->x,
1212 if (status == MagickFalse)
1214 InheritException(exception,&extent_image->exception);
1215 extent_image=DestroyImage(extent_image);
1216 return((
Image *) NULL);
1218 return(extent_image);
1248 #define FlipImageTag "Flip/Image" 1269 assert(image != (
const Image *) NULL);
1270 assert(image->signature == MagickCoreSignature);
1272 assert(exception->signature == MagickCoreSignature);
1273 if (IsEventLogging() != MagickFalse)
1274 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1275 flip_image=CloneImage(image,0,0,MagickTrue,exception);
1276 if (flip_image == (
Image *) NULL)
1277 return((
Image *) NULL);
1284 image_view=AcquireVirtualCacheView(image,exception);
1285 flip_view=AcquireAuthenticCacheView(flip_image,exception);
1286 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1287 #pragma omp parallel for schedule(static) shared(status) \ 1288 magick_number_threads(image,flip_image,flip_image->rows,2) 1290 for (y=0; y < (ssize_t) flip_image->rows; y++)
1293 *magick_restrict indexes;
1299 *magick_restrict flip_indexes;
1304 if (status == MagickFalse)
1306 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1307 q=QueueCacheViewAuthenticPixels(flip_view,0,(ssize_t) (flip_image->rows-y-
1308 1),flip_image->columns,1,exception);
1314 (void) memcpy(q,p,(
size_t) image->columns*
sizeof(*q));
1315 indexes=GetCacheViewVirtualIndexQueue(image_view);
1316 if (indexes != (
const IndexPacket *) NULL)
1318 flip_indexes=GetCacheViewAuthenticIndexQueue(flip_view);
1319 if (flip_indexes != (IndexPacket *) NULL)
1320 (void) memcpy(flip_indexes,indexes,(
size_t) image->columns*
1321 sizeof(*flip_indexes));
1323 if (SyncCacheViewAuthenticPixels(flip_view,exception) == MagickFalse)
1325 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1330 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1334 proceed=SetImageProgress(image,FlipImageTag,progress,image->rows);
1335 if (proceed == MagickFalse)
1339 flip_view=DestroyCacheView(flip_view);
1340 image_view=DestroyCacheView(image_view);
1341 flip_image->type=image->type;
1342 if (page.height != 0)
1343 page.y=(ssize_t) (page.height-flip_image->rows-page.y);
1344 flip_image->page=page;
1345 if (status == MagickFalse)
1346 flip_image=DestroyImage(flip_image);
1377 #define FlopImageTag "Flop/Image" 1398 assert(image != (
const Image *) NULL);
1399 assert(image->signature == MagickCoreSignature);
1401 assert(exception->signature == MagickCoreSignature);
1402 if (IsEventLogging() != MagickFalse)
1403 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1404 flop_image=CloneImage(image,0,0,MagickTrue,exception);
1405 if (flop_image == (
Image *) NULL)
1406 return((
Image *) NULL);
1413 image_view=AcquireVirtualCacheView(image,exception);
1414 flop_view=AcquireAuthenticCacheView(flop_image,exception);
1415 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1416 #pragma omp parallel for schedule(static) shared(status) \ 1417 magick_number_threads(image,flop_image,flop_image->rows,2) 1419 for (y=0; y < (ssize_t) flop_image->rows; y++)
1422 *magick_restrict indexes;
1428 *magick_restrict flop_indexes;
1436 if (status == MagickFalse)
1438 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1439 q=QueueCacheViewAuthenticPixels(flop_view,0,y,flop_image->columns,1,
1446 q+=flop_image->columns;
1447 indexes=GetCacheViewVirtualIndexQueue(image_view);
1448 flop_indexes=GetCacheViewAuthenticIndexQueue(flop_view);
1449 for (x=0; x < (ssize_t) flop_image->columns; x++)
1452 if ((indexes != (
const IndexPacket *) NULL) &&
1453 (flop_indexes != (IndexPacket *) NULL))
1454 SetPixelIndex(flop_indexes+flop_image->columns-x-1,
1455 GetPixelIndex(indexes+x));
1457 if (SyncCacheViewAuthenticPixels(flop_view,exception) == MagickFalse)
1459 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1464 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1468 proceed=SetImageProgress(image,FlopImageTag,progress,image->rows);
1469 if (proceed == MagickFalse)
1473 flop_view=DestroyCacheView(flop_view);
1474 image_view=DestroyCacheView(image_view);
1475 flop_image->type=image->type;
1476 if (page.width != 0)
1477 page.x=(ssize_t) (page.width-flop_image->columns-page.x);
1478 flop_image->page=page;
1479 if (status == MagickFalse)
1480 flop_image=DestroyImage(flop_image);
1514 static MagickBooleanType CopyImageRegion(
Image *destination,
const Image *source,
const size_t columns,
const size_t rows,
const ssize_t sx,
const ssize_t sy,
1530 source_view=AcquireVirtualCacheView(source,exception);
1531 destination_view=AcquireAuthenticCacheView(destination,exception);
1532 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1533 #pragma omp parallel for schedule(static) shared(status) \ 1534 magick_number_threads(source,destination,rows,2) 1536 for (y=0; y < (ssize_t) rows; y++)
1542 *magick_restrict indexes;
1548 *magick_restrict destination_indexes;
1556 if (status == MagickFalse)
1558 p=GetCacheViewVirtualPixels(source_view,sx,sy+y,columns,1,exception);
1559 q=GetCacheViewAuthenticPixels(destination_view,dx,dy+y,columns,1,exception);
1565 indexes=GetCacheViewVirtualIndexQueue(source_view);
1566 (void) memcpy(q,p,(
size_t) columns*
sizeof(*p));
1567 if (indexes != (IndexPacket *) NULL)
1569 destination_indexes=GetCacheViewAuthenticIndexQueue(destination_view);
1570 if (destination_indexes != (IndexPacket *) NULL)
1571 (void) memcpy(destination_indexes,indexes,(
size_t)
1572 columns*
sizeof(*indexes));
1574 sync=SyncCacheViewAuthenticPixels(destination_view,exception);
1575 if (sync == MagickFalse)
1578 destination_view=DestroyCacheView(destination_view);
1579 source_view=DestroyCacheView(source_view);
1583 MagickExport
Image *RollImage(
const Image *image,
const ssize_t x_offset,
1586 #define RollImageTag "Roll/Image" 1600 assert(image != (
const Image *) NULL);
1601 assert(image->signature == MagickCoreSignature);
1603 assert(exception->signature == MagickCoreSignature);
1604 if (IsEventLogging() != MagickFalse)
1605 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1606 roll_image=CloneImage(image,0,0,MagickTrue,exception);
1607 if (roll_image == (
Image *) NULL)
1608 return((
Image *) NULL);
1611 while (offset.x < 0)
1612 offset.x+=(ssize_t) image->columns;
1613 while (offset.x >= (ssize_t) image->columns)
1614 offset.x-=(ssize_t) image->columns;
1615 while (offset.y < 0)
1616 offset.y+=(ssize_t) image->rows;
1617 while (offset.y >= (ssize_t) image->rows)
1618 offset.y-=(ssize_t) image->rows;
1622 status=CopyImageRegion(roll_image,image,(
size_t) offset.x,
1623 (
size_t) offset.y,(ssize_t) image->columns-offset.x,(ssize_t) image->rows-
1624 offset.y,0,0,exception);
1625 (void) SetImageProgress(image,RollImageTag,0,3);
1626 status&=CopyImageRegion(roll_image,image,image->columns-offset.x,
1627 (
size_t) offset.y,0,(ssize_t) image->rows-offset.y,offset.x,0,
1629 (void) SetImageProgress(image,RollImageTag,1,3);
1630 status&=CopyImageRegion(roll_image,image,(
size_t) offset.x,image->rows-
1631 offset.y,(ssize_t) image->columns-offset.x,0,0,offset.y,exception);
1632 (void) SetImageProgress(image,RollImageTag,2,3);
1633 status&=CopyImageRegion(roll_image,image,image->columns-offset.x,image->rows-
1634 offset.y,0,0,offset.x,offset.y,exception);
1635 (void) SetImageProgress(image,RollImageTag,3,3);
1636 roll_image->type=image->type;
1637 if (status == MagickFalse)
1638 roll_image=DestroyImage(roll_image);
1676 MagickExport
Image *ShaveImage(
const Image *image,
1685 assert(image != (
const Image *) NULL);
1686 assert(image->signature == MagickCoreSignature);
1687 if (IsEventLogging() != MagickFalse)
1688 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1689 if (((2*shave_info->width) >= image->columns) ||
1690 ((2*shave_info->height) >= image->rows))
1691 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
1692 SetGeometry(image,&geometry);
1693 geometry.width-=2*shave_info->width;
1694 geometry.height-=2*shave_info->height;
1695 geometry.x=(ssize_t) shave_info->width+image->page.x;
1696 geometry.y=(ssize_t) shave_info->height+image->page.y;
1697 shave_image=CropImage(image,&geometry,exception);
1698 if (shave_image == (
Image *) NULL)
1699 return((
Image *) NULL);
1700 shave_image->page.width-=2*shave_info->width;
1701 shave_image->page.height-=2*shave_info->height;
1702 shave_image->page.x-=(ssize_t) shave_info->width;
1703 shave_image->page.y-=(ssize_t) shave_info->height;
1704 return(shave_image);
1736 MagickExport
Image *SpliceImage(
const Image *image,
1739 #define SpliceImageTag "Splice/Image" 1764 assert(image != (
const Image *) NULL);
1765 assert(image->signature == MagickCoreSignature);
1768 assert(exception->signature == MagickCoreSignature);
1769 if (IsEventLogging() != MagickFalse)
1770 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1771 splice_geometry=(*geometry);
1772 splice_image=CloneImage(image,image->columns+splice_geometry.width,
1773 image->rows+splice_geometry.height,MagickTrue,exception);
1774 if (splice_image == (
Image *) NULL)
1775 return((
Image *) NULL);
1776 if (SetImageStorageClass(splice_image,DirectClass) == MagickFalse)
1778 InheritException(exception,&splice_image->exception);
1779 splice_image=DestroyImage(splice_image);
1780 return((
Image *) NULL);
1782 (void) SetImageBackgroundColor(splice_image);
1786 switch (image->gravity)
1789 case UndefinedGravity:
1790 case NorthWestGravity:
1794 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1797 case NorthEastGravity:
1799 splice_geometry.x+=(ssize_t) splice_geometry.width;
1804 splice_geometry.y+=(ssize_t) splice_geometry.width/2;
1810 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1811 splice_geometry.y+=(ssize_t) splice_geometry.height/2;
1816 splice_geometry.x+=(ssize_t) splice_geometry.width;
1817 splice_geometry.y+=(ssize_t) splice_geometry.height/2;
1820 case SouthWestGravity:
1822 splice_geometry.y+=(ssize_t) splice_geometry.height;
1827 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1828 splice_geometry.y+=(ssize_t) splice_geometry.height;
1831 case SouthEastGravity:
1833 splice_geometry.x+=(ssize_t) splice_geometry.width;
1834 splice_geometry.y+=(ssize_t) splice_geometry.height;
1843 columns=MagickMin(splice_geometry.x,(ssize_t) splice_image->columns);
1844 image_view=AcquireVirtualCacheView(image,exception);
1845 splice_view=AcquireAuthenticCacheView(splice_image,exception);
1846 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1847 #pragma omp parallel for schedule(static) shared(progress,status) \ 1848 magick_number_threads(image,splice_image,splice_geometry.y,2) 1850 for (y=0; y < (ssize_t) splice_geometry.y; y++)
1856 *magick_restrict indexes,
1857 *magick_restrict splice_indexes;
1865 if (status == MagickFalse)
1867 p=GetCacheViewVirtualPixels(image_view,0,y,splice_image->columns,1,
1869 q=QueueCacheViewAuthenticPixels(splice_view,0,y,splice_image->columns,1,
1876 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1877 splice_indexes=GetCacheViewAuthenticIndexQueue(splice_view);
1878 for (x=0; x < columns; x++)
1880 SetPixelRed(q,GetPixelRed(p));
1881 SetPixelGreen(q,GetPixelGreen(p));
1882 SetPixelBlue(q,GetPixelBlue(p));
1883 SetPixelOpacity(q,OpaqueOpacity);
1884 if (image->matte != MagickFalse)
1885 SetPixelOpacity(q,GetPixelOpacity(p));
1886 if (image->colorspace == CMYKColorspace)
1887 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1892 for ( ; x < (ssize_t) (splice_geometry.x+splice_geometry.width); x++)
1894 for ( ; x < (ssize_t) splice_image->columns; x++)
1896 SetPixelRed(q,GetPixelRed(p));
1897 SetPixelGreen(q,GetPixelGreen(p));
1898 SetPixelBlue(q,GetPixelBlue(p));
1899 SetPixelOpacity(q,OpaqueOpacity);
1900 if (image->matte != MagickFalse)
1901 SetPixelOpacity(q,GetPixelOpacity(p));
1902 if (image->colorspace == CMYKColorspace)
1903 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1908 if (SyncCacheViewAuthenticPixels(splice_view,exception) == MagickFalse)
1910 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1915 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1919 proceed=SetImageProgress(image,SpliceImageTag,progress,
1920 splice_image->rows);
1921 if (proceed == MagickFalse)
1925 #if defined(MAGICKCORE_OPENMP_SUPPORT) 1926 #pragma omp parallel for schedule(static) shared(progress,status) \ 1927 magick_number_threads(image,splice_image,splice_image->rows,2) 1929 for (y=(ssize_t) (splice_geometry.y+splice_geometry.height);
1930 y < (ssize_t) splice_image->rows; y++)
1936 *magick_restrict indexes,
1937 *magick_restrict splice_indexes;
1945 if (status == MagickFalse)
1947 if ((y < 0) || (y >= (ssize_t)splice_image->rows))
1949 p=GetCacheViewVirtualPixels(image_view,0,y-(ssize_t) splice_geometry.height,
1950 splice_image->columns,1,exception);
1951 q=QueueCacheViewAuthenticPixels(splice_view,0,y,splice_image->columns,1,
1958 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1959 splice_indexes=GetCacheViewAuthenticIndexQueue(splice_view);
1960 for (x=0; x < columns; x++)
1962 SetPixelRed(q,GetPixelRed(p));
1963 SetPixelGreen(q,GetPixelGreen(p));
1964 SetPixelBlue(q,GetPixelBlue(p));
1965 SetPixelOpacity(q,OpaqueOpacity);
1966 if (image->matte != MagickFalse)
1967 SetPixelOpacity(q,GetPixelOpacity(p));
1968 if (image->colorspace == CMYKColorspace)
1969 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1974 for ( ; x < (ssize_t) (splice_geometry.x+splice_geometry.width); x++)
1976 for ( ; x < (ssize_t) splice_image->columns; x++)
1978 SetPixelRed(q,GetPixelRed(p));
1979 SetPixelGreen(q,GetPixelGreen(p));
1980 SetPixelBlue(q,GetPixelBlue(p));
1981 SetPixelOpacity(q,OpaqueOpacity);
1982 if (image->matte != MagickFalse)
1983 SetPixelOpacity(q,GetPixelOpacity(p));
1984 if (image->colorspace == CMYKColorspace)
1985 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1990 if (SyncCacheViewAuthenticPixels(splice_view,exception) == MagickFalse)
1992 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1997 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2001 proceed=SetImageProgress(image,SpliceImageTag,progress,
2002 splice_image->rows);
2003 if (proceed == MagickFalse)
2007 splice_view=DestroyCacheView(splice_view);
2008 image_view=DestroyCacheView(image_view);
2009 if (status == MagickFalse)
2010 splice_image=DestroyImage(splice_image);
2011 return(splice_image);
2061 MagickExport MagickBooleanType TransformImage(
Image **image,
2062 const char *crop_geometry,
const char *image_geometry)
2074 assert(image != (
Image **) NULL);
2075 assert((*image)->signature == MagickCoreSignature);
2076 if (IsEventLogging() != MagickFalse)
2077 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",(*image)->filename);
2078 transform_image=(*image);
2079 if (crop_geometry != (
const char *) NULL)
2087 crop_image=CropImageToTiles(*image,crop_geometry,&(*image)->exception);
2088 if (crop_image == (
Image *) NULL)
2089 transform_image=CloneImage(*image,0,0,MagickTrue,&(*image)->exception);
2092 transform_image=DestroyImage(transform_image);
2093 transform_image=GetFirstImageInList(crop_image);
2095 *image=transform_image;
2097 if (image_geometry == (
const char *) NULL)
2103 flags=ParseRegionGeometry(transform_image,image_geometry,&geometry,
2104 &(*image)->exception);
2106 if ((transform_image->columns == geometry.width) &&
2107 (transform_image->rows == geometry.height))
2109 resize_image=ResizeImage(transform_image,geometry.width,geometry.height,
2110 transform_image->filter,transform_image->blur,&(*image)->exception);
2111 if (resize_image == (
Image *) NULL)
2112 return(MagickFalse);
2113 transform_image=DestroyImage(transform_image);
2114 transform_image=resize_image;
2115 *image=transform_image;
2148 MagickExport MagickBooleanType TransformImages(
Image **images,
2149 const char *crop_geometry,
const char *image_geometry)
2162 assert(images != (
Image **) NULL);
2163 assert((*images)->signature == MagickCoreSignature);
2164 if (IsEventLogging() != MagickFalse)
2165 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2166 (*images)->filename);
2167 image_list=ImageListToArray(*images,&(*images)->exception);
2168 if (image_list == (
Image **) NULL)
2169 return(MagickFalse);
2171 transform_images=NewImageList();
2172 for (i=0; image_list[i] != (
Image *) NULL; i++)
2174 image=image_list[i];
2175 status&=TransformImage(&image,crop_geometry,image_geometry);
2176 AppendImageToList(&transform_images,image);
2178 *images=transform_images;
2179 image_list=(
Image **) RelinquishMagickMemory(image_list);
2180 return(status != 0 ? MagickTrue : MagickFalse);
2210 #define TransposeImageTag "Transpose/Image" 2231 assert(image != (
const Image *) NULL);
2232 assert(image->signature == MagickCoreSignature);
2233 if (IsEventLogging() != MagickFalse)
2234 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2236 assert(exception->signature == MagickCoreSignature);
2237 transpose_image=CloneImage(image,image->rows,image->columns,MagickTrue,
2239 if (transpose_image == (
Image *) NULL)
2240 return((
Image *) NULL);
2246 image_view=AcquireVirtualCacheView(image,exception);
2247 transpose_view=AcquireAuthenticCacheView(transpose_image,exception);
2248 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2249 #pragma omp parallel for schedule(static) shared(progress,status) \ 2250 magick_number_threads(image,transpose_image,image->rows,2) 2252 for (y=0; y < (ssize_t) image->rows; y++)
2258 *magick_restrict transpose_indexes,
2259 *magick_restrict indexes;
2264 if (status == MagickFalse)
2266 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) image->rows-y-1,
2267 image->columns,1,exception);
2268 q=QueueCacheViewAuthenticPixels(transpose_view,(ssize_t) (image->rows-y-1),
2269 0,1,transpose_image->rows,exception);
2275 (void) memcpy(q,p,(
size_t) image->columns*
sizeof(*q));
2276 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2277 if (indexes != (IndexPacket *) NULL)
2279 transpose_indexes=GetCacheViewAuthenticIndexQueue(transpose_view);
2280 if (transpose_indexes != (IndexPacket *) NULL)
2281 (void) memcpy(transpose_indexes,indexes,(
size_t)
2282 image->columns*
sizeof(*transpose_indexes));
2284 if (SyncCacheViewAuthenticPixels(transpose_view,exception) == MagickFalse)
2286 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2291 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2295 proceed=SetImageProgress(image,TransposeImageTag,progress,
2297 if (proceed == MagickFalse)
2301 transpose_view=DestroyCacheView(transpose_view);
2302 image_view=DestroyCacheView(image_view);
2303 transpose_image->type=image->type;
2304 page=transpose_image->page;
2305 Swap(page.width,page.height);
2306 Swap(page.x,page.y);
2307 transpose_image->page=page;
2308 if (status == MagickFalse)
2309 transpose_image=DestroyImage(transpose_image);
2310 return(transpose_image);
2340 #define TransverseImageTag "Transverse/Image" 2361 assert(image != (
const Image *) NULL);
2362 assert(image->signature == MagickCoreSignature);
2363 if (IsEventLogging() != MagickFalse)
2364 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2366 assert(exception->signature == MagickCoreSignature);
2367 transverse_image=CloneImage(image,image->rows,image->columns,MagickTrue,
2369 if (transverse_image == (
Image *) NULL)
2370 return((
Image *) NULL);
2376 image_view=AcquireVirtualCacheView(image,exception);
2377 transverse_view=AcquireAuthenticCacheView(transverse_image,exception);
2378 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2379 #pragma omp parallel for schedule(static) shared(progress,status) \ 2380 magick_number_threads(image,transverse_image,image->rows,2) 2382 for (y=0; y < (ssize_t) image->rows; y++)
2391 *magick_restrict transverse_indexes,
2392 *magick_restrict indexes;
2400 if (status == MagickFalse)
2402 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
2403 q=QueueCacheViewAuthenticPixels(transverse_view,(ssize_t) (image->rows-y-
2404 1),0,1,transverse_image->rows,exception);
2411 for (x=0; x < (ssize_t) image->columns; x++)
2413 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2414 if (indexes != (IndexPacket *) NULL)
2416 transverse_indexes=GetCacheViewAuthenticIndexQueue(transverse_view);
2417 if (transverse_indexes != (IndexPacket *) NULL)
2418 for (x=0; x < (ssize_t) image->columns; x++)
2419 SetPixelIndex(transverse_indexes+image->columns-x-1,
2420 GetPixelIndex(indexes+x));
2422 sync=SyncCacheViewAuthenticPixels(transverse_view,exception);
2423 if (sync == MagickFalse)
2425 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2430 #if defined(MAGICKCORE_OPENMP_SUPPORT) 2434 proceed=SetImageProgress(image,TransverseImageTag,progress,image->rows);
2435 if (proceed == MagickFalse)
2439 transverse_view=DestroyCacheView(transverse_view);
2440 image_view=DestroyCacheView(image_view);
2441 transverse_image->type=image->type;
2442 page=transverse_image->page;
2443 Swap(page.width,page.height);
2444 Swap(page.x,page.y);
2445 if (page.width != 0)
2446 page.x=(ssize_t) (page.width-transverse_image->columns-page.x);
2447 if (page.height != 0)
2448 page.y=(ssize_t) (page.height-transverse_image->rows-page.y);
2449 transverse_image->page=page;
2450 if (status == MagickFalse)
2451 transverse_image=DestroyImage(transverse_image);
2452 return(transverse_image);
2486 assert(image != (
const Image *) NULL);
2487 assert(image->signature == MagickCoreSignature);
2488 if (IsEventLogging() != MagickFalse)
2489 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2490 geometry=GetImageBoundingBox(image,exception);
2491 if ((geometry.width == 0) || (geometry.height == 0))
2496 crop_image=CloneImage(image,1,1,MagickTrue,exception);
2497 if (crop_image == (
Image *) NULL)
2498 return((
Image *) NULL);
2499 crop_image->background_color.opacity=(Quantum) TransparentOpacity;
2500 (void) SetImageBackgroundColor(crop_image);
2501 crop_image->page=image->page;
2502 crop_image->page.x=(-1);
2503 crop_image->page.y=(-1);
2506 geometry.x+=image->page.x;
2507 geometry.y+=image->page.y;
2508 return(CropImage(image,&geometry,exception));