概要
iPhoneのカメラ、写真を使った処理についてメモレベルでまとめます。
画像をそのまま保存するとデータが大きくなり過ぎるかなと思い、デフォルトの写真に保存されている画像のパスだけをアプリ内で持っておけばデータはそこまで大きくならないかと思い、色々と調べました。その際に画像のパス→UIImageに変換する流れをまとめています。
写真の表示
iPhoneのデフォルトの写真一覧を表示させます。
import AssetsLibrary
func pickImageFromLibrary() {
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
let imagePicker = UIImagePickerController()
imagePicker.delegate = self
imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
// 新たに追加したカメラロール表示ViewControllerをpresentViewControllerにする
self.presentViewController(imagePicker, animated: true, completion: nil)
}
}
写真から画像のパスを取得
写真が選択された時に呼ばれるメソッドです。
import AssetsLibrary
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: AnyObject]) {
if info[UIImagePickerControllerOriginalImage] != nil {
// 画像のパスを取得
let imageUrl = info[UIImagePickerControllerReferenceURL] as? NSURL
}
}
ちなみにimageUrl
にはこんな感じの値が入ってますassets-library://asset/asset.JPG?id=106E99A1-4F6A-45A2-B320-B0AD4A8E8473&ext=JPG
info[UIImagePickerControllerOriginalImage] as? UIImage
にするとそのままUIImageを取得できます。
カメラロールの画像パスからUIImageにする
上記で取得した画像パスからUIImageに変換するためにPhotos frameworkを使います。
参考:Photos frameworkを使ってiPhoneアルバム内の写真を取得・削除する+α
import Photos
let fetchResult: PHFetchResult = PHAsset.fetchAssetsWithALAssetURLs([url], options: nil)
let asset: PHAsset = fetchResult.firstObject as! PHAsset
let manager = PHImageManager.defaultManager()
manager.requestImageForAsset(asset, targetSize: CGSize(width: 140, height: 140), contentMode: .AspectFill, options: nil) { (image, info) in
// imageをセットする
imageView.image = image
}
おわりに
アプリ内に画像のパスだけ保存しておくと元の写真が削除されるとアプリからデータをひけなくなるため(当たり前)アプリ内でもパスではなく画像を保存しておいた方がよいなと思い、これ自体あんまり意味なかったかなと後から気づきました。。