在我的应用程序中,用户可以从相册或相机中选择一张可以获得uiimage表示的照片。由于专辑可能有来自网络的图片,因此文件类型不仅仅是jpg。然后我需要将它发送到服务器而不转换。在这里我只能使用nsdata。
我知道UIImageJPEGRepresentation和UIImagePNGRepresentation,但我认为这两种方法可能会转换原始图像。也许当质量设置为1 UIImageJPEGRepresentation可以获得原始图片?
有没有什么方法可以获得原始的uiimage nsdata?
答案 0 :(得分:7)
您可以使用ALAssetsLibrary
和ALAssetRepresentation
来获取原始数据。例如:
- (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
或UIImagePNGRepresentation
作为后备。但在这种情况下,您将无法获得原始数据,例如缺少元数据(EXIF等)。
答案 1 :(得分:1)
在iOS 8.0+上,在资源中找到相应的资产后,使用PHImageManager.default()。requestImageData()(您可以使用PHAsset.fetchAssets()获取资产。
在my answer中查看更多关于非常相似的问题How to upload image that was taken from UIImagePickerController的信息和示例代码。