处理图片的旋转问题bug

来源:互联网 发布:刘德华救歌迷知乎 编辑:程序博客网 时间:2024/05/24 04:45

UIImage有一个imageOrientation的属性,主要作用是控制image的绘制方向,共有以下8中方向

  • //UIImageOrientation的定义,定义了如下几种变换  
  • typedef enum   
  • {  
  •     UIImageOrientationUp,            // default orientation  
  •   
  •     UIImageOrientationDown,          // 180 deg rotation  
  •   
  •     UIImageOrientationLeft,          // 90 deg CCW  
  •       
  •     UIImageOrientationRight,         // 90 deg CW  
  •       
  •     UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip  
  •       
  •     UIImageOrientationDownMirrored,  // horizontal flip  
  •       
  •     UIImageOrientationLeftMirrored,  // vertical flip  
  •       
  •     UIImageOrientationRightMirrored, // vertical flip  
  •   
  • } UIImageOrientation; 

    + (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0); 

    该方面使用一个CGImageRef创建UIImage,在创建时还可以指定方法倍数以及旋转方向。当scale设置为1的时候,新创建的图像将和原图像尺寸一摸一样,而orientaion则可以指定新的图像的绘制方向。

     

    下面是个解决应用图片旋转或颠倒的bug:

    1. + (UIImage *)fixOrientation:(UIImage *)aImage {  
    2.       
    3.     // No-op if the orientation is already correct  
    4.     if (aImage.imageOrientation == UIImageOrientationUp)   
    5.         return aImage;  
    6.       
    7.     // We need to calculate the proper transformation to make the image upright.  
    8.     // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.  
    9.     CGAffineTransform transform = CGAffineTransformIdentity;  
    10.       
    11.     switch (aImage.imageOrientation) {  
    12.         case UIImageOrientationDown:  
    13.         case UIImageOrientationDownMirrored:  
    14.             transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);  
    15.             transform = CGAffineTransformRotate(transform, M_PI);  
    16.             break;  
    17.               
    18.         case UIImageOrientationLeft:  
    19.         case UIImageOrientationLeftMirrored:  
    20.             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  
    21.             transform = CGAffineTransformRotate(transform, M_PI_2);  
    22.             break;  
    23.               
    24.         case UIImageOrientationRight:  
    25.         case UIImageOrientationRightMirrored:  
    26.             transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);  
    27.             transform = CGAffineTransformRotate(transform, -M_PI_2);  
    28.             break;  
    29.         default:  
    30.             break;  
    31.     }  
    32.       
    33.     switch (aImage.imageOrientation) {  
    34.         case UIImageOrientationUpMirrored:  
    35.         case UIImageOrientationDownMirrored:  
    36.             transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  
    37.             transform = CGAffineTransformScale(transform, -11);  
    38.             break;  
    39.               
    40.         case UIImageOrientationLeftMirrored:  
    41.         case UIImageOrientationRightMirrored:  
    42.             transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);  
    43.             transform = CGAffineTransformScale(transform, -11);  
    44.             break;  
    45.         default:  
    46.             break;  
    47.     }  
    48.       
    49.     // Now we draw the underlying CGImage into a new context, applying the transform  
    50.     // calculated above.  
    51.     CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,  
    52.                                              CGImageGetBitsPerComponent(aImage.CGImage), 0,  
    53.                                              CGImageGetColorSpace(aImage.CGImage),  
    54.                                              CGImageGetBitmapInfo(aImage.CGImage));  
    55.     CGContextConcatCTM(ctx, transform);  
    56.     switch (aImage.imageOrientation) {  
    57.         case UIImageOrientationLeft:  
    58.         case UIImageOrientationLeftMirrored:  
    59.         case UIImageOrientationRight:  
    60.         case UIImageOrientationRightMirrored:  
    61.             // Grr...  
    62.             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);  
    63.             break;  
    64.               
    65.         default:  
    66.             CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);  
    67.             break;  
    68.     }  
    69.       
    70.     // And now we just create a new UIImage from the drawing context  
    71.     CGImageRef cgimg = CGBitmapContextCreateImage(ctx);  
    72.     UIImage *img = [UIImage imageWithCGImage:cgimg];  
    73.     CGContextRelease(ctx);  
    74.     CGImageRelease(cgimg);  
    75.     return img;  
    76. }  

  • 0 0