cache original image data in iOS

This commit is contained in:
Wenqi Li 2021-01-10 14:57:40 +08:00
parent 25e91dd962
commit f9acd58270

View File

@ -330,17 +330,17 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
options: options,
resultHandler: { (data: Data?, uti: String?, orientation, info) in
DispatchQueue.main.async(execute: {
guard let originalData = data else {
guard let imageData = data else {
completion(nil, NSError(domain: "photo_gallery", code: 404, userInfo: nil))
return
}
guard let jpgData = self.convertToJpeg(originalData: originalData) else {
completion(nil, NSError(domain: "photo_gallery", code: 500, userInfo: nil))
guard let assetUTI = uti else {
completion(nil, NSError(domain: "photo_gallery", code: 404, userInfo: nil))
return
}
// Writing to file
let filepath = self.exportPathForAsset(asset: asset, ext: ".jpg")
try! jpgData.write(to: filepath, options: .atomic)
let fileExt = self.toFileExtension(uti: assetUTI)
let filepath = self.exportPathForAsset(asset: asset, ext: fileExt)
try! imageData.write(to: filepath, options: .atomic)
completion(filepath.absoluteString, nil)
})
})
@ -380,27 +380,6 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
]
}
/// Converts to JPEG, and keep EXIF data.
private func convertToJpeg(originalData: Data) -> Data? {
guard let image: UIImage = UIImage(data: originalData) else { return nil }
let originalSrc = CGImageSourceCreateWithData(originalData as CFData, nil)!
let options = [kCGImageSourceShouldCache as String: kCFBooleanFalse]
let originalMetadata = CGImageSourceCopyPropertiesAtIndex(originalSrc, 0, options as CFDictionary)
guard let jpeg = image.jpegData(compressionQuality: 1.0) else { return nil }
let src = CGImageSourceCreateWithData(jpeg as CFData, nil)!
let data = NSMutableData()
let uti = CGImageSourceGetType(src)!
let dest = CGImageDestinationCreateWithData(data as CFMutableData, uti, 1, nil)!
CGImageDestinationAddImageFromSource(dest, src, 0, originalMetadata)
if !CGImageDestinationFinalize(dest) { return nil }
return data as Data
}
private func exportPathForAsset(asset: PHAsset, ext: String) -> URL {
let mediumId = asset.localIdentifier
.replacingOccurrences(of: "/", with: "__")
@ -441,4 +420,12 @@ public class SwiftPhotoGalleryPlugin: NSObject, FlutterPlugin {
let swiftType = toSwiftMediumType(value: mediumType)
return NSPredicate(format: "mediaType = %d", swiftType!.rawValue)
}
private func toFileExtension(uti: String) -> String {
if let ext = UTTypeCopyPreferredTagWithClass(uti as CFString, kUTTagClassFilenameExtension as CFString)?.takeRetainedValue() as String? {
return ext
} else {
return ""
}
}
}