簡體   English   中英

如何獲取uiimage的原始nsdata?

[英]How can i get original nsdata of uiimage?

在我的應用程序中,用戶可以從相冊或相機中選擇一張圖片,我可以在其中獲得uiimage表示。 由於相冊可能包含來自網絡的圖片,因此文件類型不僅是jpg。 然后,我需要將其發送到服務器而不進行轉換。 在這里我只能使用nsdata。
我知道UIImageJPEGRepresentation和UIImagePNGRepresentation,但是我認為這兩種方法可以轉換原始圖像。 也許當質量設置為1 UIImageJPEGRepresentation時可以獲得原始圖片嗎?
有什么方法可以獲取原始的uiimage nsdata嗎?

您可以使用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:將失敗,而不會再次詢問用戶。 僅當您在“系統設置”中重置位置警告時,才會再次詢問用戶。

因此,您應該准備UIImageJPEGRepresentation此方法失敗,並使用UIImageJPEGRepresentationUIImagePNGRepresentation作為后備。 但是在那種情況下,您將不會獲得原始數據,例如,缺少元數據(EXIF等)。

在iOS 8.0+上,在資產中找到相應資產后,請使用PHImageManager.default()。requestImageData()(可以使用PHAsset.fetchAssets()進入資產)。

對非常相似的問題的答案中 ,請參見更多信息和示例代碼。 如何上傳從UIImagePickerController拍攝的圖像

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM