13

我正在尝试获取使用 ALAsset 提取的图像的裁剪版本。具体来说,我从用户的照片库中选择项目,然后上传它们。问题是在库缩略图视图中,iOS 向我们展示了裁剪后的版本。当您选择该缩略图并使用 ALAsset 拉出该图像的资产时,我会得到完整分辨率版本。我做了一些研究,但找不到任何有助于获得第二个裁剪发生位置的坐标系的东西。

要对其进行测试,您需要 iOS5 来编辑库中的图像。在您的图片库中选择一张图片,选择“编辑”,然后裁剪图片。当您获得 ALAsset 时,您将获得完整的图像,如果您使用 iPhoto 进行同步,iPhoto 也会提取完整的图像。此外,您可以重新编辑图像并撤消裁剪。

这就是我获取图像的方式:

UIImage *tmpImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullResolutionImage]];

显然,这给了我全分辨率的图像。有一个 fullScreenImage 标志,可以将全分辨率图像缩放到屏幕大小。那不是我想要的。

ALAssetRepresenation 类有一个比例字段,但这是一个浮点值,这也是我不想要的。

如果有人能告诉我在哪里可以找到这个裁剪的坐标系,我将不胜感激。

4

2 回答 2

28

您的选择:

选项 1 (ALAssetLibrary)

使用 的- (CGImageRef)fullScreenImage方法AlAssetRepresentation

优点:

  • 所有艰苦的工作都为您完成,您会得到一张看起来就像照片应用程序中的图像一样的图像。这包括裁剪和其他更改。简单的。

缺点:

  • 分辨率是“屏幕尺寸”,仅与您使用的设备一样大,而不是裁剪图像的全部可能分辨率。如果这与您无关,那么这是一个完美的选择。

选项 2 (ALAssetLibrary)

AdjustmentXMP使用图像元数据中的键(@tom 所指的内容)提取裁剪数据。应用作物。

益处:

  • 可以以最佳分辨率获得裁剪图像

缺点

  • 您只能获得裁剪编辑,而不是任何其他调整(如红眼)
  • 谁知道Apple将来会在“编辑”模式下支持什么,您将来可能需要应用更多编辑。
  • 这很复杂,您首先必须解析 XML 数据以读取裁剪矩形,裁剪未旋转的图像,然后应用旋转。

选项 3(一厢情愿)

请求 Apple 提供一种方法,该方法fullResolutionEditedImage可以为您提供最佳质量的照片,并应用所有编辑。

优点:

  • 一切都神奇地解决了。

缺点:

  • 苹果可能永远不会添加这种方法。

选项 4 (UIImagePickerController)

此选项仅在您使用图像选择器时适用,您不能直接将其与资产库一起使用

在由返回的 NSDictionary 中-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

UIImagePickerControllerOriginalImage您可以从键中提取完整尺寸的调整图像。将此图像保存在某处。然后,不要从资源库中检索图像,而是加载您制作的副本。

优点:

  • 您将获得完整尺寸的图像,并进行调整
  • 这是 Apple 为我们提供的唯一选项,用于获取具有所有调整(如红眼等)的全尺寸图像,而不仅仅是裁剪。这在 iOS 7 中尤为重要,因为它引入了可以彻底改变图像的过滤器。

缺点:

  • 只能与图像选择器一起使用(不是ALAssetRepresentation
  • 您必须保留图像的全尺寸副本。根据此类图像的数量,您的应用程序的磁盘使用量可能会大幅增长。

iOS 7 更新:您可能希望考虑Option 4Option 1,因为 iOS 7 现在支持许多操作,例如过滤器,您的用户可能会注意到它们是否丢失。这两个选项支持过滤器(和其他编辑),选项 4 为您提供更高分辨率的结果。

于 2012-10-15T11:09:13.767 回答
19

使用 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 图像的行为。

于 2012-09-26T18:38:13.070 回答