[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对象):

 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

Thx for reading!

时间: 2024-12-19 09:56:06

[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 升级了Xcode8,但是我的真机是iOS7系统,在我解决了Xcode8不支持iOS7系统以后(http://blog.csdn.net/iOSTianNan/article/details/52619319),真机调试出现如下报错 dyld: Library not loaded: /System

iOS在Cocoa Touch Static Library使用CocoaPods

1.在XCode中新建静态库工程:DDLogLib. 2.添加对外暴露接口的头文件DDLogLibHeader.h 3.命令行进入DDLogLib目录,运行pod init,并修改Podfile 4.运行pod install,并打开DDLogLib.xcworkspace. 5.运行pod spec create DDLogLib,创建DDLogLib.podspec文件,并编辑. #  Be sure to run `pod spec lint DDLogLib.podspec' to en

iOS开发——创建你自己的Framework

http://www.cocoachina.com/ios/20150127/11022.html (原文:How to Create a Framework for iOS 作者:Sam Davies 译者:Mr_cyz ) 在上一篇教程(中译版)中,你学到了怎么样创建一个可复用的圆形旋钮控件.然而你可能不清楚怎样让其他开发者更方便地去复用它. 如果你想将你开发的控件与别人分享,一种方法是直接提供源代码文件.然而,这种方法并不是很优雅.它会暴露所有的实现细节,而这些实现你可能并不想开源出来.此

iOS封装功能生成静态库.Framework

在实现iOS模块化开发的过程中,可以把固定的业务模块生静态库. 本文将基于Xcode9.2创建一个简单的工程,教大家如何制作一个自己的framework,目的就是简单易学的制作framework.这种方法可以使得你的代码易分享,在多个工程中复用,并且可以隐藏实现细节,控制公开的头文件. 1. 打开Xcode,新建工程.不要选择"Application",选择"Framework & Library".选择第一个,然后Next. 2. 创建相关的功能类 我在这

IOS运行报错 "dyld: Library not loaded" 原因分析

我们的游戏IOS版在接入易接SDK后,启动出现如下错误 dyld: Library not loaded: @rpath/OnlineAHelper.framework/OnlineAHelper Referenced from: /var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/yzg Reason: no suitable image found. Did find:

【转】iOS静态库 【.a 和framework】【超详细】

原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.iOS中的静态库有 .a 和 .framework两种形式:动态库有.dylib 和 .framework 形式,后来.dylib动态库又被苹果替换成.tbd的形式. 二.静态库与动态库的区别? 静态库: 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝.

iOS 报错 : dyld: Library not loaded: @rpath/

今天用阿里短视频点播短视频服务按照上边引导导入sdk后编译报错: dyld: Library not loaded: @rpath/ 整了半天 结果是目前iOS的短视频SDK输出的都是动态库,需要以动态库的方式添加. 需要在MyApp的工程中做如下配置

IOS 中的CoreImage框架(framework)

http://www.cnblogs.com/try2do-neo/p/3601546.html coreimage framework 组成 apple 已经帮我们把image的处理分类好,来看看它的结构: 主要分为三部分: 1)定义部分:CoreImage 何CoreImageDefines.见名思义,代表了CoreImage 这个框架和它的定义. 2)操作部分: 滤镜(CIFliter):CIFilter 产生一个CIImage.典型的,接受一到多的图片作为输入,经过一些过滤操作,产生指定

c basic library framework - simplec 2.0.0

前言 - simplec 单元测试 流程介绍 一个关于C基础库 simplec 2.0.0 发布了. 详细的文档介绍请参照 README.md. 说的再多都无用, 抵不上 gdb 一个 b r n. 本文就简单介绍一下 simplec 中怎么添加单元测试功能. simplec winds Debug 启动流程是 main -> simplec_main -> simplec_test. 所以所有的 单元测试都采用如下结构 /* * simple c 单元测试主函数 * return : voi