QImage / QPixmap大小限制?

时间:2011-08-16 14:42:10

标签: qt qt4 qimage qpixmap

是否记录了QPixmap和/或QImage个对象的已知大小/空间限制?我没有找到任何有用的信息。我目前在OSX和Windows上使用Qt 4.7.3。我特别感兴趣的是:

  • 宽度/高度限制?
  • 根据颜色格式限制?
  • 32/64位机器之间的区别?
  • 关于操作系统的区别?

我天真地怀疑记忆是唯一的限制,所以可以通过

来计算最大尺寸
  

width x height x byte_per_pixel

我认为有一个更精细的经验法则;当你遇到GB尺寸时,32位机器也可能有解决问题。

最后,我希望存储大小约为16000x16000像素的多个RGBA图像,并使用透明度在QGraphicsScene内相互渲染。可用的工作站可以有很多RAM,比方说16GB。

tl; dr:您了解QImage / QPixmap的大小限制,或者我在哪里可以找到此类信息?

编辑:我知道平铺方法,我很好。知道上述事情仍然会很棒。

谢谢!

4 个答案:

答案 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正在进行的检查。基本上,

  • 所需的字节数(width * height * depth_for_format)必须小于INT_MAX
  • 在您创建malloc实例时,必须能够QImage这些字节。

答案 3 :(得分:0)

您正在构建64位应用程序吗?如果没有,您将很快遇到内存问题。在Windows上,即使机器具有16GB内存,32位进程也将限制为2GB(除非它是LARGEADDRESSAWARE然后是3GB)。一个16000x16000的图像将不到1 GB,因此你只能为1分配足够的内存,如果你非常幸运,可能只有2分。

使用64位应用程序,您应该能够为多个图像分配足够的内存。