zoukankan      html  css  js  c++  java
  • 图片旋转90度解决的方法

    假设把通过相机获取到的图片,直接进行操作, 比方裁剪, 缩放, 则会把原图片向又旋转90度。


    ps: 查找过程中, 碰到了一种说法:

    [objc] view plaincopy
    1. //get original photo from iOS photos   
    2. //假设该图片大于2M,会自己主动旋转90度;否则不旋转  
    3. UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage];  

    至于是否正确, 还没确定。

    先Mark。


    以下的解决的方法亲測可行。 原文:http://www.cnblogs.com/jiangyazhou/archive/2012/03/22/2412343.html

    用相机拍摄出来的照片含有EXIF信息。UIImage的imageOrientation属性指的就是EXIF中的orientation信息。


    假设我们忽略orientation信息。而直接对比片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是由于我们运行像素处理或者drawInRect等操作之后。imageOrientaion信息被删除了。imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。


    所以。在对比片进行处理之前。先将照片旋转到正确的方向,而且返回的imageOrientaion为0。


    以下这种方法就是一个UIImage category中的方法。用它能够达到以上目的。



    [objc] view plaincopy
    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.width0);  
    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.width0);  
    37.             transform = CGAffineTransformScale(transform, -11);  
    38.             break;  
    39.               
    40.         case UIImageOrientationLeftMirrored:  
    41.         case UIImageOrientationRightMirrored:  
    42.             transform = CGAffineTransformTranslate(transform, aImage.size.height0);  
    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. }  
  • 相关阅读:
    ExtJS小技巧
    Oracle 表的行数、表占用空间大小,列的非空行数、列占用空间大小 查询
    NPM 私服
    IDEA 不编译java以外的文件
    SQL 引号中的问号在PrepareStatement 中不被看作是占位符
    Chrome 浏览器自动填表呈现淡黄色解决
    批量删除Maven 仓库未下载成功.lastupdate 的文件
    Oracle 11g 监听很慢,由于监听日志文件太大引起的问题(Windows 下)
    Hibernate 自动更新表出错 建表或添加列,提示标识符无效
    Hibernate 自动更新表出错 More than one table found in namespace
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/6881439.html
Copyright © 2011-2022 走看看