Come faccio ad avere una miniatura o un percorso salvabile da UIImagePickerController da utilizzare per un UIImageView?

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

Domanda

Qualcuno potrebbe spiegare o mostrare alcuni esempi di codice di come posso usare ottenere una miniatura per essere messa in un UIImageView dopo che l'utente seleziona una foto con UIImagePickerController?

dire Let voglio impostare una miniatura come l'immagine di una cella di vista tabella. Quando l'utente preme il cellulare, il selettore di immagini viene mostrato e l'utente seleziona un'immagine che è già sul dispositivo. Voglio anche salvare il percorso di tale miniature in modo che la prossima volta che viene visualizzata la vista, la miniatura corretta può essere visualizzato.

Sono in grado di visualizzare correttamente un selettore di immagine e l'immagine scelta mio delegato di ottenere, ma voglio che il percorso per la miniatura, e voglio caricare la miniatura utilizzando tale percorso (cioè voglio salvare il percorso). Ho cercato per ore oggi e non ho capito questo. Forse non ci sto capendo ALAsset, o forse è qualcosa di diverso, ma non riesco a trovare alcun esempio che mi stanno aiutando. Non ho mai usato il selettore di immagini o ALAsset prima d'ora, quindi sono totalmente nuovo a questo.

È stato utile?

Soluzione

// Se stai leggendo questo e guardare i commenti qui sotto e pensate ?? WTF ?? è perché io sono l'editing mia risposta iniziale invece di inviare due risposte nella speranza che le cose sarà più pulita. E 'importante sapere che ALAssetsLibrary è una cosa 4.x iOS.

Il codice seguente funzione di volontà di prendere un URL di asset-biblioteca e poi fare un'UIImage fuori della rappresentazione miniatura. Anche se io uso l'URL di asset-library direttamente non v'è alcuna ragione per cui questo stesso codice non potrebbe iniziare trasformando una rappresentazione di stringa in un NSURL al fine di soddisfare l'assegnazione imageURL. Esonero di responsabilità:. Questo codice probabilmente perdite o qualcosa di peggio, ma risponde alla domanda del manifesto originale e si spera di valore

Il codice qui sotto sta prendendo a prestito pesantemente su t sua Stack Overflow domanda che copre fondamentalmente questo stesso argomento. In aggiunta al codice qui, ho incluso AssetsLibrary.framework e le typedef ALAssetsLibrary riferimento nel altra questione.

L'intera trucco è che non si può fare riferimento al NSURL da un'attività-library direttamente. Penso che (anche se non so), che è in qualche modo riferimento a un archivio di dati invece di un file in modo che i dati restituiti dalla URL non è dritto NSData quindi non è possibile utilizzare il vecchio modo.

C'è un UIImageView nel codice che si chiama photo. Speriamo che tutto il resto è facile da capire.

- (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];
}

Se non si desidera che la miniatura, ma si vuole la foto completa, si sarà solo modificare il codice nel blocco AssetForURLResult a qualcosa di simile:

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

Si può lasciare che più una palestra per l'utente.

Buona fortuna, speriamo che questo aiuta a chiarire le cose per voi.

Altri suggerimenti

devo per lo più capito ora. La difficoltà che ho avuto è stata la comprensione blocchi, per lo più la sintassi dei blocchi ha reso difficile capire che cosa sono e come funzionano.

Nel delegato per l'UIImagePickerController, quando l'utente ha selezionato un'immagine, è possibile ottenere il percorso dell'immagine nella libreria asset utilizzando:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL];

Con questo oggetto, è possibile ottenere l'immagine a schermo intero o una miniatura utilizzando il seguente codice:

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

Questa pagina ha veramente aiutato a capire blocchi: Blocchi in iOS 4
Vedi anche visualizzazione da URL recuperato dal ALAsset in iPhone

Il salvataggio del URL può essere problematico:

  1. almeno in iOS 4.x, gli URL non è garantito per essere unico. Essi possono essere riutilizzati se elimina utente / aggiungere immagini, che è ovviamente comune. Così, l'URL continuavi può puntare a un quadro diverso in futuro!
  2. Quando gli aggiornamenti degli utenti di iOS 5, gli URL non sono più validi. UGH !!! Apple ha riscritto Photo Library, senza compatibilità all'indietro.

È possibile salvare l'immagine selezionata da imagePicker in documenti Directory instaed referenziare dal selettore Qui è il codice è possibile utilizzare per il salvataggio delle immagini. Implementare questo metodo nel metodo di callback invocata quando un utente seleziona foto dal selettore

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

// Qui il "ProfilePhotoselected" è l'immagine che si ottiene dal selettore come argomento nel metodo callabck

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top