我有一个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
缓存问题,因为我已尝试编辑,杀死应用,启动,上传仍会上传旧图片。
问题:
答案 0 :(得分:4)
我认识到了同样的行为,并且不久前做了一些测试。让我与您分享我的成果:
您只能通过fullScreenImage方法获得已编辑的图像。 Apple的文档中也提到了这一点: “在iOS 5及更高版本中,此方法返回完全裁剪,旋转和调整的图像 - 完全按用户在照片或图像选择器中看到的那样。”
fullResolutionImage和getBytes方法返回未经编辑的图像。但是,裁剪等编辑参数会保存在图像元数据中。但是,此元数据信息仅由Aperture和iPhoto等Apple应用程序解释。
通过检查图像元数据,您可以查看是否已编辑图像。比较未编辑和编辑的图像的元数据,并查找元数据字段中的差异。
答案 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];