gre*_*fab 11 qt qt4 qpixmap qimage
是否记录了任何已知的尺寸/空间限制QPixmap和/或QImage对象?我没有找到任何有用的信息.我目前在OSX和Windows上使用Qt 4.7.3.特别是我对以下内容感兴趣:
我天真地怀疑记忆是唯一的限制因此,人们可以通过计算最大尺寸
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)
在@ 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位整数).