我怎样才能得到uiimage的原始nsdata?

在我的应用程序中,用户可以从专辑或照相机中select一张照片,在这里我可以获得uiimage表示。 由于专辑可能有来自networking的图片,文件types不仅是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:asynchronous工作。
  • 在设备上,使用assetForURL:会导致一个确认对话框,这可能会激怒用户:

“您的应用程序”想使用您的当前位置。 这允许访问照片和video中的位置信息。

  • 如果用户拒绝访问, assetForURL:调用失败块。
  • 下次您使用此方法时, assetForURL:将会失败,而不再询问用户。 只有在“系统设置”中重置位置警告时,才会再次询问用户。

所以你应该准备好这个方法失败,并使用UIImageJPEGRepresentationUIImagePNGRepresentation作为后备。 但在这种情况下,您将无法获得原始数据,例如元数据(EXIF等)丢失。

在iOS 8.0+上,使用PHImageManager.default()。requestImageData()在资产中find相应的资产(您可以使用PHAsset.fetchAssets()获取资产)。

在我的答案中看到更多的信息和示例代码非常类似的问题如何上载从UIImagePickerController采取的图像 。