如何使用 ALAsset 获得图像的裁剪版本?
Posted
技术标签:
【中文标题】如何使用 ALAsset 获得图像的裁剪版本?【英文标题】:How do you get the cropped version of an image using ALAsset? 【发布时间】:2012-07-19 20:54:10 【问题描述】:我正在尝试获取使用 ALAsset 提取的图像的裁剪版本。具体来说,我从用户的照片库中选择项目,然后上传它们。问题是在库缩略图视图中,ios 向我们展示了裁剪后的版本。当您选择该缩略图并使用 ALAsset 提取该图像的资产时,我得到了完整分辨率版本。 我做了一些研究,但找不到任何有助于获得第二个裁剪发生位置的坐标系。
要对其进行测试,您需要 iOS5 来编辑库中的图像。在您的图片库中选择一张图片,选择“编辑”,然后裁剪图片。当您获得 ALAsset 时,您将获得完整的图像,如果您使用 iPhoto 进行同步,iPhoto 也会提取完整的图像。此外,您可以重新编辑图像并撤消裁剪。
这就是我获取图像的方式:
UIImage *tmpImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];
显然,这给了我全分辨率的图像。有一个 fullScreenImage 标志,可以将全分辨率图像缩放到屏幕大小。这不是我想要的。
ALAssetRepresenation 类有一个比例字段,但这是一个浮点值,这也是我不想要的。
如果有人能告诉我在哪里可以找到这个裁剪后的坐标系,我将不胜感激。
【问题讨论】:
【参考方案1】:您的选择:
选项 1 (ALAssetLibrary)
使用AlAssetRepresentation
的- (CGImageRef)fullScreenImage
方法。
优点:
所有繁重的工作都为您完成,您将获得与照片应用程序中的图像一样的图像。这包括裁剪和其他更改。简单。缺点:
分辨率是“屏幕尺寸”,仅与您使用的设备一样大,而不是裁剪图像的全部可能分辨率。如果您对此不感兴趣,那么这是一个完美的选择。选项 2 (ALAssetLibrary)
使用图像元数据中的AdjustmentXMP
键提取裁剪数据(@tom 所指的内容)。应用作物。
好处:
可以以最佳分辨率获得裁剪后的图像缺点
您只能进行裁剪编辑,不能进行任何其他调整(如红眼) 谁知道 Apple 将来会在“编辑”模式下支持什么,您将来可能需要应用更多的编辑。 这很复杂,您首先必须解析 XML 数据以读取裁剪矩形,裁剪 未旋转 图像,然后应用旋转。选项 3(一厢情愿)
请求 Apple 加入类似 fullResolutionEditedImage
的方法,它可以为您提供尽可能高质量的照片,并应用所有编辑。
优点:
一切都神奇地解决了。缺点:
Apple 可能永远不会添加此方法。选项 4 (UIImagePickerController)
此选项仅在您使用图像选择器时适用,您不能直接将其与资产库一起使用
在-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
返回的NSDictionary中
您可以通过UIImagePickerControllerOriginalImage
键提取调整后的全尺寸图像。将此图像保存在某处。然后,不要从资源库中检索图像,而是加载您制作的副本。
优点:
您将获得完整尺寸的图像,并进行调整 这是 Apple 为我们提供的唯一选项,用于获取具有 all 调整(如红眼等)的完整尺寸图像,而不仅仅是裁剪。 这在 iOS 7 中尤为重要,因为它引入了可以彻底改变图像的过滤器。缺点:
只能与图像选择器一起使用(不是ALAssetRepresentation
)
您必须保留图像的全尺寸副本。根据此类图像的数量,您的应用的磁盘使用量可能会大幅增加。
iOS 7 更新:您可能希望考虑 Option 4 或 Option 1,因为 iOS 7 现在支持许多操作,例如过滤器,并且您的用户可能会注意到它们是否丢失。这两个选项支持过滤器(和其他编辑),选项 4 为您提供更高分辨率的结果。
【讨论】:
感谢详细的细分。我将提交雷达请求选项 3,希望它会在未来完成。【参考方案2】:使用 iOS 照片应用程序裁剪照片后,可以在 ALAssetRepresentation 的元数据字典中找到裁剪坐标。 fullResolutionImage 会给你未裁剪的照片,你必须自己执行裁剪。
AdjustmentXMP 元数据不仅包含裁剪坐标,还指示是否应用了自动增强或消除红眼。
从 iOS 6.0 开始,CIFilter 提供了 filterArrayFromSerializedXMP:inputImageExtent:error: 或许您可以在这里使用 ALAssetRepresentation 的 AdjustmentXMP 元数据,并将 CIFilter 应用到 ALAssetRepresentation 的 fullResolutionImage 以重新创建修改后的图像。
请注意,iOS 照片应用处理 JPG 和 RAW 图像的方式不同。对于 JPG 图像,带有 XMP 元数据的新 ALAsset 存储在相机胶卷中。对于 RAW 图像,将 ALAssetRepresentation 添加到原始 ALAsset。我不确定这个额外的 ALAssetRepresentation 是否是修改后的图像,以及它是否具有 AdjustmentXMP 元数据。除了 JPG 和 RAW 图像,您还应该测试 RAW+JPG 图像的行为。
【讨论】:
感谢@tom,为我指明了正确的方向。作为参考,元数据中的键是AdjustmentXMP
。数据采用 XML(特别是 XMP)格式。值与未旋转的图像相关。以上是关于如何使用 ALAsset 获得图像的裁剪版本?的主要内容,如果未能解决你的问题,请参考以下文章
如何裁剪引导图像以获得所有图像的宽度 285 和高度 170?
如何获得与 Medium.com 的功能标题相似的图像? (裁剪图像)