从 ALAssetRepresentation 获取“修饰”图像

Posted

技术标签:

【中文标题】从 ALAssetRepresentation 获取“修饰”图像【英文标题】:Get the "retouched" image from ALAssetRepresentation 【发布时间】:2013-08-06 16:56:18 【问题描述】:

给定ALAssetRepresentation,是否有可能获得其全分辨率修饰图像?

如果我使用fullResolutionImage 方法,我会得到全分辨率图像,但没有任何调整。

如果我使用fullScreenImage的方法,我会得到修饰后的图像,但缩小到适合全屏显示

【问题讨论】:

【参考方案1】:

这并不容易,但你可以。请注意,这也将应用用户在 Photos.app 中所做的任何裁剪:

ALAssetRepresentation *representation = asset.defaultRepresentation;
CGImageRef fullResolutionImage = CGImageRetain(representation.fullResolutionImage);
// AdjustmentXMP constains the Extensible Metadata Platform XML of the photo
// This XML describe the transformation done to the image.
// http://en.wikipedia.org/wiki/Extensible_Metadata_Platform
// Have in mind that the key is not exactly documented.
NSString *adjustmentXMP = [representation.metadata objectForKey:@"AdjustmentXMP"];

NSData *adjustmentXMPData = [adjustmentXMP dataUsingEncoding:NSUTF8StringEncoding];
NSError *__autoreleasing error = nil;
CGRect extend = CGRectZero;
extend.size = representation.dimensions;
NSArray *filters = [CIFilter filterArrayFromSerializedXMP:adjustmentXMPData inputImageExtent:extend error:&error];
if (filters)

  CIImage *image = [CIImage imageWithCGImage:fullResolutionImage];
  CIContext *context = [CIContext contextWithOptions:nil];
  for (CIFilter *filter in filters)
  
    [filter setValue:image forKey:kCIInputImageKey];
    image = [filter outputImage];
  

  CGImageRelease(fullResolutionImage);
  fullResolutionImage = [context createCGImage:image fromRect:image.extent];


// At this moment fullResolutionImage will be the filtered image, or the full
// resolution one if no filters were applied.
// You will need to CGImageRelease fullResolutionImage after you have finished
// working with it.

【讨论】:

感谢您的回答。有用。但我认为存在内存泄漏,因为CGImageRetain() 如果filters == nil 永远不会被释放。为什么要保留这个? 是的,那是我的代码的一部分。我可能稍后创建一个UIImage,然后发布fullResolutionImage。顶部额外的CGImageRetain是为了简化代码,因为你需要做一个createGCImage:fromRect:,你需要释放它,所以在这段代码之后额外的保留被取消了。 好的,现在我明白了。我们做了一个CGImageRetain(),所以我们可以发布它,不管它是不是用createCGImage:fromRect:创建的。因此,需要注意的重要一点是,最后一次使用fullResolutionImage 之后,我们必须释放它。谢谢。

以上是关于从 ALAssetRepresentation 获取“修饰”图像的主要内容,如果未能解决你的问题,请参考以下文章

ALAssetRepresentation 的 scale 属性总是返回 1

如何获取共享照片流 ALAsset 的 ALAssetRepresentation?

Swift 中 ALAssetRepresentation CGImage 的内存泄漏

来自 ALAssetRepresentation 的 NSData 在发送到我的 Django 服务器时总是有错误的方向

“PixelHeight”和“PixelWidth”是不是总是出现在 ALAssetRepresentation 元数据中?

正在报告 ALAssetRepresentation 元数据方法的崩溃