Быстрое кодирование изображений base64 с данными EXIF - PullRequest
0 голосов
/ 09 января 2020

В настоящее время я использую кодировку base64 для преобразования и отправки нескольких изображений в файле JSON из моего приложения Swift в мой API, используя:

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

При расширении моего API я теперь хотел бы использовать богатые данные EXIF, предоставляемые большинством смартфонов, такие как информация об объективе, поле зрения или модель устройства . Наиболее важным для моей текущей цели является тег "Image Model", чтобы идентифицировать устройство, на котором был сделан снимок.

Я узнал, что в данных base64, поступающих через мой API, остались некоторые данные EXIF, но они ограничены ориентацией и очень базовой c информацией, такой как ориентация. Также, когда я напрямую печатаю base64String в XCode и анализирую его, он имеет очень плохую информацию EXIF. Технически это должно быть возможно, потому что, преобразуя одно и то же изображение в онлайн-конвертер base64 и анализируя возвращаемую строку, я могу видеть информацию EXIF, такую ​​как "Модель изображения" и т. Д. c.

Есть ли способ преобразовать мой 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
        }
    }
}

1 Ответ

1 голос
/ 09 января 2020

Вы можете использовать более новый (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 и снова конвертируете его обратно в данные, вы потеряете метаданные.

...