是否记录了QPixmap
和/或QImage
个对象的已知大小/空间限制?我没有找到任何有用的信息。我目前在OSX和Windows上使用Qt 4.7.3。我特别感兴趣的是:
我天真地怀疑记忆是唯一的限制,所以可以通过
来计算最大尺寸width x height x byte_per_pixel
我认为有一个更精细的经验法则;当你遇到GB尺寸时,32位机器也可能有解决问题。
最后,我希望存储大小约为16000x16000像素的多个RGBA图像,并使用透明度在QGraphicsScene
内相互渲染。可用的工作站可以有很多RAM,比方说16GB。
tl; dr:您了解QImage / QPixmap的大小限制,或者我在哪里可以找到此类信息?
编辑:我知道平铺方法,我很好。知道上述事情仍然会很棒。
谢谢!
答案 0 :(得分:11)
两者都限制为32767x32767像素。也就是说,您可以将它们视为对X和Y分辨率使用带符号的16位值。
即使另一个轴只有1个像素,也没有轴可以超过32767像素。操作系统“位数”不影响限制。 在创建这样一个巨大的图像之前,底层系统可能会遇到其他限制,例如你提到的内存。
您可以在以下源代码中看到此限制的示例: http://git.zx2c4.com/qt/plain/src/gui/image/qpixmap_x11.cpp
if (uint(w) >= 32768 || uint(h) >= 32768) {
w = h = 0;
is_null = true;
return;
}
答案 1 :(得分:5)
以@ charles-burns的答案为基础,这里是QImage的相关源代码:
QImageData *d = 0;
if (format == QImage::Format_Invalid)
return d;
const int depth = qt_depthForFormat(format);
const int calc_bytes_per_line = ((width * depth + 31)/32) * 4;
const int min_bytes_per_line = (width * depth + 7)/8;
if (bpl <= 0)
bpl = calc_bytes_per_line;
if (width <= 0 || height <= 0 || !data
|| INT_MAX/sizeof(uchar *) < uint(height)
|| INT_MAX/uint(depth) < uint(width)
|| bpl <= 0
|| height <= 0
|| bpl < min_bytes_per_line
|| INT_MAX/uint(bpl) < uint(height))
return d; // invalid parameter(s)
所以在这里,bpl
是每行的字节数,实际上是width * depth_in_bytes
。在最后的无效测试中使用代数:
INT_MAX/uint(bpl) < uint(height)
INT_MAX < uint(height) * uint(bpl)
INT_MAX < height * width * depth_in_bytes
因此,您的图像总大小必须小于2147483647(对于32位整数)。
答案 2 :(得分:2)
我实际上有机会一次调查这个。在qimage.cpp
的源代码中搜索“对潜在溢出进行健全性检查”,您可以看到Qt正在进行的检查。基本上,
INT_MAX
。malloc
实例时,必须能够QImage
这些字节。答案 3 :(得分:0)
您正在构建64位应用程序吗?如果没有,您将很快遇到内存问题。在Windows上,即使机器具有16GB内存,32位进程也将限制为2GB(除非它是LARGEADDRESSAWARE然后是3GB)。一个16000x16000的图像将不到1 GB,因此你只能为1分配足够的内存,如果你非常幸运,可能只有2分。
使用64位应用程序,您应该能够为多个图像分配足够的内存。