你好,歡迎來到IOS教程網

 Ios教程網 >> IOS訊息 >> 關於IOS >> [iOS]坑爹的ALAsset(Assets Library Framework)

[iOS]坑爹的ALAsset(Assets Library Framework)

編輯:關於IOS

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

  目前的項目有點類似dropbox,可以選擇設備內的照片然後幫你上傳文件,使用了Assets Library Framework,背景如此。       ALAsset可以看成是一個你選擇的文件的包裝類,從中可以取到一個叫做ALAssetPresentation的對象(defaultRepresentation),然後如果是圖片的話裡面可以得到全屏圖、全尺寸圖、metadata、size等等有用的信息。   問題出現了:當用戶使用iPhone/iPad內置的Photos應用修改了照片保存後,使用Assets Library Framework選擇的時候看到的是修改後的縮略圖OK;defaultPresentation裡面的全屏圖(fullScreenImage)也是修改後的OK;但是,但是!全尺寸圖(fullResolutionImage)是未修改的圖,Asset給出的文件url如果你直接上傳,大部分看圖軟件打開會顯示原圖!(起碼我們項目對接的server端生成給我們的縮略圖是原圖的縮略圖,下載這個圖直接用imageView看也是原圖),坑爹啊!   回去Photos應用打開這個圖片進入編輯狀態可以看到有個按鈕亮了,叫做”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:xmlData 11                                                      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:fullResImage 21                                                       scale:[rep scale] 22                                                 orientation:(UIImageOrientation)[rep orientation]]; 23                 // do whatever you want with the result image then. 24             } 25         } 26     }
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved