Wie erhalte ich ein Miniaturbild oder speicherbare Weg von UIImagePickerController für eine UIImageView zu benutzen?

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

Frage

Könnte jemand bitte erklären, oder einige Beispiel-Code von zeigen, wie ich ein Miniaturbild bekommen verwenden können, um nach der Benutzer ein Foto mit UIImagePickerController in ein UIImageView gestellt werden?

Lassen Sie uns sagen, dass ich ein Miniaturbild als das Bild von einer Tabellenansicht Zelle festlegen möchten. Wenn der Benutzer auf die Zelle drückt, wird die Bild Picker gezeigt und der Benutzer wählt ein Bild, das bereits auf dem Gerät ist. Ich möchte auch den Pfad zu diesem Bild um es zu speichern, so dass das nächste Mal der Ansicht angezeigt wird, kann die richtige Miniaturbild angezeigt werden.

Ich bin in der Lage, ein Bild-Picker und mein Delegat gets das gewählte Bild korrekt angezeigt werden, aber ich will den Weg zur Thumbnail, und ich möchte, dass die laden Thumbnail diesen Weg mit (d Ich möchte den Pfad speichern). Ich habe heute stundenlang gesucht und haben nicht diese herausgefunden. Vielleicht bin ich zu verstehen, nicht ALAsset, oder vielleicht ist es etwas anderes, aber ich kann keine Beispiele finden, die mir helfen. Ich habe noch nie das Bild Picker oder ALAsset vor nun verwendet, so dass ich auf diesem ganz neu bin.

War es hilfreich?

Lösung

// Wenn Sie diese und Blick auf die Kommentare lesen unten und ?? WTF denken ?? es ist, weil ich meine ursprüngliche Antwort bin die Bearbeitung statt der Entsendung zwei Antworten in der Hoffnung, dass die Dinge sauberer sein werden. Es ist wichtig zu wissen, dass ALAssetsLibrary eine iOS 4.x Sache ist.

Der folgende Code funktioniert eine Asset-Bibliothek URL zu nehmen und dann eine UIImage aus der Thumbnail-Darstellung zu machen. Obwohl ich die Asset-Bibliothek URL verwenden, um direkt gibt es keinen Grund, dass diese denselben Code nicht durch Umwandlung einer String-Darstellung in eine NSURL um die imageURL Zuordnung zu erfüllen konnte beginnen. Haftungsausschluss:. Dieser Code wahrscheinlich Lecks oder etwas schlechter, aber es beantwortet die Frage des Original-Poster und ist hoffentlich der Wert

Der folgende Code leiht stark von t seinem Stack-Überlauf Frage , dass im Grunde gleichen Thema abdeckt. Neben den Code hier, ich habe in der anderen Frage verweist AssetsLibrary.framework und die ALAssetsLibrary typedefs enthalten.

Der ganze Trick ist, dass man nicht direkt die NSURL aus einer Asset-Bibliothek verweisen kann. Ich denke, (obwohl ich weiß nicht), dass es irgendwie einen Datenspeicher anstelle eine Datei verweisen, so dass die Daten aus der URL zurückgegeben nicht gerade ist NSData, so dass Sie nicht auf die alte Weise verwenden können.

Es gibt eine UIImageView in dem Code, der photo genannt wird. Hoffentlich alles andere ist einfach zu verstehen.

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

Wenn Sie die Vorschau nicht möchten, aber nicht über die volle Foto wollen, müssen Sie nur den Code ändern im AssetForURLResult Block zu so etwas wie folgt aus:

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

Wir können für den Benutzer, dass exercize verlassen.

Viel Glück, hoffen, dass dies für Sie klare Dinge hilft.

Andere Tipps

Ich habe es vor allem jetzt herausgefunden. Die Schwierigkeit, die ich hatte, war Blöcke zu verstehen, vor allem die Syntax von Blocks machte es schwierig zu verstehen, was sie sind und wie sie funktionieren.

In den Delegierten für die UIImagePickerController, wenn der Benutzer ein Bild ausgewählt hat, können Sie den Pfad zu dem Bild in dem Vermögen Bibliothek erhalten werden:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL];

Mit diesem Objekt können Sie das Bild in voller Größe oder ein erhalten Thumbnail mit dem folgenden Code:

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

Diese Seite hat mir wirklich geholfen Blocks verstehen: Blöcke in iOS 4
Siehe auch Anzeigebild von URL abgerufen aus ALAsset in iPhone

die URL Speichern kann problematisch sein:

  1. zumindest in iOS 4.x wird die URLs nicht garantiert eindeutig. Sie können wiederverwendet werden, wenn der Benutzer Löschungen / Bilder hinzufügen, was offensichtlich üblich ist. So ist die URL, die Sie auf ein anderes Bild in der Zukunft weist gehalten können!
  2. Wenn der Benutzer Updates auf iOS 5 sind die URLs nicht mehr gültig. PFUI!!! Apple hat Photo Library neu geschrieben, ohne die Abwärtskompatibilität.

Sie können das Bild speichern Sie von imagePicker wählen in Dokumente Verzeichnis instaed davon aus dem Picker Referenzierung Hier ist der Code für das Speichern von Bild verwenden können. Implementieren Sie diese Methode in der Callback-Methode aufgerufen, wenn der Benutzer wählt ein Foto aus dem Picker

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

// Hier wird die „ProfilePhotoselected“ ist das Bild, das Sie von dem Picker bekommen als Argument in Ihrer callabck Methode

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top