国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

[iOS]坑爹的ALAsset(AssetsLibraryFramework)

2019-11-14 20:01:54
字體:
來源:轉載
供稿:網(wǎng)友

Assets Library Framework 可以用來做iOS上的多選器,選照片視頻啥的啦就不介紹了。

目前的項目有點類似dropbox,可以選擇設備內的照片然后幫你上傳文件,使用了Assets Library Framework,背景如此。

 

ALAsset可以看成是一個你選擇的文件的包裝類,從中可以取到一個叫做ALAssetPResentation的對象(defaultRepresentation),然后如果是圖片的話里面可以得到全屏圖、全尺寸圖、metadata、size等等有用的信息。

問題出現(xiàn)了:當用戶使用iphone/iPad內置的Photos應用修改了照片保存后,使用Assets Library Framework選擇的時候看到的是修改后的縮略圖OK;defaultPresentation里面的全屏圖(fullScreenImage)也是修改后的OK;但是,但是!全尺寸圖(fullResolutionImage)是未修改的圖,Asset給出的文件url如果你直接上傳,大部分看圖軟件打開會顯示原圖!(起碼我們項目對接的server端生成給我們的縮略圖是原圖的縮略圖,下載這個圖直接用imageView看也是原圖),坑爹啊!

回去Photos應用打開這個圖片進入編輯狀態(tài)可以看到有個按鈕亮了,叫做”Revert to Original“,點一下圖片還原了。

原理是Photos對圖片的處理,并沒有真的保存一個新的圖片,而是將處理通過一個叫做”AdjustmentXMP“的屬性寫進原圖的metadata中了。

 

這可如何是好?經過研究得出了下面的解決方案,希望對不知道的人有所幫助:

1. 判斷asset是圖片

2. 取到asset中的defaultRepresentation(以下簡稱rep)

3. 取到rep中metadata的”AdjustmentXMP“(以下簡稱adj)

4. 如果有adj,將adj變成一組CIFilter

5. 取到原圖fullResolutionImage(以下簡稱img)

6. 使用CIFilter逐一”加工“img,最后生成的就是想要的圖片了

7. do whatever you want... 比如我們項目是把生成的圖片存成臨時文件然后上傳

 

示例代碼如下(asset是Assets Library Framework返回的ALAsset對象):

 1 // 處理被iOS自帶Photos修改過的圖片 2     if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) { 3         ALAssetRepresentation *rep = [asset defaultRepresentation]; 4         NSString *adj = [rep metadata][@"AdjustmentXMP"]; 5         if (adj) { 6             CGImageRef fullResImage = [rep fullResolutionImage]; 7             NSData *xmlData = [adj dataUsingEncoding:NSUTF8StringEncoding]; 8             CIImage *image = [CIImage imageWithCGImage:fullResImage]; 9             NSError *error = nil;10             NSArray *filters = [CIFilter filterArrayFromSerializedXMP:xmlData11                                                      inputImageExtent:[image extent]12                                                                 error:&error];13             CIContext *context = [CIContext contextWithOptions:nil];14             if (filters && !error) {15                 for (CIFilter *filter in filters) {16                     [filter setValue:image forKey:kCIInputImageKey];17                     image = [filter outputImage];18                 }19                 fullResImage = [context createCGImage:image fromRect:[image extent]];20                 UIImage *result = [UIImage imageWithCGImage:fullResImage21                                                       scale:[rep scale]22                                                 orientation:(UIImageOrientation)[rep orientation]];23                 // do whatever you want with the result image then.24             }25         }26     }

 

最后的最后,在研究此問題的同時,在小呀小蘋果的官網(wǎng)Assets Library Framework Reference發(fā)現(xiàn)如下一段話:

IMPORTANT

In iOS 8.0 and later, use the Photos framework instead of the Assets Library framework. The Photos framework provides more features and better performance for working with a user’s photo library. See Photos Framework Reference

 

 

Thx for reading!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 塔河县| 连南| 鄂尔多斯市| 河曲县| 唐山市| 始兴县| 金塔县| 陵水| 安乡县| 滨州市| 怀来县| 梧州市| 阜城县| 历史| 宁夏| 永泰县| 南昌市| 女性| 鄂托克前旗| 上思县| 那坡县| 乐平市| 达孜县| 三穗县| 莱阳市| 嘉祥县| 新源县| 成武县| 南溪县| 阿拉善盟| 清水县| 新化县| 时尚| 石家庄市| 甘德县| 大同县| 长子县| 万安县| 无极县| 平和县| 林周县|