URL результата выбора изображений iphone - PullRequest
1 голос
/ 02 февраля 2012

Привет, в моем приложении пользователь может сделать снимок или выбрать один из галереи, а затем он отображается в виде небольшого изображения. Мне нужно получить полученный URL-адрес изображения, чтобы сохранить его в базе данных, а затем я буду использовать этот URL-адрес для отправки изображения на сервер (это делается только в том случае, если отсутствует доступ к Интернету). Все это работает, у меня есть этот код:

- (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 & вн = JPG

моя проблема в том, что когда я пытаюсь использовать этот URL либо для получения изображения, либо для получения данных, он выдаёт мне ошибку или пустой объект:

NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:[url path]];
UIImage *img=[[UIImage alloc] initWithContentsOfFile:[url path]];

url path = asset.JPG / странный ....

Я тоже так пытался:

 NSData *dataForFile =[[NSData alloc] initWithContentsOfURL:url];
 UIImage *img=[[UIImage alloc] initWithContentsOfFile:url];

но это также не работает. Мне нужен только один из них - объект данных или изображение (из изображения, которое я могу получить данные), как я могу это сделать? Большое спасибо

1 Ответ

2 голосов
/ 02 февраля 2012

Полагаю, вам нужно использовать assetForURL: resultBlock: failBlock: . Я не проверял это, но я уверен, что это именно то, что вам нужно, так как это URL ресурса (вам нужно связать ALAssetsFramework с целью проекта).

Затем вы можете получить данные изображения из ALAsset.

РЕДАКТИРОВАТЬ: Это должно работать, чтобы получить изображение с полным разрешением от данного URL (если URL все еще действителен):

__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];
...