从UIImagePickerController选择的UIImage大小变化问题

6
在从UIImageController选择图像并计算其大小时,图像的大小存在变化,即磁盘中的图像大小不同。是否有方法可以获取正确的大小?
我已经尝试过以下方法 -
1. 使用UIImagePNGReprensentationUIImageJPEGReprensentation将图像转换为数据。这种方法的问题是 -
a. 这种方法会消耗内存,所以效果不佳。
b. 大小会变化,我可以理解它将图像转换为数据然后计算大小,因此大小不同。
但是,无论我搜索什么,每个被接受的答案都是基于这个的。
2. 使用ALAssetsLibrary获取图像大小,但从这里计算出的大小也与磁盘大小不匹配。
我使用了以下方法 - assetForURL: resultBlock:^(ALAsset *asset) failureBlock: 3. 使用CGImageRef方法CGImageGetBytesPerRow,但这也没有给出期望的结果。
是否还有其他我错过的方法?
编辑 -
因此,以下是大小差异 -
当我在查找器中检查图像大小时 - 5.3 MB
当我使用以下方法检查UIImage对象的大小时 -
UIImageJPEGRepresentation (image.1.0) - 2.29 MB
当我使用ALAsset库检查图像大小时 - 4.4 MB

你考虑过这个因素吗? - itechnician
@itechnician,我并没有在系统之间移动文件,我所做的是从iPhone相机中捕获图像,将其导入到Mac上,在Mac上检查图像大小,但是我从UIImage计算出的大小与实际大小差别很大。 - rishi
实际图像尺寸和您计算的尺寸是多少?您能发布变化吗? - itechnician
@itechnician - 请检查上面编辑过的帖子。 - rishi
请问在MAC中导入图像时,它是PNG还是JPG格式?因为文件类型直接影响图像大小。 - CodeChanger
显示剩余2条评论
4个回答

0

UIImageJPEGRepresentationUIImagePNGReprensentation使用不同的压缩方法和比率来处理图像,这就是为什么你会得到不同大小的图像。

此外,ALAssetLibrary对图像使用不同的压缩方法,这就是为什么每次都会得到不同大小的图像。

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


0

和其他回答一样,不同的图像读取技术会导致在磁盘文件大小和内存文件大小上进行比较时产生不同的大小。

我建议查看this SO帖子。该用户使用NSFileSize属性来读取磁盘上的“实际”大小。

我敢说,由于用于表示内存中的图像与存储在磁盘上的图像的支持机制不同,始终会存在磁盘上的内容与内存中的内容大小差异。

您可能需要改变您的方法。如果您的目标是确定内存中的图像“大小”,那么您必须根据您使用的压缩机制来测量大小。如果您的目标是确定文件在磁盘上的“大小”,那么我建议询问操作系统提供有关该图像在磁盘上的元数据(NSFileSize)。同样,根据您用于将图像保存到磁盘的压缩技术的不同,大小比较也会有所不同。使用NSFileSize将为您提供使用JPEG、PNG等压缩技术时图像在磁盘上的“实际”大小的明确答案。


-1

我需要类似的东西,也遇到了同样的问题。结果发现稍微调整一下质量因子就可以解决这个问题。

UIImageJPEGRepresentation(image, 0.67)

理想情况下,quality 应该为 1.0,以便以最精确的形式计算图像大小。结果发现,对于 1.0 质量,它会提供异常大的值。
我无法在任何地方找到这个记录,并不得不将上述解决方案保留在我的照片应用程序中。对于我的用例来说,它一直运作良好。虽然不是理想的,但您可能需要进一步调整它以最适合您的用例。

检查上面编辑过的帖子,你是否遇到过这种问题。 - rishi
不完全是这样。但是,文件大小存在异常大的差异。在我的情况下,几乎所有图像都是由相机拍摄的JPEG格式照片。我只能确认这一点适用于UIImageJPEGRepresentation函数。 - Tarun Tyagi

-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];
    });
}

你读了问题吗?我的问题与大小变化有关,而且我特别提到了以MB为单位的大小。磁盘大小与UIImage对象的大小。 - rishi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接