iOS UIImagePickerController result image orientation after upload

后端 未结 20 1938
长发绾君心
长发绾君心 2020-11-22 00:44

I am testing my iPhone application on an iOS 3.1.3 iPhone. I am selecting/capturing an image using a UIImagePickerController:

UIImagePickerCont         


        
相关标签:
20条回答
  • 2020-11-22 01:15

    in swift ;)

    UPDATE SWIFT 3.0 :D

    func sFunc_imageFixOrientation(img:UIImage) -> UIImage {
    
    
        // No-op if the orientation is already correct
        if (img.imageOrientation == UIImageOrientation.up) {
            return img;
        }
        // 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.
        var transform:CGAffineTransform = CGAffineTransform.identity
    
        if (img.imageOrientation == UIImageOrientation.down
            || img.imageOrientation == UIImageOrientation.downMirrored) {
    
            transform = transform.translatedBy(x: img.size.width, y: img.size.height)
            transform = transform.rotated(by: CGFloat(M_PI))
        }
    
        if (img.imageOrientation == UIImageOrientation.left
            || img.imageOrientation == UIImageOrientation.leftMirrored) {
    
            transform = transform.translatedBy(x: img.size.width, y: 0)
            transform = transform.rotated(by: CGFloat(M_PI_2))
        }
    
        if (img.imageOrientation == UIImageOrientation.right
            || img.imageOrientation == UIImageOrientation.rightMirrored) {
    
            transform = transform.translatedBy(x: 0, y: img.size.height);
            transform = transform.rotated(by: CGFloat(-M_PI_2));
        }
    
        if (img.imageOrientation == UIImageOrientation.upMirrored
            || img.imageOrientation == UIImageOrientation.downMirrored) {
    
            transform = transform.translatedBy(x: img.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        }
    
        if (img.imageOrientation == UIImageOrientation.leftMirrored
            || img.imageOrientation == UIImageOrientation.rightMirrored) {
    
            transform = transform.translatedBy(x: img.size.height, y: 0);
            transform = transform.scaledBy(x: -1, y: 1);
        }
    
    
        // Now we draw the underlying CGImage into a new context, applying the transform
        // calculated above.
        let ctx:CGContext = CGContext(data: nil, width: Int(img.size.width), height: Int(img.size.height),
                                      bitsPerComponent: img.cgImage!.bitsPerComponent, bytesPerRow: 0,
                                      space: img.cgImage!.colorSpace!,
                                      bitmapInfo: img.cgImage!.bitmapInfo.rawValue)!
    
        ctx.concatenate(transform)
    
    
        if (img.imageOrientation == UIImageOrientation.left
            || img.imageOrientation == UIImageOrientation.leftMirrored
            || img.imageOrientation == UIImageOrientation.right
            || img.imageOrientation == UIImageOrientation.rightMirrored
            ) {
    
    
            ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.height,height:img.size.width))
    
        } else {
            ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.width,height:img.size.height))
        }
    
    
        // And now we just create a new UIImage from the drawing context
        let cgimg:CGImage = ctx.makeImage()!
        let imgEnd:UIImage = UIImage(cgImage: cgimg)
    
        return imgEnd
    }
    
    0 讨论(0)
  • 2020-11-22 01:18

    This what I have found for fixing orientation issue

    UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *data = UIImagePNGRepresentation(self.initialImage);
    
    UIImage *tempImage = [UIImage imageWithData:data];
    UIImage *fixedOrientationImage = [UIImage imageWithCGImage:tempImage.CGImage
                                         scale:initialImage.scale
                                   orientation:self.initialImage.imageOrientation];
    initialImage = fixedOrientationImage;
    

    EDIT:

    UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    NSData *data = UIImagePNGRepresentation(self.initialImage);
    
    initialImage = [UIImage imageWithCGImage:[UIImage imageWithData:data].CGImage
                                                         scale:initialImage.scale
                                                   orientation:self.initialImage.imageOrientation];
    
    0 讨论(0)
  • 2020-11-22 01:18

    If I understand, what you want to do is disregard the orientation of the UIImage? If so then you could do this:-

    //image is your original image
    image = [UIImage imageWithCGImage:[image CGImage]
                                 scale:[image scale]
                           orientation: UIImageOrientationUp];
    

    or in Swift :-

    image = UIImage(CGImage: image.CGImage!, scale: image.scale, orientation:.Up)
    

    It solved my cropping issue.. Hope, this is what you're looking for..

    0 讨论(0)
  • 2020-11-22 01:19

    Here is a Swift version of the answer by @an0:

    func normalizedImage() -> UIImage {
    
      if (self.imageOrientation == UIImageOrientation.Up) { 
          return self;
      }
    
      UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale);
      let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
      self.drawInRect(rect)
    
      let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext();
      return normalizedImage;
    }
    

    Also in a more general function:

    func fixOrientation(img:UIImage) -> UIImage {
    
      if (img.imageOrientation == UIImageOrientation.Up) { 
          return img;
      }
    
      UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale);
      let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
      img.drawInRect(rect)
    
      let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()
      UIGraphicsEndImageContext();
      return normalizedImage;
    
    }
    

    Swift 3 version:

    func fixOrientation(img: UIImage) -> UIImage {
        if (img.imageOrientation == .up) {
            return img
        }
    
        UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale)
        let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
        img.draw(in: rect)
    
        let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
    
        return normalizedImage
    }
    
    0 讨论(0)
  • 2020-11-22 01:22

    Swift 4.x/5.0 version of @an0 's solution:

    extension UIImage {
        func upOrientationImage() -> UIImage? {
            switch imageOrientation {
            case .up:
                return self
            default:
                UIGraphicsBeginImageContextWithOptions(size, false, scale)
                draw(in: CGRect(origin: .zero, size: size))
                let result = UIGraphicsGetImageFromCurrentImageContext()
                UIGraphicsEndImageContext()
                return result
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 01:22

    I have experienced this issue with images taken from camera or saved in camera roll which are taken from camera. Images downloaded in photo library from safari browser does not rotate when uploaded.

    I was able to solve this issue by making the image data as JPEG before uploading.

    let image = info[UIImagePickerControllerOriginalImage] as! UIImage        
    let data = UIImageJPEGRepresentation(image, 1.0)
    

    We can now use the data for uploading and the image will not get rotated after upload.

    Hope this will work.

    0 讨论(0)
提交回复
热议问题