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

问题描述 投票:0回答:2

我目前正在使用 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 信息非常差。从技术上讲,这应该是可能的,因为在在线base64转换器中转换相同的图像并分析返回的字符串,我能够看到EXIF信息,例如“图像模型”等。

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

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 swift base64 exif
2个回答
1
投票

您可以使用较新的(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 并将其再次转换回数据,您就会丢失元数据。


0
投票

我确实有类似的问题,想了解我在哪里丢失了 EXIF 信息。这是我在教程中找到的代码示例,用于将图像上传到服务器。

for a in 0..<self.selectedImages.count {
        let imageData: Data = self.selectedImages[a].jpegData(compressionQuality: 1.0)!
        imageStr.append(imageData.base64EncodedString())
    }

    guard let data = try? JSONSerialization.data(withJSONObject: imageStr, options: []) else {
        return
    }

    let jsonImageString: String = String(data: data, encoding: String.Encoding.utf8) ?? ""
    let urlString: String = "imageStr=" + jsonImageString
© www.soinside.com 2019 - 2024. All rights reserved.