iOS UIImagePickerController result image orientation after upload

后端 未结 20 2217
长发绾君心
长发绾君心 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:06

    Update for Swift 3.1 based on Sourabh Sharma's answer, with code clean up.

    extension UIImage {
        func fixedOrientation() -> UIImage {
            if imageOrientation == .up { return self }
    
            var transform:CGAffineTransform = .identity
            switch imageOrientation {
            case .down, .downMirrored:
                transform = transform.translatedBy(x: size.width, y: size.height).rotated(by: .pi)
            case .left, .leftMirrored:
                transform = transform.translatedBy(x: size.width, y: 0).rotated(by: .pi/2)
            case .right, .rightMirrored:
                transform = transform.translatedBy(x: 0, y: size.height).rotated(by: -.pi/2)
            default: break
            }
    
            switch imageOrientation {
            case .upMirrored, .downMirrored:
                transform = transform.translatedBy(x: size.width, y: 0).scaledBy(x: -1, y: 1)
            case .leftMirrored, .rightMirrored:
                transform = transform.translatedBy(x: size.height, y: 0).scaledBy(x: -1, y: 1)
            default: break
            }
    
            let ctx = CGContext(data: nil, width: Int(size.width), height: Int(size.height),
                                           bitsPerComponent: cgImage!.bitsPerComponent, bytesPerRow: 0,
                                           space: cgImage!.colorSpace!, bitmapInfo: cgImage!.bitmapInfo.rawValue)!
            ctx.concatenate(transform)
    
            switch imageOrientation {
            case .left, .leftMirrored, .right, .rightMirrored:
                ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.height,height: size.width))
            default:
                ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.width,height: size.height))
            }
            return UIImage(cgImage: ctx.makeImage()!)
        }
    }
    

    Picker delegate method example:

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        guard let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
        let fixedImage = originalImage.fixedOrientation()
        // do your work
    }
    

提交回复
热议问题