从UIImagePickerController中挑选时的UIImage大小变化

时间:2016-06-20 06:08:04

标签: ios objective-c iphone uiimage uiimagepickercontroller

UIImageController中选择图像并计算其大小时,图像大小会有所不同,即磁盘中图像的大小不同。

有没有办法获得合适的尺寸?

我尝试了什么 -

  1. 使用UIImagePNGReprensentation&将图像转换为数据UIImageJPEGReprensentation。这种方法存在问题 -
  2. 一个。这种方法耗费内存,所以看起来并不好。

    湾大小不一,我可以理解它将图像转换为数据然后计算大小,因此大小不同。

    但无论我搜索到什么,每个接受的答案都只是围绕着这个。

    1. 使用ALAssetsLibrary获取图片大小,但根据此计算的大小也与磁盘大小不匹配。
    2. 我使用了以下方法 - assetForURL: resultBlock:^(ALAsset *asset) failureBlock:

      1. 使用CGImageRef方法CGImageGetBytesPerRow,但这也无法提供所需的结果。
      2. 我错过了其他方法吗?

        编辑 -

        所以这是尺寸差异 -

        当我在finder中检查图像大小时 - 5.3 MB

        当我使用 -

        检查UIImage对象大小时

        UIImageJPEGRepresentation(图像.1.0) - 2.29 MB

        使用ALAsset Library检查图像大小时 - 4.4 MB

4 个答案:

答案 0 :(得分:0)

UIImageJPEGRepresentation & UIImagePNGReprensentation 正在为图像使用不同的压缩方法和比率,这就是为什么你会得到不同尺寸的图像。

ALAssetLibrary 对图像使用不同的图像压缩方法,这就是每次都获得不同大小的图像的原因。

只需使用三种方法中的任何一种来获取图像大小,不要试图比较它们。因为这三种方法都使用自己的图像压缩方法。

答案 1 :(得分:0)

与帖子中的其他答案一样,在比较磁盘文件大小和内存文件大小时,不同的图像读取技术将导致不同的大小。

我建议查看this SO帖子。用户正在使用NSFileSize属性来读取"实际"磁盘大小。

我冒昧地说,由于用于表示内存中的图像与存储在磁盘上的图像的支持机制,磁盘上的内容与内存中的大小之间总会存在大小差异。

您可能想要改变您的方法。如果您的目标是确定图像"尺寸"在内存中,您必须根据您使用的压缩机制测量大小。如果您的目标是确定文件" size"当它在磁盘上时,我建议要求操作系统为您提供有关磁盘上该映像的元数据(NSFileSize)。同样,根据您用于将图像保存到磁盘的压缩技术,大小比较会有所不同。使用NSFileSize将为您提供明确的回答#34;实际"使用压缩技术的磁盘上的图像大小是JPEG,PNG等。

答案 2 :(得分:-1)

我需要类似的东西并遇到同样的问题。原来调整品质因素有点过时了。

UIImageJPEGRepresentation(image, 0.67)

理想情况下,quality应为1.0,以便以最精确的形式计算图像大小。事实证明它为你提供了1.0质量异常大的值。

我无法在任何地方找到此文档,并且必须在我的照片应用中保留上述解决方案。它一直在用我的用例。它并不理想,您可能需要进一步调整一下以最适合您的用例。

答案 3 :(得分:-1)

我遇到的问题是捕获的图像的图像大小太大我无法管理它所以我不得不将其调整到我想要的大小...我在这里添加我的代码

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    dispatch_async(dispatch_get_main_queue(), ^{
    for(UIView *v in imgView.subviews) {
        [v removeFromSuperview];
    }
    CGSize newSize=CGSizeMake(200, 200);
    UIImage *image = [info valueForKey: UIImagePickerControllerOriginalImage];
    UIGraphicsBeginImageContext(newSize);
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [imgView setImage:newImage];

    [self.view layoutIfNeeded];
    [self.navigationController dismissViewControllerAnimated: YES completion: nil];
    });
}