如何使用ALAsset获取图像的裁剪版本?

13

我正在尝试获取使用ALAsset获取的图像的裁剪版本。具体而言,我正在从用户的照片库中选择项目,然后上传它们。问题在于,在库缩略图视图中,iOS显示了我们所看到的裁剪版本。但是当您选择该缩略图并使用ALAsset获取该图像的资源时,会得到完整分辨率版本。

我进行了一些研究,发现没有任何帮助获取裁剪发生位置的第二坐标系的信息。

要测试它,您需要在您的库中编辑图像的iOS5。选择图像库中的图像,选择“编辑”并裁剪图像。当您获取ALAsset时,您将获得完整的图像,并且如果您使用iPhoto同步,则iPhoto也会拉取完整的图像。此外,您可以重新编辑图像并撤消裁剪操作。

以下是我获取图像的方式:

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

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

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

如果有人能告诉我裁剪坐标系在哪里可以找到,我会很感激。

2个回答

28

你的选择:

选项1(ALAssetLibrary)

使用AlAssetRepresentation- (CGImageRef)fullScreenImage方法。

优点:

  • 所有的繁琐工作都为你完成,你可以获得一张与照片应用程序中的图片完全相同的图片。这包括剪裁和其他更改。很容易。

缺点:

  • 分辨率是“屏幕尺寸”,只有设备的大小,而不是裁剪图像的全部可能分辨率。如果这不关心你,那么这就是完美的选择。

选项2(ALAssetLibrary)

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

优点:

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

缺点:

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

选项3(美好的愿景)

请求苹果公司添加一个类似于fullResolutionEditedImage的方法,可以获得质量最好的已编辑照片。

优点:

  • 一切都神奇般地解决了。

缺点:

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

选项4(UIImagePickerController)

此选项仅适用于使用图像选择器的情况,不能直接使用资源库

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info返回的NSDictionary中,您可以通过UIImagePickerControllerOriginalImage键提取全尺寸和调整后的图像。将此图像保存在某个位置。然后,不要从资产库中检索图像,而是加载您制作的副本。
优点:
  • 您可以获得全尺寸的、经过调整的图像。
  • 这是苹果提供的唯一选项,用于获取带有所有调整(如红眼等)的全尺寸图像,而不仅仅是裁剪。这在iOS 7中尤其重要,因为引入了可以大幅改变图像的过滤器。
缺点:
  • 只能与图片选择器(而非ALAssetRepresentation)一起使用。
  • 您必须保留图像的完整副本。根据这些图像的数量,您的应用程序可能会占用大量磁盘空间。
iOS 7更新: 您可能希望考虑选项4选项1,因为iOS 7现在支持许多操作,例如过滤器,如果您没有这些操作,您的用户可能会注意到。这两个选项都支持过滤器(和其他编辑),Option 4可以给您更高分辨率的结果。

1
感谢您提供详细的说明。我将提交一个雷达请求选项3,希望它能在未来得到解决。 - flainez

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


感谢@tom,指引我正确的方向。供参考,元数据中的关键字是“AdjustmentXMP”。数据以XML(具体来说是XMP)格式呈现。值与未旋转的图像相关。 - William Denniss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接