2011-07-14 21 views
13

Tôi đang sử dụng writeImageToSavedPhotosAlbum:metadata:completionBlock: để lưu hình ảnh vào thư viện ảnh (dữ liệu GPS trong từ điển được chuyển đến siêu dữ liệu). Tuy nhiên hình ảnh bị mất phương hướng (khi tôi lật thiết bị trong khi chụp ảnh).Làm thế nào để lưu ảnh với EXIF ​​(GPS) VÀ định hướng trên iPhone?

Có một hàm khác writeImageToSavedPhotosAlbum: orientation: completionBlock: nhưng tôi sẽ không thể chuyển dữ liệu EXIF.

Theo tài liệu, có kCGImagePropertyOrientation thuộc tính để đặt hướng thủ công nhưng tôi gặp sự cố khi phát hiện hướng hiện tại của thiết bị trong khi chụp ảnh và lưu ảnh.

Có ai đã đạt được ảnh lưu với dữ liệu EXIF ​​và định hướng đúng không? Bất kỳ trợ giúp sẽ được rất đánh giá cao.

Dưới đây là mã của tôi:

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

Best wishes,

a.

Trả lời

27

Bạn cần ánh xạ giá trị UIImageOrientation đến các giá trị định hướng EXIF ​​tương ứng khi đặt kCGImagePropertyOrientation. lập bản đồ đó là:

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

Lưu ý rằng UIImageOrientationLeft và UIImageOrientationRight là trái ngược với những gì bạn có thể mong đợi từ the documentation; các hình ảnh mẫu nhỏ là những gì bạn nhận được nếu bạn áp dụng định hướng cho hình ảnh thẳng đứng, thay vì định hướng của dữ liệu hình ảnh thô sẽ cung cấp hình ảnh thẳng đứng khi định hướng được áp dụng.

+0

Cảm ơn bạn đã trả lời, bạn thật tuyệt! UIImageOrientation, thật đơn giản ... không thể tìm thấy bất kỳ giải pháp nào cho kCGImagePropertyOrientation và UIImageOrientation. Tôi chỉ yêu hội đồng này! – akashic

+0

Anomie, điều đó có ý nghĩa, nhưng ở đâu trong mã OP nên anh ta thực sự thực hiện cài đặt và cách thực hiện? OP phải thực sự thiết lập một giá trị cho kCGImagePropertyOrientation ở đâu đó, đúng không? –

+3

@BenjaminWheeler cần sửa đổi từ điển siêu dữ liệu của 'ALAsset'. Khi bạn có 'ALAsset', hãy lấy từ điển siêu dữ liệu theo cách này:' myMetadataDictionary = [[myAsset defaultRepresentation] metadata] '. Sau đó, đặt định hướng: 'myMetadataDictionary [(NSString *) kCGImagePropertyOrientation] = orientation', trong đó' orientation' là một trong các số nguyên được đưa ra bởi @Anomie ở trên. –