Just a Computer Graphics Studio & My Life

現代人使用智慧手機已經脫離不了「相機」,於是許多應用需要取得本機相片 (Fetch Photos from Photo Library),我們開發者要怎麼做,才能輕易取得使用者珍貴的相片呢?

取得本機相片 (Fetch Photos from Photo Library).jpg

這時候就要借用iOS 8新出現的Photos Framework

/**
 Theme: Fetch Photos from Photo Library
 IDE: Xcode 8
 Language: Objective C
 Date: 105/12/18
 Author: HappyMan
 Blog: https://cg2010studio.wordpress.com/
 */
 // photo url
NSString *urlStr = [NSString stringWithFormat:@"assets-library://asset/asset.JPG?id=%@&ext=JPG", selectedPhotoArr[index]];
NSURL *url = [NSURL URLWithString:urlStr];
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[url] options:nil];
PHAsset *asset = fetchResult.firstObject;
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.synchronous = YES;

[[PHImageManager defaultManager] requestImageForAsset:asset
                                           targetSize:CGSizeMake(500, 500)
                                          contentMode:PHImageContentModeAspectFit
                                              options:options
                                        resultHandler:^(UIImage *img, NSDictionary *info) {

                                        }];

取得image後有兩個參數:

Printing description of img:

<UIImage: 0x174297f70>, {500, 374}

Printing description of info:

{
PHImageFileOrientationKey = 0;
PHImageFileSandboxExtensionTokenKey = “eef7822c2da2198f257ddf4707eb69570be47937;00000000;00000000;000000000000001a;com.apple.app-sandbox.read;00000001;01000002;0000000004242c83;/private/var/mobile/Media/DCIM/135APPLE/IMG_5172.JPG";
PHImageFileURLKey = “file:///var/mobile/Media/DCIM/135APPLE/IMG_5172.JPG";
PHImageFileUTIKey = “public.jpeg";
PHImageResultDeliveredImageFormatKey = 9999;
PHImageResultIsDegradedKey = 0;
PHImageResultIsInCloudKey = 0;
PHImageResultIsPlaceholderKey = 0;
PHImageResultOptimizedForSharing = 0;
PHImageResultWantedImageFormatKey = 4035;
}

Options參數很重要,決定是否要同步或非同步來處理,多次獲取同一張相片,但是第一次先獲取低解析度版本相片,之後獲取高低解析度版本相片。

發現似乎resizeMode設定為PHImageRequestOptionsResizeModeExact,targetSize才有作用,如此來取得我們所想要大小的相片。過去在這卡很久,以為只能取得超低解析度(如75×50)和原始圖(如2160×3720)。

其中Photo ID長得像這樣:

703E488F-9E52-475E-84F9-289DE6A31D00

然後把它組合成URL:

assets-library://asset/asset.JPG?id=703E488F-9E52-475E-84F9-289DE6A31D00&ext=JPG

於是乎就能取得Asset來獲得真正的影像檔喔!

參考:

Advertisements

發表留言

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

標籤雲

%d 位部落客按了讚: