最近在用imageMagick 进行图像处理,主要是lua ffi调用ImageMagick, 发现MagickAutoOrientImage在旧版本中不存在,目前可以确定的是这个函数在ImageMagick 6.8.9中才出现。
1WandExport MagickBooleanType MagickAutoOrientImage(MagickWand *wand) 2{ 3 4 Image 5 *orient_image; 6 7 assert(wand != (MagickWand *) NULL); 8 assert(wand->signature == WandSignature); 9 if (wand->debug != MagickFalse) 10 (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); 11 if (wand->images == (Image *) NULL) 12 ThrowWandException(WandError,"ContainsNoImages",wand->name); 13 orient_image=AutoOrientImage(wand->images,wand->images->orientation, 14 wand->exception); 15 if (orient_image == (Image *) NULL) 16 return(MagickFalse); 17 ReplaceImageInList(&wand->images,orient_image); 18 return(MagickTrue); 19}
所以就要看AutoOrientImage的实现来手动实现
1MagickExport Image *AutoOrientImage(const Image *image, 2 const OrientationType orientation,ExceptionInfo *exception) 3{ 4 Image 5 *orient_image; 6 7 assert(image != (const Image *) NULL); 8 assert(image->signature == MagickSignature); 9 assert(exception != (ExceptionInfo *) NULL); 10 assert(exception->signature == MagickSignature); 11 orient_image=(Image *) NULL; 12 switch(orientation) 13 { 14 case UndefinedOrientation: 15 case TopLeftOrientation: 16 default: 17 { 18 orient_image=CloneImage(image,0,0,MagickTrue,exception); 19 break; 20 } 21 case TopRightOrientation: 22 { 23 orient_image=FlopImage(image,exception); 24 break; 25 } 26 case BottomRightOrientation: 27 { 28 orient_image=RotateImage(image,180.0,exception); 29 break; 30 } 31 case BottomLeftOrientation: 32 { 33 orient_image=FlipImage(image,exception); 34 break; 35 } 36 case LeftTopOrientation: 37 { 38 orient_image=TransposeImage(image,exception); 39 break; 40 } 41 case RightTopOrientation: 42 { 43 orient_image=RotateImage(image,90.0,exception); 44 break; 45 } 46 case RightBottomOrientation: 47 { 48 orient_image=TransverseImage(image,exception); 49 break; 50 } 51 case LeftBottomOrientation: 52 { 53 orient_image=RotateImage(image,270.0,exception); 54 break; 55 } 56 } 57 if (orient_image != (Image *) NULL) 58 orient_image->orientation=TopLeftOrientation; 59 return(orient_image); 60}