Swift 使用 EXIF 数据进行 base64 图像编码

Swift base64 image encoding with EXIF data

我目前正在使用 base64 编码将 JSON 文件中的多个图像从我的 Swift 应用程序转换并发送到我的 API 使用:

let imageData = image.jpegData(compressionQuality: 1.0)
let sSideL = imageData.base64EncodedString(options: .lineLength64Characters)

在扩展我的 API 时,我现在想使用大多数智能手机提供的丰富 EXIF 数据,例如镜头信息、视野或 设备型号 。对我当前的目的来说最重要的是 "Image Model" 标签,用于识别拍摄照片的设备。

我发现 base64 数据中有一些 EXIF 数据来自我的 API,但它仅限于方向和非常基本的信息,如方向。另外,当我直接在 Xcode 中打印 base64String 并对其进行分析时,它的 EXIF 信息非常差。从技术上讲它应该是可能的,因为在 online base64 converter 中转换相同的图像并分析返回的字符串,我能够看到像 "Image Model" 等的 EXIF 信息

有没有办法将我的 UIImage 转换为保留所有 EXIF 详细信息的 base64 字符串?

API代表我系统的主要部分,所以我想尽可能简单,不添加额外的上传参数。

编辑 这是我捕获 UIImage

的代码
extension CameraController: AVCapturePhotoCaptureDelegate {


    public func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
                        resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Swift.Error?) {

        if let error = error {
            // ERROR
        }
        else if let buffer = photoSampleBuffer,
            let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer, previewPhotoSampleBuffer: nil),
            let image = UIImage(data: data) {

            // SEND IMAGE TO SERVER
        }
        else {
            // UNKNOWN ERROR
        }
    }
}

您可以使用较新的 (iOS 11+) 委托方法:

    public func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
            if let error = error {
        // ERROR
            } else if let data = photo.fileDataRepresentation() {

        // SEND IMAGE DATA TO SERVER
    }
    else {
        // UNKNOWN ERROR
    }
}

或您使用的方法:

    public func photoOutput(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhoto photoSampleBuffer: CMSampleBuffer?, previewPhoto previewPhotoSampleBuffer: CMSampleBuffer?,
                    resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Swift.Error?) {

    if let error = error {
        // ERROR
    } else if let buffer = photoSampleBuffer,
        let data = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: buffer, previewPhotoSampleBuffer: nil) {
        // SEND IMAGE DATA TO SERVER
    }
    else {
        // UNKNOWN ERROR
    }
}

就像提到的 leo-dabus 一样,您需要将图像数据发送到服务器,其中包含元数据。如果您首先创建一个 UIImage 并将其再次转换回数据,那么您已经丢失了元数据。