2011-08-16 152 views
8

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

  • 宽度/高度限制?
  • 限制取决于颜色格式?
  • 32/64位机之间的区别?
  • 关于OS的区别?

我天真地怀疑内存是唯一的限制,因此人们可以通过

宽度x高度计算最大尺寸X byte_per_pixel

我认为还有一个更复杂的规则拇指当您运行GB尺寸时,32位机器也可能遇到寻址问题。

最后,我想存储大小约为16000x16000像素的多个RGBA图像,并在QGraphicsScene内使用透明度将它们渲染为彼此。可用的工作站可以有很多RAM,比如说16GB。

tl; dr:您知道QImage/QPixmap的大小限制,或者我可以在哪里找到这样的信息?

编辑:我意识到平铺的方法,我很好。尽管如此,了解上述内容仍然很棒。

谢谢!

回答

9

两者都限于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; 
} 
+0

这对'QPixmap'可能是正确的,但对于'QImage'的限制,请参阅@ povman的答案。 –

2

我居然有机会寻找到这一次。在qimage.cpp的源代码中搜索“可能溢出的健全性检查”,您可以看到Qt正在执行的检查。基本上,

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

你正在构建一个64位的应用程序?如果没有,你会很快遇到内存问题。在Windows上,即使机器的内存为16GB,32位进程也将被限制为2GB(除非是LARGEADDRESSAWARE,则为3GB)。一张16000x16000的图片将不到1GB,所以如果你非常幸运,你只能分配足够的内存给1,也许2。

使用64位应用程序,您应该可以为多张图像分配足够的内存。在回答

4

大厦由@查尔斯烧伤,下面是相关的源代码的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位整数)。