如何使用 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 4Option 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 的功能标题相似的图像? (裁剪图像)

如何从 Instagram API 获取裁剪后的图像?

ALAsset defaultRepresentation fullResolutionImage

如何使用 UIBezierPath 裁剪图像?

如何放大裁剪尺寸