[iOS]坑爹的ALAsset(Assets Library Framework)
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对象):
// 处理被iOS自带Photos修改过的图片
if ([[asset valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) {
ALAssetRepresentation *rep = [asset defaultRepresentation];
NSString *adj = [rep metadata][@"AdjustmentXMP"];
if (adj) {
CGImageRef fullResImage = [rep fullResolutionImage];
NSData *xmlData = [adj dataUsingEncoding:NSUTF8StringEncoding];
CIImage *image = [CIImage imageWithCGImage:fullResImage];
NSError *error = nil;
NSArray *filters = [CIFilter filterArrayFromSerializedXMP:xmlData
inputImageExtent:[image extent]
error:&error];
CIContext *context = [CIContext contextWithOptions:nil];
if (filters && !error) {
for (CIFilter *filter in filters) {
[filter setValue:image forKey:kCIInputImageKey];
image = [filter outputImage];
}
fullResImage = [context createCGImage:image fromRect:[image extent]];
UIImage *result = [UIImage imageWithCGImage:fullResImage
scale:[rep scale]
orientation:(UIImageOrientation)[rep orientation]];
// do whatever you want with the result image then.
}
}
}
最后的最后,在研究此问题的同时,在小呀小苹果的官网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!
[iOS]坑爹的ALAsset(Assets Library Framework)的更多相关文章
- [iOS Xcode8报错]dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserN
[iOS Xcode8报错]dyld: Library not loaded: /System/Library/Frameworks/UserNotifications.framework/UserN ...
- iOS开发中静态库之".framework静态库"的制作及使用篇
iOS开发中静态库之".framework静态库"的制作及使用篇 .framework静态库支持OC和swift .a静态库如何制作可参照上一篇: iOS开发中静态库之" ...
- 如何在IOS开发中在自己的framework中添加.bunble文件
今天就跟大家介绍一下有关,如何在IOS开发中在自己的framework中添加.bunble文件,该文章我已经在IOS教程网(http://ios.662p.com)发布过来,个人觉得还是对大家有帮助的 ...
- Assets Library开发总结
Assets Library beta版的开发工作告一段落,本着有始有终的原则,这个项目还是需要做个总结的,恩~ 先甩一个链接:https://vimeo.com/238186671 考虑到该项目开发 ...
- iOS开发——创建你自己的Framework
如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此外,开发者也可能并不想看到你的所有代码,因为他们可 ...
- iOS在Cocoa Touch Static Library使用CocoaPods
1.在XCode中新建静态库工程:DDLogLib. 2.添加对外暴露接口的头文件DDLogLibHeader.h 3.命令行进入DDLogLib目录,运行pod init,并修改Podfile 4. ...
- iOS 动态库、静态库 . framework 总结(2017.1.25 修改)
修改于2017.1.25 使用Xcode Version 8.2.1 1.怎么创建.framework? 打开Xcode, 选择File ----> New ---> Project 选择 ...
- IOS .a静态库的和.framework制作
什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公 ...
- 【转】iOS静态库 【.a 和framework】【超详细】
原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...
随机推荐
- Latex学习笔记-序
在写论文的过程中自学了$\LaTeX$, 想总结一下使用心得.刚开始整理了一下发现非常之乱,不知这么多零碎的知识该如何整理的有条理点,至少以后用到还能翻翻自己博客.这次写作论文图省劲用了IEEE的模板 ...
- CoCreateInstance调用返回代码0x80040154的一种解决方法
引言 前面的一篇博文中总结了开发Windows Thumbnail Handler的一些经验.在公司实际项目中,需要同时针对图片和视频实现缩略图.同时还要在图片和视频文件的顶部加上LOGO.像如下这样 ...
- web性能优化:详说浏览器缓存
TOC 背景 浏览器的总流程图 一步一步说缓存 朴素的静态服务器 设置缓存超时时间 html5 Application Cache Last-Modified/If-Modified-Since Et ...
- ASP.NET MVC 之自定义HtmlHelper
前言 HtmlHelper方法为我们提供很多html标签,只需在页面调用就行了,但是微软并没有把所有的html标签都对应有了扩展方法,需要我们重新自定义HtmlHelper,来满足我们需要. 方法 如 ...
- TypeError: invalid 'in' operand obj
尝试在程序去访问远程的Web API,它在运行时,出现异常: TypeError: invalid 'in' operand obj 由于从服务器返回的数据是json.当我们需要得到这些数据时,还得需 ...
- jquery实现tab切换完整代码
代码如下,保存到html文件打开: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " ...
- 基于小脚丫的ADC081S101 电压采集595数码管显示
RTL结构图 采集模块运用SPI 通讯 MISO方式收集数据 module ad_collect(input sddata,input rst_n,output reg cs,output reg s ...
- Javascript面向对象(封装、继承)
Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...
- Atitit. null错误的设计 使用Optional来处理null
Atitit. null错误的设计 使用Optional来处理null 然后,我们再看看null还会引入什么问题. 看看下面这个代码: String address = person.getCount ...
- [deviceone开发]-一个固定列,可以上下左右滑动的表格示例
一.简介 一个类型table的例子,第一列和第二列可以固定,剩下的后面的很多列都可以左右滑动,也可以上下滑动,这种需求一般是为了展示多列表格数据.这个例子是通过二大部分: 左边是一个普通的listvi ...