IOS设备上传图片自动旋转的解决方案

在iOS开发中,处理图像时常常会遇到图片自动旋转 90 度的问题。这个问题主要发生在用户用手机拍摄的图片上,因为图片的 EXIF 数据中保存了图片的方向信息。为了确保上传到服务器的图片是正确的显示方向,我们需要处理这些图片。本文将详细介绍解决方案的流程和实施步骤。

整个流程概述

以下是处理图像旋转的流程,以表格形式展示:

步骤 描述
1 获取 UIImage
2 读取 EXIF 信息
3 根据 EXIF 信息调整图片方向
4 将调整后的图片上传

步骤详细说明

第一步:获取 UIImage

首先,我们需要从用户的设备获取图像。通常,我们通过 UIImagePickerController 来实现。

import UIKit

class ImagePickerController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    func selectImage() {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary // 从相册中选择照片
        present(imagePicker, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[.originalImage] as? UIImage {
            // 成功选择到图片
            handleImage(image)
        }
        dismiss(animated: true, completion: nil)
    }
}

第二步:读取 EXIF 信息

我们需要读取所选图片的 EXIF 数据,以获取图片的方向信息。可以使用 CGImageSourceImageIO 框架。

import ImageIO

func getImageOrientation(image: UIImage) -> UIImage.Orientation {
    guard let imageData = image.jpegData(compressionQuality: 1.0),
          let source = CGImageSourceCreateWithData(imageData as NSData, nil),
          let properties = CGImageSourceCopyPropertiesAtIndex(source, 0, nil) as? [String: Any],
          let orientationValue = properties[kCGImagePropertyOrientation as String] as? NSNumber else {
        return .up
    }
    return UIImage.Orientation(rawValue: orientationValue.intValue) ?? .up
}

第三步:根据 EXIF 信息调整图片方向

读取到方向信息后,我们需要根据这个信息调整 UIImage 的方向。

func fixImageOrientation(image: UIImage) -> UIImage {
    let orientation = getImageOrientation(image: image)
    if orientation == .up {
        return image
    }

    UIGraphicsBeginImageContext(image.size)
    image.draw(in: CGRect(origin: .zero, size: image.size))
    let correctedImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    
    return correctedImage ?? image
}

第四步:将调整后的图片上传

一旦我们调整了图片方向,就可以将其上传到服务器。本示例将使用 URLSession 方法上传图片。

func uploadImage(image: UIImage) {
    guard let uploadData = image.jpegData(compressionQuality: 0.9) else { return }
    
    var request = URLRequest(url: URL(string: "
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let task = URLSession.shared.uploadTask(with: request, from: uploadData) { data, response, error in
        if let error = error {
            print("Error uploading image: \(error.localizedDescription)")
            return
        }
        // 处理服务器响应
    }
    
    task.resume()
}

总结

通过以上几步,我们成功处理了 iOS 设备上传图片时由于 EXIF 方向设定导致的自动旋转 90 度的问题。每一步都至关重要,从获取图片到调整方向,再到上传图片。这个过程的重点在于正确读取 EXIF 数据并处理它,确保用户上传的照片在服务器上始终是按用户的意图显示的。

sequenceDiagram
    participant User
    participant App
    User->>App: 选择图片
    App->>App: 获取 UIImage
    App->>App: 读取 EXIF 信息
    App->>App: 调整图片方向
    App->>Server: 上传图片
    Server->>App: 上传成功

希望通过这篇文章,您能够轻松实现图片上传时的自动旋转处理。如有疑问,请随时询问!