QImage打开分辨率大的图片会报错:QImageIOHandler: Rejecting image

1、现象描述 

QImage打开分辨率大的图片(例如9344*7000),会报错,提示信息如下:

qt.gui.imageio: QImageIOHandler: Rejecting image as it exceeds the current allocation limit of 128 megabytes

QImage image1(file_path);
qDebug() << image1.format();
 
if (image1.format() == QImage::Format_Invalid)
{
//qt.gui.imageio: QImageIOHandler: Rejecting image as it exceeds the current allocation limit of 128 megabytes
    return;
}

2、解决办法

//原因是QImage默认最大仅支持128MB的文件
//我们的9344*7000的单通道图片就有62.3MB大小,而QImage是按照四通道来限制内存的,所以62.3MB*4=249.2MB
//解决办法就是扩容,使用setAllocationLimit函数,设置一个大于249.2MB的数值就可以

int m1 = QImageReader::allocationLimit(); //默认值是128MB
QImageReader::setAllocationLimit(250);    //设置大一些就可以了
int m2 = QImageReader::allocationLimit();
qDebug() << m1 << m2;
QImage image1(file_path);
qDebug() << image1.format(); //OK

注意:只有Qt6版本才有这个函数QImageReader::setAllocationLimit,Qt5是没有的。

3、我们来计算一下分辨率10000*10000的图片,需要分配多少内存。

先看单通道

10000*10000/1024/1024=95.367MB

再看四通道

95.367MB*4=381.468MB

所以QImage想正常打开一幅10000*10000的图片,需要预先设置

QImageReader::setAllocationLimit(382);

4、如果QImageReader::setAllocationLimit(0);会发生什么?

我们来看Qt6官方文档的介绍:

setAllocationLimit将分配限制设置为 mbLimit 兆字节。 需要高于此限制的 QImage 内存分配的图像将被拒绝。 如果 mbLimit 为 0,则将禁用分配大小检查。此限制有助于应用程序避免因加载损坏的图像文件而意外地使用大量内存。 一般情况下不需要更改它。 默认限制对于所有常用的图像尺寸来说足够大。

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值