如何获取uiimage的原始nsdata



在我的应用程序中,用户可以从相册或相机中选择一张图片,我可以在其中获得ui图像表示。由于相册可能有来自网络的图片,文件类型不仅仅是jpg。然后我需要将它发送到服务器,而不进行转换。在这里我只能使用nsdata。
我知道UIImageJPEGRepresentation和UIImagePNGRrepresentation,但我认为这两种方法可能会转换原始图像。也许当质量设置为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:将失败,而不会再次询问用户。只有在系统设置中重置了位置警告时,才会再次询问用户

因此,您应该做好此方法失败的准备,并使用UIImageJPEGRepresentationUIImagePNGRepresentation作为回退。但在这种情况下,您将无法获得原始数据,例如元数据(EXIF等)丢失。

在iOS 8.0+上,在资产中找到相应的资产后,使用PHImageManager.default().requestImageData()(您可以使用PHAsset.fetchAssets().访问资产

请参阅我对类似问题的回答中的更多信息和示例代码如何上传从UIImagePickerController拍摄的图像。

最新更新