在我的应用程序中,用户可以从相册或相机中选择一张图片,我可以在其中获得 uiimage 表示。由于相册可能有来自网络的图片,因此文件类型不仅是 jpg。然后我需要将它发送到服务器而不进行转换。这里我只能使用nsdata。
我知道 UIImageJPEGRepresentation 和 UIImagePNGRepresentation,但我认为这两种方法可以转换原始图像。也许当质量设置为 1 UIImageJPEGRepresentation 可以获得原始图片?
有什么方法可以获取原始的uiimage nsdata?
问问题
3266 次
2 回答
7
您可以使用ALAssetsLibrary
andALAssetRepresentation
来获取原始数据。例子:
- (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
orUIImagePNGRepresentation
作为后备。但在这种情况下,您将无法获得原始数据,例如缺少元数据(EXIF 等)。
于 2012-08-25T11:38:53.703 回答
1
在 iOS 8.0+ 上,在资产中找到相应资产后使用 PHImageManager.default().requestImageData()(您可以使用 PHAsset.fetchAssets() 获取资产。
在我对非常相似的问题如何上传取自 UIImagePickerController 的图像的回答中查看更多信息和示例代码。
于 2017-01-11T17:22:24.900 回答