美文网首页
iOS -摄像头拍摄照片自动旋转90度处理(Swift + OC

iOS -摄像头拍摄照片自动旋转90度处理(Swift + OC

作者: valentizx | 来源:发表于2017-02-06 17:52 被阅读1136次

相关解释来自这里

原文答案:
If you turned your camera properly when taking the shot, and you use fairly current photo software, rotating sideways pictures is generally not something you should have to worry about in post processing. Most modern cameras have a rotation sensor which writes an orientation EXIF tag into the file to tell your software how to turn the photo for display. You also might want to open the File preferences for Photoshop and check to see if I**gnore EXIF Profile Tag **has been selected.However, there are some situations in which your photo will not be rotated properly and will display sideways.

大致意思是说,现在摄像头都会有一个方向旋转传感器,方向信息作为EXIF信息标记到照片当中,凭借此方向信息系统会“知道”如何正确的显示照片,当然有一些情况下,照片无法被正确旋转或者横向显示。

由此可知:当ImageView上的图片横向显示或者旋转了其他角度就说明EXIF中的方向标签被重置了,当代码中有处理像素或者裁剪或者重画图片的功能很有可能就“抹掉”了EXIF信息中的“方向”标签内对应的消息。
对此StackOverflow中找到了OC版本的处理方法。
UIImagecategory中添加:

+ (UIImage *)fixOrientation:(UIImage *)aImage {  
    
  // No-op if the orientation is already correct  
  if (aImage.imageOrientation == UIImageOrientationUp)   
    return aImage;  
    
  // We need to calculate the proper transformation to make the image upright.  
  // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.  
  CGAffineTransform transform = CGAffineTransformIdentity;  
    
  switch (aImage.imageOrientation) {  
    case UIImageOrientationDown:  
    case UIImageOrientationDownMirrored:  
      transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);  
      transform = CGAffineTransformRotate(transform, M_PI);  
      break;  
        
    case UIImageOrientationLeft:  
    case UIImageOrientationLeftMirrored:  
      transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  
      transform = CGAffineTransformRotate(transform, M_PI_2);  
      break;  
        
    case UIImageOrientationRight:  
    case UIImageOrientationRightMirrored:  
      transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);  
      transform = CGAffineTransformRotate(transform, -M_PI_2);  
      break;  
    default:  
      break;  
  }  
    
  switch (aImage.imageOrientation) {  
    case UIImageOrientationUpMirrored:  
    case UIImageOrientationDownMirrored:  
      transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);  
      transform = CGAffineTransformScale(transform, -1, 1);  
      break;  
        
    case UIImageOrientationLeftMirrored:  
    case UIImageOrientationRightMirrored:  
      transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);  
      transform = CGAffineTransformScale(transform, -1, 1);  
      break;  
    default:  
      break;  
  }  
    
  // Now we draw the underlying CGImage into a new context, applying the transform  
  // calculated above.  
  CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,  
                       CGImageGetBitsPerComponent(aImage.CGImage), 0,  
                       CGImageGetColorSpace(aImage.CGImage),  
                       CGImageGetBitmapInfo(aImage.CGImage));  
  CGContextConcatCTM(ctx, transform);  
  switch (aImage.imageOrientation) {  
    case UIImageOrientationLeft:  
    case UIImageOrientationLeftMirrored:  
    case UIImageOrientationRight:  
    case UIImageOrientationRightMirrored:  
      // Grr...  
      CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);  
      break;  
        
    default:  
      CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);  
      break;  
  }  
    
  // And now we just create a new UIImage from the drawing context  
  CGImageRef cgimg = CGBitmapContextCreateImage(ctx);  
  UIImage *img = [UIImage imageWithCGImage:cgimg];  
  CGContextRelease(ctx);  
  CGImageRelease(cgimg);  
  return img;  
}  

自己重写了Swift版本(此段写于2017/02/06,适用于Swift 3):
在extension中添加

class func fixOrientation(image : UIImage) -> UIImage {
        if image.imageOrientation == .up {
            return image
        }
        var transform = CGAffineTransform.identity
        switch image.imageOrientation {
        case .down,.downMirrored:
            transform = transform.translatedBy(x: image.size.width, y: image.size.height)
            transform = transform.rotated(by: CGFloat(M_PI))
        case .left,.leftMirrored:
            transform = transform.translatedBy(x: image.size.width, y: 0)
            transform = transform.rotated(by: CGFloat(M_PI_2))

        case .right,.rightMirrored:
            transform = transform.translatedBy(x: 0, y: image.size.height)
            transform = transform.rotated(by: CGFloat(-M_PI_2))
       
        default:
            break
        }
        
        
        switch image.imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: image.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: image.size.height, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        default:
            break
        }
        
        
        let ctx = CGContext(data: nil, width: Int(image.size.width), height: Int(image.size.height), bitsPerComponent: image.cgImage!.bitsPerComponent, bytesPerRow: 0, space: image.cgImage!.colorSpace!, bitmapInfo: image.cgImage!.bitmapInfo.rawValue)
        ctx!.concatenate(transform)
        switch image.imageOrientation {
        case .left,.leftMirrored,.rightMirrored,.right:
            ctx?.draw(image.cgImage!, in: CGRect(x :0,y:0,width:image.size.height,height: image.size.width))
            
        default:
             ctx?.draw(image.cgImage!, in: CGRect(x :0,y:0,width:image.size.width,height: image.size.height))
        }
        let cgimg = ctx!.makeImage()
        let img = UIImage(cgImage: cgimg!)   
        return img
    }


相关文章

网友评论

      本文标题:iOS -摄像头拍摄照片自动旋转90度处理(Swift + OC

      本文链接:https://www.haomeiwen.com/subject/vujuittx.html