【问题标题】:Selecting images with UIImagePickerController() auto-rotates them [duplicate]使用 UIImagePickerController() 选择图像会自动旋转它们[重复]
【发布时间】:2019-05-25 17:47:35
【问题描述】:

在我的应用程序中,我从用户的照片库中导入选定的照片,并将它们用作缩略图/在UIImageViews 中显示它们。它们被导入并保存到用户的文档文件夹中。

使用的代码如下,但是图像在保存之前会自动旋转,我不知道为什么。

例如,这张图片旋转了 180°:https://imgur.com/a/r2xm0if,其他一些比它们高的更宽的图像也是如此。我不确定为什么,但并非所有图像都像这样旋转。有些旋转了 90°,有些则完全没有。

它们在磁盘上旋转 - 不仅仅是在 UIImageView 中,所以我知道这不是设置问题。

importPicture() 在用户点击“+”按钮时被调用。

@objc func importPicture() {
    let picker                  = UIImagePickerController()
    picker.mediaTypes           = [kUTTypeMovie as String, kUTTypeImage as String]
    picker.allowsEditing        = true
    picker.delegate             = self

    present(picker, animated: true)
}


@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {


    let documentsDirectoryURL = try! FileManager().url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
    // create a name for your image
    let addedURL = UUID().uuidString
    let fileURL = documentsDirectoryURL.appendingPathComponent("\(addedURL).png")

    let videoURL2 = documentsDirectoryURL.appendingPathComponent("\(addedURL).mov")



    let mediaType = info[UIImagePickerController.InfoKey.mediaType] as AnyObject

    // Movie
    if mediaType as! String == kUTTypeMovie as String {
        let videoURL = info[UIImagePickerController.InfoKey.mediaURL] as? URL
        print("VIDEO URL: \(videoURL!)")

        let myVideoVarData = try! Data(contentsOf: videoURL! as URL)
        if !FileManager.default.fileExists(atPath: videoURL2.path) {
            do {
                try myVideoVarData.write(to: videoURL2)
                print("Video Added Successfully")
                print(videoURL2)
            } catch {
                print(error)
            }
        } else {
            print("Video not added")
        }

        photosNew.append("\(addedURL).mov")

        collectionView.reloadData()



    }


    // Image
    if mediaType as! String == kUTTypeImage as String {

        guard let image = info[.originalImage] as? UIImage else {
            return
        }
        if let imageData = image.pngData() {
            if !FileManager.default.fileExists(atPath: fileURL.path) {
                do {
                    try imageData.write(to: fileURL)
                    print("Image Added Successfully")
                    print(fileURL)
                } catch {
                    print(error)
                }
            } else {
                print("Image Not Added")
            }
        }

        photosNew.append("\(addedURL).png")

        collectionView.reloadData()

    }

【问题讨论】:

  • 问题是当您将图像保存为 png 时,它会丢弃图像方向。只需保存为 jpeg 而不是 png
  • 好的,谢谢。由于压缩/质量问题,我避免使用 jpeg,但可能会在未来的开发中考虑这一点。
  • 只使用质量1.0不会有明显的损失
  • @LeoDabus 会试试的,谢谢!
  • 欢迎您如果您需要使用 png,您只需要创建一个新的图像上下文,如重复链接中所示stackoverflow.com/questions/42098390/…

标签: ios swift xcode uiimagepickercontroller


【解决方案1】:

创建了一个UIImage 扩展以将图像保持在原始位置,

extension UIImage {
    func fixedOrientation() -> UIImage {

        if imageOrientation == .up {
            return self
        }

        var transform: CGAffineTransform = CGAffineTransform.identity

        switch imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height)
            transform = transform.rotated(by: CGFloat.pi)
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.rotated(by: CGFloat.pi / 2)
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: size.height)
            transform = transform.rotated(by: CGFloat.pi / -2)
        case .up, .upMirrored:
            break
        }

        switch imageOrientation {
        case .upMirrored, .downMirrored:
            transform.translatedBy(x: size.width, y: 0)
            transform.scaledBy(x: -1, y: 1)
        case .leftMirrored, .rightMirrored:
            transform.translatedBy(x: size.height, y: 0)
            transform.scaledBy(x: -1, y: 1)
        case .up, .down, .left, .right:
            break
        }

        if let cgImage = self.cgImage, let colorSpace = cgImage.colorSpace,
            let ctx: CGContext = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: cgImage.bitsPerComponent, bytesPerRow: 0, space: colorSpace, bitmapInfo: CGImageAlphaInfo.premultipliedLast.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))
            }
            if let ctxImage: CGImage = ctx.makeImage() {
                return UIImage(cgImage: ctxImage)
            } else {
                return self
            }
        } else {
            return self
        }
    }
}

要使用扩展程序的方法,请使用您的image 执行以下操作,

let orientedImage = image?.fixedOrientation()

在您的情况下,在 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) 方法中,

...
guard let image = info[.originalImage] as? UIImage else {
        return
    }
let orientedImage = image.fixedOrientation()
if let imageData = orientedImage.pngData() {
...

【讨论】:

  • 这行得通,谢谢!
  • 没问题,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多