2012-08-25 60 views
1

在我的應用程序中,用戶可以從專輯或相機中選擇一張照片,在這裏我可以獲得uiimage表示。由於專輯可能有來自網絡的圖片,因此文件類型不僅僅是jpg。然後我需要將它發送到服務器而無需轉換。在這裏,我只能使用nsdata。
我知道UIImageJPEGRepresentation和UIImagePNGRepresentation,但我認爲這兩種方法可能會轉換原始圖像。也許當質量設置爲1 UIImageJPEGRepresentation可以得到原始圖片?
有沒有什麼方法可以獲得原始的uiimage nsdata?我如何獲得uiimage的原始nsdata?

+0

據我所知,照相機膠捲中的圖片以JPEG格式存儲(至少這是我看到在SSH設備和檢查文件後看到的),因此JPEG代表會工作在你的情況下 –

+0

@KaanDedeoglu:許多應用程序都有一個功能「存儲在相冊中」,並且它也適用於TIFF,BMP和其他一些文件類型。 –

回答

6

您可以使用ALAssetsLibraryALAssetRepresentation來獲取原始數據。例如:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    NSURL *imageURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init]; 
    [library assetForURL:imageURL resultBlock:^(ALAsset *asset) { 
     ALAssetRepresentation *repr = [asset defaultRepresentation]; 
     NSUInteger size = repr.size; 
     NSMutableData *data = [NSMutableData dataWithLength:size]; 
     NSError *error; 
     [repr getBytes:data.mutableBytes fromOffset:0 length:size error:&error]; 
      /* Now data contains the image data, if no error occurred */ 
    } failureBlock:^(NSError *error) { 
     /* handle error */ 
    }]; 
} 

但也有一些事情要考慮:

  • assetForURL:以異步方式工作。
  • 在設備上,使用assetForURL:將導致一個確認對話框,這可能會刺激用戶:

「你的應用」想用您的當前位置。這允許訪問 在照片和視頻中定位信息。

  • 如果用戶拒絕訪問,assetForURL:調用失敗塊。
  • 下次您使用此方法時,assetForURL:將會失敗,但不會再詢問用戶。只有在系統設置中重置位置警告時,纔會再次詢問用戶。

因此,您應該準備好此方法失敗,並使用UIImageJPEGRepresentationUIImagePNGRepresentation作爲後備。但在這種情況下,您將無法獲得原始數據,例如元數據(EXIF等)丟失。

+0

謝謝!我還沒有注意到imagePickerController:didFinishPickingImage:editingInfo:已被棄用。 –