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,则将禁用分配大小检查。此限制有助于应用程序避免因加载损坏的图像文件而意外地使用大量内存。 一般情况下不需要更改它。 默认限制对于所有常用的图像尺寸来说足够大。