2012-01-07 49 views
9

我有一个ipad应用程序,它使用ALAssetsLibrary从Photos应用程序中获取图像,然后将其上传到Web服务器。到目前为止一切工作正常。使用ALAssetsLibrary访问裁剪或编辑的图像

现在,如果我去照片应用程序和编辑图像(说裁剪)和上传,原始未裁剪是上传。我正在使用资源网址访问/保存照片。

例:

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

这不是一个ALAssetsLibrary缓存问题监守,我试图编辑,杀应用程序,启动,上传仍然上传旧形象。

问:

  1. 我怎么知道,如果一个编辑(裁剪/红眼/增强型)照片的版本可用?
  2. 如何访问照片的编辑版本?

回答

4

我认识到相同的行为,并在前一段时间做了一些测试。让我与您分享我的结果:

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

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

  3. 通过检查他的图像元数据可以发现,如果图像已被编辑。比较未经编辑和编辑的图像的元数据并查找元数据字段的差异。

+0

我印刷CGImageRef ' fullResolutionImage的宽度和高度:3968 X 2232 fullScreenImage:841×1024 ' 不幸的是,fullScreenImage比全屏图像小得多。我需要全尺寸的编辑图像上传。有没有其他方法可以访问编辑后的全分辨率图像。 – mithuntnt 2012-01-08 14:31:21

+2

不幸的是,第三方应用程序没有API。 – holtmann 2012-01-11 06:50:09

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值,那么你编辑的图像... :)

以上代码从元数据

如果你要去让编辑图像与全屏图像,那么你也将得到编辑图像

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