我目前正在使用 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 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 并将其再次转换回数据,您就会丢失元数据。
我确实有类似的问题,想了解我在哪里丢失了 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