66 votes

image d'affichage de l'URL extraite d'ALAsset sur iPhone

Je suis à l'aide d'un ALAsset Cadre pour l'accès aux fichiers de l'appareil photo de la galerie.

Jusqu'à présent, je suis en mesure d'accéder à la miniature et de l'afficher.
Je veux afficher l'image dans une image vue, mais je suis incapable de comprendre comment le faire.

J'ai essayé d'utiliser l'Url dans le champ ALAsset objet, mais en vain.

Quelqu'un sait comment cela peut être fait?

Voici un code où j'ai été en mesure d'accéder à la vignette et le placer dans une cellule de tableau:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {


  static NSString *CellIdentifier = @"Cell";

  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  }
  //here 'asset' represents the ALAsset object


  asset = [assets objectAtIndex:indexPath.row];
       //i am accessing the thumbnail here
  [cell.imageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]];
  [cell.textLabel setText:[NSString stringWithFormat:@"Photo %d", indexPath.row+1]];

  return cell;
}

93voto

Warren Burton Points 7953

L'API a changé les règles légèrement et vous n'obtenez pas directement accès au système de fichiers de la bibliothèque iPhoto. Au lieu de cela, vous obtenez de l'actif de la bibliothèque de l'URL comme ceci.

assets-library://asset/asset.JPG?id=1000000003&ext=JPG

Vous utilisez le ALAssetLibrary objet pour accéder à la ALAsset de l'objet via l'URL.

donc, à partir de la documentation pour ALAssetLibrary jeter ce dans un en-tête (ou source)

typedef void (^ALAssetsLibraryAssetForURLResultBlock)(ALAsset *asset);
typedef void (^ALAssetsLibraryAccessFailureBlock)(NSError *error);

ce qui n'est pas strictement nécessaire, mais garde les choses assez.
et puis dans votre source.

-(void)findLargeImage
{
    NSString *mediaurl = [self.node valueForKey:kVMMediaURL];

    //
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        ALAssetRepresentation *rep = [myasset defaultRepresentation];
        CGImageRef iref = [rep fullResolutionImage];
        if (iref) {
            largeimage = [UIImage imageWithCGImage:iref];
            [largeimage retain];
        }
    };

    //
    ALAssetsLibraryAccessFailureBlock failureblock  = ^(NSError *myerror)
    {
        NSLog(@"booya, cant get image - %@",[myerror localizedDescription]);
    };

    if(mediaurl && [mediaurl length] && ![[mediaurl pathExtension] isEqualToString:AUDIO_EXTENSION])
    {
        [largeimage release];
        NSURL *asseturl = [NSURL URLWithString:mediaurl];
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:asseturl 
                       resultBlock:resultblock
                      failureBlock:failureblock];
    }
}

Un couple de choses à noter que cette utilise des blocs qui étaient nouveaux pour moi avant j'ai commencé mon iOS4 portage, mais vous pourriez aimer regarder

http://www.mikeash.com/pyblog/friday-qa-2008-12-26.html

et

http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Ils plier votre tête un peu, mais si vous pensez à eux aussi de notification de sélecteurs, ou des rappels de ce genre d'aide.

Aussi

  • lors de l' findLargeImage renvoie la resultblock ont l'habitude d'exécuter encore comme sa un rappel. Donc largeImage ne sera pas encore valide.
  • largeImage doit être un variable d'instance sont pas limitées à l' la méthode.

J'ai utiliser cette construction pour ce faire, lors de l'utilisation de la méthode, mais vous pouvez trouver quelque chose de plus adapté à votre utilisation.

[node.view findLargeImage];
UIImage *thumb = node.view.largeImage;
if (thumb) { blah blah }

C'est ce que j'ai appris en essayant de le faire fonctionner de toute façon.

iOS 5 mise à jour

Lorsque le résultat du bloc feux semble être un peu plus lent avec iOS5 et peut-être unique de base des appareils donc je ne pourrais pas compter sur l'image pour être disponible directement après l'appel de findLargeImage. Alors je l'ai changé à faire appel à un délégué.

@protocol HiresImageDelegate <NSObject>
@optional
-(void)hiresImageAvailable:(UIImage *)aimage;
@end

et comme cá

//
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        ALAssetRepresentation *rep = [myasset defaultRepresentation];
        CGImageRef iref = [rep fullResolutionImage];
        if (iref) {
            UIImage *largeimage = [UIImage imageWithCGImage:iref];
            [delegate hiresImageAvailable:large];
        }
    };

15voto

oknox Points 296

Warren réponse a bien fonctionné pour moi. Une chose utile pour certaines personnes est à inclure l'image de l'orientation et de l'échelle de métadonnées en même temps. Pour ce faire, dans votre bloc de résultats comme suit:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    if (iref) 
    {
        UIImage *largeimage = [UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]];
        [delegate hiresImageAvailable:large];
    }
};

L' imageWIthCGImage appel dans ce cas a l'échelle et de l' orientation ajoutée lorsqu'il crée un UIImage pour vous.

[UIImage imageWithCGImage:iref scale:[rep scale] orientation:[rep orientation]];

Un truc à noter est que si vous utilisez [rep fullScreenImage] au lieu de [rep fullResolutionImage] sur iOS 5, vous obtenez une image qui est déjà tourné - il est toutefois à la résolution de l'écran de l'iPhone - c'est à dire son à une résolution inférieure.

9voto

Matt Quiros Points 2236

Juste pour combiner les réponses de Warren et oknox dans un extrait plus court:

 ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary assetForURL:self.selectedPhotos[i] resultBlock: ^(ALAsset *asset){
    ALAssetRepresentation *representation = [asset defaultRepresentation];
    CGImageRef imageRef = [representation fullResolutionImage];
    if (imageRef) {
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        imageView.image = [UIImage imageWithCGImage:imageRef scale:representation.scale orientation:representation.orientation];
        // ...
    }
} failureBlock: ^{
    // Handle failure.
}];
 

Personnellement, j'aime bien régler mes failureBlock à nil .

8voto

suku Points 77
      NSURL* aURL = [NSURL URLWithString:@"URL here"];

     ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
     [library assetForURL:aURL resultBlock:^(ALAsset *asset)
     {
     UIImage  *copyOfOriginalImage = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage] scale:0.5 orientation:UIImageOrientationUp];

     cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage];
     }
     failureBlock:^(NSError *error)
     {
     // error handling
     NSLog(@"failure-----");
     }];
 

fournissez simplement le UIReferenceURl que vous avez obtenu pour l'image de la photothèque fournie ci-dessus ... cela fonctionne parfaitement. . Je l’ai affiché dans

  • Cellule UIcollectionView

    ..si tu veux juste l'afficher dans un

  • UIImageView

    veux dire

Changement

 cell.backgroundView = [[UIImageView alloc] initWithImage:copyOfOriginalImage];
 

À

 imageView.image = copyOfOriginalImage;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X