Assets修复photos修改后在assets全屏图片不对bug
2015-03-02 11:11
323 查看
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对象):
最后的最后,在研究此问题的同时,在小呀小苹果的官网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
目前的项目有点类似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 }
最后的最后,在研究此问题的同时,在小呀小苹果的官网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
相关文章推荐
- 分批载入:载入XML数与图片数不相同(一次载入25个xml图片地址,点击下一页载入5张图片)(存在BUG,未修复)
- kingcms5部分BUG修复和修改技巧
- 修复图片移入移出抖动错位bug
- BOS项目练习3(修复window控件BUG,添加/修改/作废取派员,datagrid使用,分页查询(DetachedCriteria离线),formatter函数)
- 框架 day49 BOS项目练习3(修复window控件BUG,添加/修改/作废取派员,datagrid使用,分页查询(DetachedCriteria离线),formatter函数)
- uubox.net 网站的第二阶段完成,修复了部分的bug,增加了图片浏览和mp3在线播放等功能
- Git 修复 bug 切换分支时,如何保存修改过的代码(即如何保存现场)?
- 图片上传4-bug修复
- 图片上传4-bug修复
- jquery-lazyload延迟加载图片 及 加载顺序 bug 修复
- 修改subsonic源码,修复一个多表查询的排序bug
- C# Windows Phone App 开发,自制LockScreen 锁定画面类别(Class),从【网路图片】、【Assets资源】、【UI】修改锁定画面。
- (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明
- JSPatch动态修改已上架app的bug,即时修复bug
- 修复百度编辑器(UM)禁用时上传图片按钮还可点击的BUG;
- 分批载入:载入XML数与图片数不相同(一次载入25个xml图片地址,点击下一页载入5张图片)(存在BUG,未修复)
- html Demo工具类:网页使用ie另存为htm文件时,css样式文件的图片路径不对,进行修改,并下载图片
- uploadify 插件使用 包含 增删,修改样式,类似邮箱里的 添加附件 功能,也修复了uploadify存在的bug
- PIGCMS微信开发中上传图片失败的BUG修复
- [Android算法] 【04/28 bug修改】android图片压缩终极解决方案