2011-07-14 9 views
13

Używam writeImageToSavedPhotosAlbum:metadata:completionBlock: do zapisywania obrazów w rolce aparatu (dane GPS są w słowniku przekazanym do metadanych). Jednak zdjęcia są źle zorientowane (jak odwracam urządzenie podczas robienia zdjęć).Jak zapisać zdjęcie z ustawieniem EXIF ​​(GPS) I na telefonie iPhone?

Istnieje inna funkcja writeImageToSavedPhotosAlbum: orientation: completionBlock: ale nie będę w stanie przekazać danych EXIF.

Zgodnie z dokumentacją istnieje własność kCGImagePropertyOrientation do ręcznego ustawienia orientacji, ale mam problem z wykryciem bieżącej orientacji urządzenia podczas robienia zdjęcia i jego zapisywania.

Czy ktoś osiągnął zapis obrazu z danymi EXIF ​​i właściwą orientacją? Każda forma pomocy jest mile widziana.

Oto mój kod:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    [self dismissModalViewControllerAnimated:YES]; 
    [imageView setImage:image]; 

    if(sourceCamera) { 
     //EXIF and GPS metadata dictionary 
     (...) 

     //saving image 
     ALAssetsLibrary *al = [[ALAssetsLibrary alloc] init];  
     [al writeImageToSavedPhotosAlbum:[image CGImage] 
           metadata:dict 
         completionBlock:^(NSURL *assetURL, NSError *error) { 
          if (error == nil) { 
           NSLog(@"saved"); 
          } else { 
           NSLog(@"error"); 
          } 
     }];   
     [al release]; 
    } 
} 

Najlepsze życzenia,

a.

Odpowiedz

27

Musisz mapować wartości UIImageOrientation do odpowiednich wartości orientacji EXIF ​​po ustawieniu kCGImagePropertyOrientation. Że odwzorowanie jest:

UIImageOrientationUp:    1 
UIImageOrientationDown:   3 
UIImageOrientationLeft:   8 
UIImageOrientationRight:   6 
UIImageOrientationUpMirrored:  2 
UIImageOrientationDownMirrored: 4 
UIImageOrientationLeftMirrored: 5 
UIImageOrientationRightMirrored: 7 

Zauważ, że UIImageOrientationLeft i UIImageOrientationRight są przeciwieństwem tego, co można oczekiwać od the documentation; małe przykładowe obrazy są tym, co uzyskasz, jeśli zastosujesz orientację do pionowego obrazu, a nie orientację danych obrazu surowego, które dadzą pionowy obraz po zastosowaniu orientacji.

+0

Dziękuję za odpowiedź, jesteś świetny! UIImageOrientation, to takie proste ... nie można znaleźć żadnego pojedynczego rozwiązania dla kCGImagePropertyOrientation i UIImageOrientation. Po prostu uwielbiam tę tablicę! – akashic

+0

Anomie, to ma sens, ale gdzie w kodeksie PO powinien on rzeczywiście zrobić ustawienie i jak? OP musi w rzeczywistości ustawić wartość dla kCGImagePropertyOrientation, prawda? –

+3

@BenjaminWheeler należy zmodyfikować słownik metadanych "ALAsset". Kiedy już masz swój "ALAsset", pobierz słownik metadanych w ten sposób: 'myMetadataDictionary = [[metadane myAsset defaultRepresentation]]. Następnie ustaw orientację: 'myMetadataDictionary [(NSString *) kCGImagePropertyOrientation] = orientation', gdzie' orientation' jest jedną z liczb całkowitych podanych przez @Anomie powyżej. –