From f5cdab323880d4eb71d8ad1e8398dc1dd2b07cab Mon Sep 17 00:00:00 2001 From: Ahmad Daneshvar Date: Wed, 23 May 2018 18:41:29 +0430 Subject: [PATCH] Add metaExif to YPMediaPhoto Now YPMediaPhoto has its image meta data (EXIF) view metaExif property --- .gitignore | 2 +- Source/Helpers/YPHelper.swift | 24 ++++++++++++++++++++++ Source/Models/YPMediaItem.swift | 4 +++- Source/Pages/Gallery/YPLibraryVC.swift | 10 ++++++--- Source/YPPickerVC.swift | 28 +++++++++++++------------- 5 files changed, 49 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index 94c3beff9..e5f065422 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ .DS_Store # Xcode -# build/ +build/ *.pbxuser !default.pbxuser *.mode1v3 diff --git a/Source/Helpers/YPHelper.swift b/Source/Helpers/YPHelper.swift index f5e1d9fd2..53b4ec8d7 100644 --- a/Source/Helpers/YPHelper.swift +++ b/Source/Helpers/YPHelper.swift @@ -8,6 +8,7 @@ import Foundation import UIKit +import Photos internal func ypLocalized(_ str: String) -> String { return NSLocalizedString(str, @@ -65,4 +66,27 @@ struct YPHelper { let minutes = (interval / 60) % 60 return String(format: "%02d:%02d", minutes, seconds) } + + public static func unwrapImageMetaAssets(asset : PHAsset) -> [String : Any]?{ + let imageRequestOptions = PHImageRequestOptions() + imageRequestOptions.isSynchronous = true + + var returnValue = [String : Any]() + + PHImageManager.default().requestImageData(for: asset, options: imageRequestOptions) { (data, dataUTI, orientation, info) in + + returnValue = self.metadataForImageData(data: data!) + } + + return returnValue + } + + private static func metadataForImageData(data : Data) -> [String : Any]{ + let imageSource = CGImageSourceCreateWithData(data as CFData, nil) + + let imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource!, 0, nil) + + return imageProperties! as! [String : Any] + + } } diff --git a/Source/Models/YPMediaItem.swift b/Source/Models/YPMediaItem.swift index ad550bc30..e8bc49dcb 100644 --- a/Source/Models/YPMediaItem.swift +++ b/Source/Models/YPMediaItem.swift @@ -15,11 +15,13 @@ public class YPMediaPhoto { public let originalImage: UIImage public var modifiedImage: UIImage? public let fromCamera: Bool + public let exifMeta : [String : Any]? - init(image: UIImage, fromCamera: Bool = false) { + init(image: UIImage, exifMeta : [String : Any]? = nil, fromCamera: Bool = false) { self.originalImage = image self.modifiedImage = nil self.fromCamera = fromCamera + self.exifMeta = exifMeta } } diff --git a/Source/Pages/Gallery/YPLibraryVC.swift b/Source/Pages/Gallery/YPLibraryVC.swift index 6c94923e8..7076d7194 100644 --- a/Source/Pages/Gallery/YPLibraryVC.swift +++ b/Source/Pages/Gallery/YPLibraryVC.swift @@ -365,7 +365,7 @@ public class YPLibraryVC: UIViewController, YPPermissionCheckable { } } - public func selectedMedia(photoCallback: @escaping (_ photo: UIImage) -> Void, + public func selectedMedia(photoCallback: @escaping (_ photo: UIImage, _ exifMeta : [String : Any]?) -> Void, videoCallback: @escaping (_ videoURL: URL) -> Void, multipleItemsCallback: @escaping (_ items: [YPMediaItem]) -> Void) { DispatchQueue.global(qos: .userInitiated).async { @@ -394,7 +394,9 @@ public class YPLibraryVC: UIViewController, YPPermissionCheckable { case .image: self.fetchImageAndCrop(for: asset.asset, withCropRect: asset.cropRect) { image in let resizedImage = self.resizedImageIfNeeded(image: image) - let photo = YPMediaPhoto(image: resizedImage) + let exifMeta = YPHelper.unwrapImageMetaAssets(asset: asset.asset) + let photo = YPMediaPhoto(image: resizedImage, exifMeta: exifMeta) + resultMediaItems.append(YPMediaItem.photo(p: photo)) asyncGroup.leave() } @@ -430,7 +432,9 @@ public class YPLibraryVC: UIViewController, YPPermissionCheckable { DispatchQueue.main.async { self.delegate?.libraryViewFinishedLoading() let resizedImage = self.resizedImageIfNeeded(image: image) - photoCallback(resizedImage) + let exifMeta = YPHelper.unwrapImageMetaAssets(asset: asset) + + photoCallback(resizedImage, exifMeta) } } case .audio, .unknown: diff --git a/Source/YPPickerVC.swift b/Source/YPPickerVC.swift index 1bf6769ef..cb628e9d8 100644 --- a/Source/YPPickerVC.swift +++ b/Source/YPPickerVC.swift @@ -21,13 +21,13 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { /// Private callbacks to YPImagePicker public var didClose:(() -> Void)? public var didSelectItems: (([YPMediaItem]) -> Void)? - + enum Mode { case library case camera case video } - + private var libraryVC: YPLibraryVC? private var cameraVC: YPCameraVC? private var videoVC: YPVideoVC? @@ -38,9 +38,9 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { public override func viewDidLoad() { super.viewDidLoad() - + view.backgroundColor = UIColor(r: 247, g: 247, b: 247) - + delegate = self // Library @@ -54,7 +54,7 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { cameraVC = YPCameraVC() cameraVC?.didCapturePhoto = { [unowned self] img in self.didSelectItems?([YPMediaItem.photo(p: YPMediaPhoto(image: img, - fromCamera: true))]) + fromCamera: true))]) } } @@ -64,11 +64,11 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { videoVC?.didCaptureVideo = { [unowned self] videoURL in self.didSelectItems?([YPMediaItem .video(v: YPMediaVideo(thumbnail: thumbnailFromVideoPath(videoURL), - videoURL: videoURL, - fromCamera: true))]) + videoURL: videoURL, + fromCamera: true))]) } } - + // Show screens var vcs = [UIViewController]() for screen in YPConfig.screens { @@ -88,7 +88,7 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { } } controllers = vcs - + // Select good mode if YPConfig.screens.contains(YPConfig.startOnScreen) { switch YPConfig.startOnScreen { @@ -192,7 +192,7 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { func navBarTapped() { let vc = YPAlbumVC() let navVC = UINavigationController(rootViewController: vc) - + vc.didSelectAlbum = { [weak self] album in self?.libraryVC?.setAlbum(album) self?.libraryVC?.title = album.title @@ -211,7 +211,7 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { label.text = aTitle // Use standard font by default. label.font = UIFont.boldSystemFont(ofSize: 17) - + // Use custom font if set by user. if let navBarTitleFont = UINavigationBar.appearance().titleTextAttributes?[.font] as? UIFont { // Use custom font if set by user. @@ -286,13 +286,13 @@ public class YPPickerVC: YPBottomPager, YPBottomPagerDelegate { if mode == .library { libraryVC.doAfterPermissionCheck { [weak self] in - libraryVC.selectedMedia(photoCallback: { img in + libraryVC.selectedMedia(photoCallback: { img, exifMeta in self?.didSelectItems?([YPMediaItem - .photo(p: YPMediaPhoto(image: img))]) + .photo(p: YPMediaPhoto(image: img, exifMeta: exifMeta))]) }, videoCallback: { videoURL in self?.didSelectItems?([YPMediaItem .video(v: YPMediaVideo(thumbnail: thumbnailFromVideoPath(videoURL), - videoURL: videoURL))]) + videoURL: videoURL))]) }, multipleItemsCallback: { items in self?.didSelectItems?(items) })