QImage/QPixmap大小限制?

gre*_*fab 11 qt qt4 qpixmap qimage

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

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

我天真地怀疑记忆是唯一的限制因此,人们可以通过计算最大尺寸

width x height x byte_per_pixel

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

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

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

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

谢谢!

Cha*_*rns 12

两者都限制为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;
}
Run Code Online (Sandbox Code Playgroud)


Luk*_*rth 6

在@ 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)
Run Code Online (Sandbox Code Playgroud)

所以这里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位整数).