[iOS]坑爹的ALAsset(AssetsLibraryFramework)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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修改过的图片2if([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {3ALAssetRepresentation *rep =[asset defaultRepresentation];4NSString *adj = [rep metadata][@"AdjustmentXMP"];5if(adj) {6CGImageRef fullResImage =[rep fullResolutionImage];7NSData *xmlData =[adj dataUsingEncoding:NSUTF8StringEncoding];8CIImage *image =[CIImage imageWithCGImage:fullResImage];9NSError *error =nil;10NSArray *filters =[CIFilter filterArrayFromSerializedXMP:xmlData11inputImageExtent:[image extent]12error:&error];13CIContext *context =[CIContext contextWithOptions:nil];14if(filters && !error) {15for(CIFilter *filterinfilters) {16[filter setValue:image forKey:kCIInputImageKey];17image =[filter outputImage];18}19fullResImage =[context createCGImage:image fromRect:[image extent]];20UIImage *result =[UIImage imageWithCGImage:fullResImage21scale:[rep scale]22orientation:(UIImageOrientation)[rep orientation]];23//do whatever you want with the result image then.24}25}26}

最后的最后,在研究此问题的同时,在小呀小苹果的官网Assets Library Framework Reference中发现如下一段话:

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!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航