在我的应用程序中,用户可以拍摄照片或从库中选择一张照片,然后在小图片视图中显示。我需要获取生成的图像URL以将其保存在数据库中,然后我将使用该URL将图像发送到服务器(只有当没有可用的Internet连接时才这样做)。所有这些工作我有这个代码:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image=[info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSURL *url=[info objectForKey:@"UIImagePickerControllerReferenceURL"];
NSLog(@"%@",url);
//(.....)
}
当我将url保存到数据库时,我只是将它传递给它,好像它是一个字符串参数并且它有效并且我已经在数据库中查找了表单中的url:
?资产库://asset/asset.JPG ID = 5A900026-5994-4F93-8A49-D2C96BDA2659&安培; EXT = JPG
我的问题是,当我尝试使用此网址获取图片或获取数据时,它会给我错误或空对象:
NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:[url path]];
UIImage *img=[[UIImage alloc] initWithContentsOfFile:[url path]];
url path = asset.JPG / strange ....
我也尝试过这样:
NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:url];
UIImage *img=[[UIImage alloc] initWithContentsOfFile:url];
但它也不起作用。我只需要一个数据对象或一个图像(从图像我可以得到数据),我怎么能这样做?非常感谢
答案 0 :(得分:2)
我相信您需要使用assetForURL:resultBlock:failureBlock:。我还没有测试过,但我很确定这是你需要的,因为那是一个资产URL(你需要将ALAssetsFramework
链接到项目目标)。
然后,您可以从ALAsset
获取图像数据。
编辑:这应该可以从给定的网址获取完整的分辨率图片(如果网址仍然有效):
__block UIImage *image=nil;
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){
ALAssetRepresentation *rep = [myasset defaultRepresentation];
image = [UIImage imageWithCGImage:[rep fullResolutionImage]];
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){
NSLog(@"Cannot get image - %@",[myerror localizedDescription]);
//
};
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];
NSLog(@"%@", image);
我在某些项目中使用了几乎相似的代码,但我没有测试过这个。
编辑2:今天进行几项测试。看起来这些块是异步运行的,这意味着在调用[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];
之后图像将无法正常运行。相反,您可以使用resultblock
内的图像。也没有理由将image
声明为block
变量,因此代码将变为:
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset){
ALAssetRepresentation *rep = [myasset defaultRepresentation];
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage]];
#warning todo: use image here, or call a method and pass 'image' to it
};
ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror){
NSLog(@"Cannot get image - %@",[myerror localizedDescription]);
};
ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
NSURL *url=[info objectForKey:UIImagePickerControllerReferenceURL];
[assetslibrary assetForURL:url resultBlock:resultblock failureBlock:failureblock];