2011-01-11 21 views
8

Czy ktoś mógłby wyjaśnić lub pokazać przykładowy kod, w jaki sposób mogę użyć, aby umieścić miniaturę w UIImageView po wybraniu przez użytkownika zdjęcia za pomocą UIImagePickerController?Jak uzyskać miniaturkę lub ścieżkę do zapisania z UIImagePickerController do użycia dla UIImageView?

Załóżmy, że chcę ustawić miniaturę jako obraz komórki widoku tabeli. Gdy użytkownik naciśnie komórkę, zostanie wyświetlony selektor obrazu, a użytkownik wybierze obraz, który już znajduje się na jego urządzeniu. Chcę również zapisać ścieżkę do tej miniatury, aby przy następnym wyświetleniu widoku mogła zostać wyświetlona odpowiednia miniatura.

Jestem w stanie wyświetlić selektor obrazu, a mój delegat poprawnie odczytuje wybrany obraz, ale chcę podać ścieżkę do miniatury i chcę załadować miniaturkę za pomocą tej ścieżki (tj. Chcę zapisać ścieżkę). Szukałem wiele godzin dzisiaj i nie wymyśliłem tego. Być może nie rozumiem ALAsset, a może to jest coś innego, ale nie mogę znaleźć żadnych przykładów, które mi pomagają. Nigdy wcześniej nie korzystałem z selektora zdjęć ani z zestawu ALA, więc jestem całkowicie nowy.

Odpowiedz

15

// Jeśli czytasz to i patrzysz na komentarze poniżej i myślisz ?? WTF ?? to dlatego, że edytuję swoją oryginalną odpowiedź, zamiast zamieszczać dwie odpowiedzi w nadziei, że wszystko będzie czystsze. Ważne jest, aby wiedzieć, że ALAssetsLibrary jest rzeczą iOS 4.x.

Poniższy kod posłuży do pobrania adresu URL biblioteki zasobów, a następnie spowoduje usunięcie symbolu UII z reprezentacji miniatur. Chociaż korzystam bezpośrednio z adresu URL biblioteki zasobów, nie ma powodu, aby ten sam kod nie mógł rozpocząć się od przekształcenia reprezentacji łańcuchowej w NSURL w celu spełnienia zadania imageURL. Zastrzeżenie: ten kod prawdopodobnie jest nieszczelny lub coś gorszego, ale odpowiada na pytanie oryginalnego plakatu i ma nadzieję, że ma on wartość.

Poniższy kod pożycza na t his Stack Overflow question, który obejmuje zasadniczo ten sam temat. Oprócz kodu w tym miejscu włączyłem AssetsLibrary.framework i AlassetsLibrary typedefs wymienione w drugim pytaniu.

Cała sztuczka polega na tym, że nie można bezpośrednio odwoływać się do NSURL z biblioteki zasobów. Myślę (choć nie wiem), że w jakiś sposób odwołuje się do magazynu danych zamiast do pliku, więc dane zwrócone z adresu URL nie są prostymi NSData, więc nie możesz używać go w starym stylu.

Istnieje UIImageView w kodzie o nazwie photo. Mam nadzieję, że wszystko inne jest łatwe do wymyślenia.

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

Jeśli nie chcesz miniaturę ale chce zrobić pełną zdjęcie, po prostu zmienić kod w bloku AssetForURLResult do czegoś takiego:

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

Możemy opuścić to exercize dla użytkownik.

Powodzenia, mam nadzieję, że pomoże ci to wyjaśnić.

+0

Jeśli użytkownik usunie obraz z rolki aparatu, nie będzie to stanowić problemu, obrazek w moim widoku pozostanie pusty. Obraz nie jest konieczny dla reszty widoku. – viperacr99

+0

Obraz nie jest konieczny dla reszty widoku. Wybieram system IOS 4.0 i nowsze. Aby było to łatwiejsze, załóżmy, że chcę umieścić obraz w pełnym rozmiarze w UIImageView. Jak mogę to zrobić, jeśli mam tylko obiekt NSURL ze słownika informacji? Rzeczy, które próbowałem do tej pory, nie zadziałały, przypuszczam, że brakuje mi czegoś oczywistego. – viperacr99

+0

Obiekt NSURL wskazywałby obraz, a następnie można go pobrać. Ponieważ kierujesz reklamy na system IOS 4.0, możesz przejść do samej Biblioteki zasobów. Na blogu iCode znajduje się samouczek (http://icodeblog.com/2010/07/08/asset-libraries-and-blocks-in-ios-4/), ale może już go widziałeś? Kiedy już dysponujesz zasobem, możesz użyć metody valueForPropery i pobrać ALAssetPropertyURL, który jest słownikiem zawierającym adresy URL plików. – Walter

0

Możesz zapisać obraz wybrany z imagePicker do katalogu dokumentów, w którym znajduje się odnośnik do niego z wybieraka Oto kod, którego można użyć do zapisania obrazu.Wdrożenie tej metody w metodzie zwrotnej wywoływana, gdy użytkownik wybierze zdjęcie z próbnika

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

// Tutaj „ProfilePhotoselected” jest obrazem, który można uzyskać z próbnika jako argumentu w metodzie callabck

+0

To jest jeden sposób, ale problem polega na tym, że będę musiał również zaimplementować kod, który usunie obrazy z katalogu dokumentów, które nie są już używane, nie wspominając już, że będzie wymagać więcej miejsca. Idealnie byłoby, gdyby obraz był przechowywany tylko w rolce kamery, a jeśli użytkownik usunie obraz z tego miejsca, nic wielkiego, mój kod po prostu nie wyświetli obrazu. – viperacr99

2

Rozumiem to teraz. Trudność, którą miałem, polegała na zrozumieniu bloków, głównie składnia bloków utrudniała zrozumienie, czym one są i jak działają.

W delegata dla UIImagePickerController, gdy użytkownik wybrał obraz, można uzyskać ścieżkę do obrazu w bibliotece aktywów przy użyciu:

NSURL *path = [info objectForKey:UIImagePickerControllerReferenceURL]; 

z tym obiektem, można uzyskać pełny rozmiar obraz lub miniatur za pomocą następującego kodu:

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

Ta strona naprawdę pomógł mi zrozumieć bloków: Blocks in iOS 4
Patrz także display image from URL retrieved from ALAsset in iPhone

1

Zapisywanie URL może być problematyczne:

  1. przynajmniej w iOS 4.x, adresy URL nie jest gwarantowane jest unikatowy. Mogą być ponownie wykorzystane, jeśli użytkownik usunie/doda obrazki, co jest oczywiście powszechne. Zatem URL, który trzymasz, może wskazywać na inny obraz w przyszłości!
  2. Gdy użytkownik aktualizuje system iOS 5, adresy URL nie są już ważne. UGH !!! Firma Apple przepisała bibliotekę zdjęć bez kompatybilności wstecznej.