UIImagePickerController是iOS系統(tǒng)提供的選取相冊圖片和進(jìn)行拍照的視圖控制器壳炎,可以通過delegate的方法獲取UIImage對象,進(jìn)行后續(xù)操作。UIImage對象只是一個圖像對象,無法從中獲取圖像的原始信息忧侧,比如原圖數(shù)據(jù),格式等牌芋。
我們來看下UIImagePickerControllerDelegate中的回調(diào)方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info;
其中info的信息給訪問原始數(shù)據(jù)提供了可能蚓炬。info包含的鍵如下
NSString *const UIImagePickerControllerMediaType ;指定用戶選擇的媒體類型(文章最后進(jìn)行擴(kuò)展)
NSString *const UIImagePickerControllerOriginalImage ;原始圖片
NSString *const UIImagePickerControllerEditedImage ;修改后的圖片
NSString *const UIImagePickerControllerCropRect ;裁剪尺寸
NSString *const UIImagePickerControllerMediaURL ;媒體的URL
NSString *const UIImagePickerControllerReferenceURL ;原件的URL
NSString *const UIImagePickerControllerMediaMetadata;當(dāng)來數(shù)據(jù)來源是照相機(jī)的時候這個值才有效
info中的key值
其中UIImagePickerControllerReferenceURL是原始文件的URL,我們可以通過它來訪問原始圖片信息躺屁。這里需要注意的是试吁,這個URL不是沙盒文件路徑的URL,而是一個AssetURL,需要系統(tǒng)提供的AssetsLibrary框架進(jìn)行訪問熄捍。
ALAssetsLibrary可以實(shí)現(xiàn)查看相冊列表烛恤,增加相冊,保存圖片到相冊等功能余耽。它的組成比較符合照片庫本身的組成缚柏,照片庫中的完整照片庫對象、相冊碟贾、相片都能在 AssetsLibrary 中找到一一對應(yīng)的組成币喧,這使到 AssetsLibrary 的使用變得直觀而方便。
下面來看一下如何通過info信息讀取原始圖片的數(shù)據(jù)
NSURL *imageAssetUrl = [info objectForKey:UIImagePickerControllerReferenceURL];
ALAssetsLibrary *assetLibrary=[[ALAssetsLibrary alloc] init];
[assetLibrary assetForURL:imageAssetUrl resultBlock:^(ALAsset *asset) {
ALAssetRepresentation* representation = [asset defaultRepresentation];
// 創(chuàng)建一個buffer保存圖片數(shù)據(jù)
uint8_t *buffer = (Byte*)malloc(representation.size);
NSUInteger length = [representation getBytes:buffer fromOffset: 0.0 length:representation.size error:nil];
// 將buffer轉(zhuǎn)換為NSData object袱耽,然后釋放buffer內(nèi)存
NSData *imageData = [[NSData alloc] initWithBytesNoCopy:buffer length:representation.size freeWhenDone:YES];
} failureBlock:^(NSError *error) {
//失敗的處理
}];
這里需要注意的是杀餐,讀取圖片的信息是一個異步操作。
在iOS8以后朱巨,蘋果提供一套全新的框架PhotoKit來代替ALAssetsLibrary史翘。PhotoKit 是一套比 AssetsLibrary 更完整也更高效的庫,對資源的處理跟 AssetsLibrary 也有很大的不同冀续。
下面再來看一下如何使用PhotoKit框架讀取原始圖片的數(shù)據(jù)
NSURL *imageAssetUrl = [info objectForKey:UIImagePickerControllerReferenceURL];
PHFetchResult*result = [PHAsset fetchAssetsWithALAssetURLs:@[imageAssetUrl] options:nil];
PHAsset *asset = [result firstObject];
PHImageRequestOptions *phImageRequestOptions = [[PHImageRequestOptions alloc] init];
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:phImageRequestOptions resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
NSData *imageData = imageData;
}];
PHImageRequestOptions中可以指定請求是同步或者異步琼讽。
對于AssetsLibrary框架和PhotoKit框架的使用想要深入了解的同學(xué)可以參考iOS 開發(fā)之照片框架詳解。
以上獲取原圖數(shù)據(jù)的代碼洪唐,可以實(shí)現(xiàn)類似微信發(fā)送原圖的功能钻蹬。