iOS Swift 3 Image rotated 90 degrees Left

℡╲_俬逩灬. 提交于 2019-11-29 19:55:10

问题


In my app I have a feature to take a picture from camera and upload it to server. My problem is that when I'm getting response back from server that image is rotating to 90 degree left side. Here is my tried code:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    self.PickerFrom = self.PickerFrom2
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
       self.AttachmentImageView.image = pickedImage
    }
    dismiss(animated: true, completion: nil)
    uploadGalleryImage(image: self.AttachmentImageView.image!)
}

func uploadGalleryImage( image:UIImage)
{
    let imageData: NSData = UIImagePNGRepresentation(image)! as NSData
    let base64String = imageData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    self.AttachedDocumentURL = "data:image/png;base64,\(base64String)"
}

AttachedDocumentURL contains base64sting of captured image.


回答1:


Try this (reset you image orientation) before you upload on server

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    self.PickerFrom = self.PickerFrom2
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage
    {
       self.AttachmentImageView.image = pickedImage
    }
    dismiss(animated: true, completion: nil)

    if let updatedImage = self.AttachmentImageView.image?.updateImageOrientionUpSide() {
      uploadGalleryImage(image: updatedImage)
    } else {
      uploadGalleryImage(image: self.AttachmentImageView.image!)
    }

}

func uploadGalleryImage( image:UIImage)
{
    let imageData: NSData = UIImagePNGRepresentation(image)! as NSData
    let base64String = imageData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
    self.AttachedDocumentURL = "data:image/png;base64,\(base64String)"
}

// Image extension
extension UIImage {

    func updateImageOrientionUpSide() -> UIImage? {
        if self.imageOrientation == .up {
            return self
        }

        UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
        self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height))
        if let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext() {
            UIGraphicsEndImageContext()
            return normalizedImage
        }
        UIGraphicsEndImageContext()
        return nil
    }
}



回答2:


Use this common function to fix upside image orientation from any.

extension UIImage {

    func fixImageOrientation() -> UIImage? {


        if (self.imageOrientation == .up) {
            return self
        }

        var transform: CGAffineTransform = CGAffineTransform.identity


        if ( self.imageOrientation == .left || self.imageOrientation == .leftMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.rotated(by: CGFloat(Double.pi / 2.0))
        } else if ( self.imageOrientation == .right || self.imageOrientation == .rightMirrored ) {
            transform = transform.translatedBy(x: 0, y: self.size.height);
            transform = transform.rotated(by: CGFloat(-Double.pi / 2.0));
        } else if ( self.imageOrientation == .down || self.imageOrientation == .downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: self.size.height)
            transform = transform.rotated(by: CGFloat(Double.pi))
        } else if ( self.imageOrientation == .upMirrored || self.imageOrientation == .downMirrored ) {
            transform = transform.translatedBy(x: self.size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        } else if ( self.imageOrientation == .leftMirrored || self.imageOrientation == .rightMirrored ) {
            transform = transform.translatedBy(x: self.size.height, y: 0);
            transform = transform.scaledBy(x: -1, y: 1);
        }


        if let context: CGContext = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height),
                                       bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0,
                                       space: self.cgImage!.colorSpace!,
                                       bitmapInfo: self.cgImage!.bitmapInfo.rawValue) {

            context.concatenate(transform)

            if ( self.imageOrientation == UIImageOrientation.left ||
                self.imageOrientation == UIImageOrientation.leftMirrored ||
                self.imageOrientation == UIImageOrientation.right ||
                self.imageOrientation == UIImageOrientation.rightMirrored ) {
                context.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.height,height: self.size.width))
            } else {
                context.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.width,height: self.size.height))
            }

            if let contextImage = context.makeImage() {
                return UIImage(cgImage: contextImage)
            }

        }

        return nil
    }
}



回答3:


Swift 4.1 compatible. This extension avoids sending image exif data on the iOS device side.

extension UIImage {

    func fixOrientation() -> UIImage? {

        if (imageOrientation == .up) { return self }

        var transform = CGAffineTransform.identity

        switch imageOrientation {
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0.0)
            transform = transform.rotated(by: .pi / 2.0)
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0.0, y: size.height)
            transform = transform.rotated(by: -.pi / 2.0)
        case .down, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height)
            transform = transform.rotated(by: .pi)
        default:
            break
        }

        switch imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: 0.0)
            transform = transform.scaledBy(x: -1.0, y: 1.0)
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: size.height, y: 0.0)
            transform = transform.scaledBy(x: -1.0, y: 1.0)
        default:
            break
        }

        guard let cgImg = cgImage else { return nil }

        if let context = CGContext(data: nil,
                                   width: Int(size.width), height: Int(size.height),
                                   bitsPerComponent: cgImg.bitsPerComponent,
                                   bytesPerRow: 0, space: cgImg.colorSpace!,
                                   bitmapInfo: cgImg.bitmapInfo.rawValue) {

            context.concatenate(transform)

            if imageOrientation == .left || imageOrientation == .leftMirrored ||
                imageOrientation == .right || imageOrientation == .rightMirrored {
                context.draw(cgImg, in: CGRect(x: 0.0, y: 0.0, width: size.height, height: size.width))
            } else {
                context.draw(cgImg, in: CGRect(x: 0.0 , y: 0.0, width: size.width, height: size.height))
            }

            if let contextImage = context.makeImage() {
                return UIImage(cgImage: contextImage)
            }

        }

        return nil
    }

}


来源:https://stackoverflow.com/questions/45324544/ios-swift-3-image-rotated-90-degrees-left

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!