关于图片在内存中的大小(k或者M)

最近在做一个上传图片的功能,但是清晰度不能太低,图片也不能太大,但是计算这块儿就出现了难题。
OSS对尺寸大小有限制,不能超过4096。 我们从相册选择好图片,先判断大小,查了很多资料发现是不对的,计算出来跟在mac或者手机里是不一样的,偏很大,比如这种方法:

image.size.width * image.size*height * 4 / 1024 /1024 = 0.5M
我计算出来比实际大了3倍
复制代码

还有这种方法:

NSData *data = UIImageJPEGRepresentation(image, 1);
(unsigned long)data.length/1024/1024 = 0.5M
也是不行,大小跟上面差不多
复制代码

找到一个大小计算正确的:

CGFloat imageDataSize = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil].fileSize/1024;//计算出来是k
filePath是图片的路径,比如从照片库拿到的info[UIImagePickerControllerImageURL]的路径,或者从沙盒拿到的路径都可以计算。
复制代码

又碰见一个问题,如果分辨率过大,我们要对图片进行缩放,缩放完成之后大小会改变,所以我们还要对图片进行一次计算,但是现在image在内存中,没有路径,我们怎么计算?既然从路径拿到的大小是正确的,那么我们就给它一个路径,存到临时文件夹,计算完大小再删除。

//计算image大小
+(CGFloat)getImageTrueSize:(UIImage *)image{
    NSData *imgData = UIImageJPEGRepresentation(image, 1.0);
    NSFileManager *manager = [NSFileManager defaultManager];
    NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.jpeg",@"123"]; //这里的名字可以随便起,我们计算完就给删掉了
    if(![manager fileExistsAtPath:filePath]){
        [manager createFileAtPath:filePath contents:imgData attributes:nil];
    }else{
        [imgData writeToFile:filePath atomically:YES];
    }
    CGFloat imageDataSize = [manager attributesOfItemAtPath:filePath error:nil].fileSize/1024;
    [manager removeItemAtPath:filePath error:nil];
    return imageDataSize;
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值