使用ALAssetsLibrary访问裁剪或编辑的图像

时间:2012-01-07 15:24:25

标签: objective-c ios ipad alassetslibrary

我有一个ipad应用程序,它使用ALAssetsLibrary从Photos应用程序中获取图像,然后将它们上传到Web服务器。到目前为止一切正常。

现在,如果我转到照片应用程序并编辑图像(比如裁剪)并上传,则原始未裁剪的内容会上传。我正在使用资产网址访问/保存照片。

例如:

createPhoto: 
assetUrl: assets-library://asset/asset.JPG?id=542F09CA-00E1-412E-A7E6-0C222E3F8FFB&ext=JPG, 
UTIs: (
    "public.jpeg"
), 
UTI:public.jpeg

这不是ALAssetsLibrary缓存问题,因为我已尝试编辑,杀死应用,启动,上传仍会上传旧图片。

问题:

  1. 我如何知道照片的编辑(裁剪/红眼/增强)版本是否可用?
  2. 如何访问已修改的照片版本?

2 个答案:

答案 0 :(得分:4)

我认识到了同样的行为,并且不久前做了一些测试。让我与您分享我的成果:

  1. 您只能通过fullScreenImage方法获得已编辑的图像。 Apple的文档中也提到了这一点: “在iOS 5及更高版本中,此方法返回完全裁剪,旋转和调整的图像 - 完全按用户在照片或图像选择器中看到的那样。”

  2. fullResolutionImage和getBytes方法返回未经编辑的图像。但是,裁剪等编辑参数会保存在图像元数据中。但是,此元数据信息仅由Aperture和iPhoto等Apple应用程序解释。

  3. 通过检查图像元数据,您可以查看是否已编辑图像。比较未编辑和编辑的图像的元数据,并查找元数据字段中的差异。

答案 1 :(得分:1)

-(UIImage*)fullScreenImage:(ALAsset *)imageAsset{
    ALAssetRepresentation *assetRepresentation = [imageAsset defaultRepresentation];
    CGImageRef fullResImage = [assetRepresentation fullResolutionImage];
    NSString *adjustment = [[assetRepresentation metadata] objectForKey:@"AdjustmentXMP"];
    if (adjustment) {
        NSData *xmpData = [adjustment dataUsingEncoding:NSUTF8StringEncoding];
        CIImage *image = [CIImage imageWithCGImage:fullResImage];

        NSError *error = nil;
        NSArray *filterArray = [CIFilter filterArrayFromSerializedXMP:xmpData
                                                     inputImageExtent:image.extent
                                                                error:&error];
        CIContext *context = [CIContext contextWithOptions:nil];
        if (filterArray && !error) {
            for (CIFilter *filter in filterArray) {
                [filter setValue:image forKey:kCIInputImageKey];
                image = [filter outputImage];
            }
            fullResImage = [context createCGImage:image fromRect:[image extent]];
        }
    }
    UIImage *result = [UIImage imageWithCGImage:fullResImage
                                          scale:[assetRepresentation scale]
                                    orientation:(UIImageOrientation)[assetRepresentation orientation]];
    return result;
}
  

在上面的函数中传递ALAsset值然后你编辑的图像......:)

以上代码从Meta数据获取编辑图像

如果您使用全屏图像,那么您也将获得已编辑的图像

ALAssetRepresentation *representation = [asset defaultRepresentation];
 CGImageRef iref = [representation fullScreenImage];
 UIImage *editedImage = [UIImage imageWithCGImage:iref];