Comment puis-je obtenir une vignette ou un chemin de saveable UIImagePickerController à utiliser pour un UIImageView?

StackOverflow https://stackoverflow.com/questions/4663019

Question

Quelqu'un pourrait-il expliquer ou montrer s'il vous plaît un code échantillon de la façon dont je peux utiliser obtenir une vignette pour être mis dans un UIImageView après que l'utilisateur sélectionne une photo avec UIImagePickerController?

Le mot Let Je veux mettre une vignette que l'image d'une cellule de tableau. Lorsque l'utilisateur appuie sur la cellule, le sélecteur d'image est affichée et l'utilisateur sélectionne une image qui est déjà sur le dispositif. Je veux aussi enregistrer le chemin vers cette miniature de telle sorte que la prochaine fois que la vue est affichée, la vignette appropriée peut être affichée.

Je suis en mesure d'afficher un sélecteur d'image et de mon get délégué correctement l'image choisie, mais je veux que le chemin de la vignette, et je veux charger la vignette en utilisant cette voie (à savoir que je veux enregistrer le chemin). Je l'ai cherché pendant des heures aujourd'hui et n'ont pas compris cela. Peut-être que je ne comprends pas ALAsset, ou peut-être est autre chose, mais je ne peux pas trouver des exemples qui me aident. Je ne l'ai jamais utilisé le sélecteur d'image ou ALAsset avant, alors je suis complètement novice en la matière.

Était-ce utile?

La solution

// Si vous lisez ceci et regardez les commentaires ci-dessous et pensez ?? WTF ?? il est parce que je suis l'édition ma première réponse au lieu de poster deux réponses dans l'espoir que les choses seront plus propres. Il est important de savoir que ALAssetsLibrary est une chose 4.x iOS.

Le code ci-dessous fonction de prendre une URL bibliothèque bien puis faire un UIImage sur la représentation des vignettes. Bien que j'utilise l'URL bibliothèque bien directement, il n'y a aucune raison que ce même code ne pouvait pas commencer par la transformation d'une représentation de chaîne en un NSURL afin de satisfaire l'attribution de imageURL. Avertissement:. Ce code probablement des fuites ou quelque chose de pire, mais il répond à la question et je l'espère de la valeur de l'affiche originale

Le code ci-dessous emprunte fortement t son débordement de la pile question couvre essentiellement ce même sujet. En plus du code ici, j'ai inclus AssetsLibrary.framework et les typedefs ALAssetsLibrary référencés dans l'autre question.

L'astuce tout est que vous ne pouvez pas faire référence à la NSURL d'un actif bibliothèque directement. Je pense (mais je ne sais pas) qu'il est en quelque sorte référence à une banque de données au lieu d'un fichier pour les données renvoyées par l'URL ne sont pas NSData droite de sorte que vous ne pouvez pas utiliser l'ancienne.

Il y a un UIImageView dans le code qui est appelé photo. Espérons que tout le reste est facile à comprendre.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
    NSLog(@"%@",imageURL);
    ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
    {
        CGImageRef iref = [myasset thumbnail];
        if (iref) {
            UIImage *theThumbnail = [UIImage imageWithCGImage:iref];
            [[self photo] setImage:theThumbnail];

        }
    };


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

    if(imageURL)
    {
        ALAssetsLibrary* assetslibrary = [[[ALAssetsLibrary alloc] init] autorelease];
        [assetslibrary assetForURL:imageURL 
                       resultBlock:resultblock
                      failureBlock:failureblock];
    }

    [self dismissModalViewControllerAnimated:YES];
}

Si vous ne voulez pas la vignette, mais ne voulez la photo complète, vous suffit de changer le code dans le bloc AssetForURLResult à quelque chose comme ceci:

       ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];

Nous pouvons laisser que pour l'utilisateur usent de.

Bonne chance, espérons que cela aide les choses claires pour vous.

Autres conseils

Je l'ai surtout pensé maintenant. La difficulté que j'avais été la compréhension des blocs, la plupart du temps la syntaxe des blocs, il est difficile de comprendre ce qu'ils sont et comment ils fonctionnent.

Dans le délégué du UIImagePickerController, lorsque l'utilisateur a sélectionné une image, vous pouvez obtenir le chemin de l'image dans la bibliothèque d'actifs en utilisant:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL];

Avec cet objet, vous pouvez obtenir l'image en taille réelle ou une vignette en utilisant le code suivant:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
    ALAssetRepresentation *rep = [myasset defaultRepresentation];
    CGImageRef iref = [rep fullResolutionImage];
    if (iref) {
        // Gets the full size image
        self.fullSizeImage = [UIImage imageWithCGImage:iref];
    }

    // Gets the thumbnail
    self.thumbnail = [UIImage imageWithCGImage:[myasset thumbnail]];
};

ALAssetsLibraryAccessFailureBlock failureblock = ^(NSError *myerror)
{
    NSLog(@"in failureblock, got an error: %@",[myerror localizedDescription]);
};

ALAssetsLibrary *assetsLib = [[ALAssetsLibrary alloc] init];
[assetsLib assetForURL:urlForImage resultBlock:resultblock failureBlock:failureblock];

Cette page m'a vraiment aidé comprendre Blocks: blocs dans iOS 4
Voir aussi URL récupérée à partir ALAsset dans iPhone

Enregistrer l'URL peut être problématique:

  1. au moins dans iOS 4.x, les URL n'est pas garanti d'être unique. Ils peuvent être réutilisés si l'utilisateur supprime / ajouter des images, ce qui est évidemment commune. Ainsi, l'URL peut pointer vers gardé une autre image dans l'avenir!
  2. Lorsque les mises à jour utilisateur à iOS 5, les URL ne sont plus valides. POUAH!!! Apple a réécrite Photo Library, sans rétrocompatibilité.

Vous pouvez enregistrer l'image que vous sélectionnez dans imagePicker dans les documents Directory instaed de référencement à partir du sélecteur Voici le code que vous pouvez utiliser pour enregistrer l'image. Mettre en oeuvre ce procédé dans le procédé de rappel invoquée lorsque l'utilisateur sélectionne une photo dans le sélecteur

 NSFileManager   fileManager    = [NSFileManager defaultManager];

    NSArray*  output_PDF_paths  =  NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

    NSString* output_PDF_documentsDirectory = [output_PDF_paths objectAtIndex:0];
    NSString* output_PDF_ABSOLUTE_PATH  = [output_PDF_documentsDirectory stringByAppendingPathComponent:@"ImageName.png"];  

    BOOL success_new = [UIImagePNGRepresentation(ProfilePhotoselected) writeToFile:previewPagePath atomically:YES];

// Ici, le « ProfilePhotoselected » est l'image que vous obtenez à partir du sélecteur comme argument dans votre méthode de callabck

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top