ios - 使用 EXIF 数据的 Swift base64 图像编码

标签 ios swift base64 exif

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

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

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

我发现在通过我的 API 传输的 base64 数据中有一些 EXIF 数据,但它仅限于方向和非常基本的信息,例如方向。此外,当我直接在 Xcode 中打印 base64String 并对其进行分析时,它的 EXIF 信息非常差。从技术上讲,这应该是可能的,因为在 online base64 converter 中转换相同的图像并分析返回的字符串,我能够看到 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+) 委托(delegate)方法:

    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 并将其再次转换回数据,那么您已经丢失了元数据。

关于ios - 使用 EXIF 数据的 Swift base64 图像编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59662966/

相关文章:

javascript - 将 ImageData 对象(不是 Canvas )转换为图像数据 URL

ios - 如何通过 panGestureRecognizer 启用 collectionView 分页

ios - 快速更改 View 时的动画

ios - 获取数据时返回相同的 YouTube 视频

ios - 如何在 UIPageViewController 中从一页动画到另一页时设置 View 的背景颜色

HTML:嵌入没有 base64 压缩的二进制图像

ios - 如何重用我构建的 View

swift - 多次初始化惰性属性会产生什么潜在影响?

ios - CollectionViewCell 内向上移动标签动画

javascript - 无法在 JavaScript 中解码 Base64