Qt QImage/QPixmap大小限制?

Qt QImage/QPixmap大小限制?,qt,qt4,qimage,qpixmap,Qt,Qt4,Qimage,Qpixmap,记录的QPixmap和/或QImage对象是否存在已知的大小/空间限制?我没有找到任何有用的信息。我目前正在OSX和Windows上使用Qt4.7.3。我特别感兴趣的是: 宽度/高度限制 限制取决于颜色格式 32/64位计算机之间的差异 关于操作系统的区别 我天真地怀疑内存是唯一的限制,因此可以通过 宽度x高度x字节/像素 我认为有一个更为复杂的经验法则;此外,当运行到GB维度时,32位计算机可能存在寻址问题 最后,我想存储多个大约16000x16000像素大小的RGBA图像,并在qgrap

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

  • 宽度/高度限制
  • 限制取决于颜色格式
  • 32/64位计算机之间的差异
  • 关于操作系统的区别
我天真地怀疑内存是唯一的限制,因此可以通过

宽度x高度x字节/像素

我认为有一个更为复杂的经验法则;此外,当运行到GB维度时,32位计算机可能存在寻址问题

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

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

编辑:我知道平铺方法,对此我很满意。尽管如此,了解上述情况还是很好的


谢谢

两者都限制为32767x32767像素。也就是说,您可以将其视为对X和Y分辨率都使用带符号的16位值

任何轴都不能超过32767像素,即使另一个轴仅为1像素。操作系统“比特度”不影响限制。 在创建如此巨大的映像之前,底层系统可能会遇到其他限制,如您提到的内存

您可以在以下源代码中看到此限制的示例:


事实上,我曾经有机会调查过这件事。在
qimage.cpp
的源代码中搜索“针对潜在溢出的健全性检查”,您可以看到Qt正在执行的检查。基本上

  • 所需的字节数(宽度*高度*深度(对于\u格式)必须小于
    INT\u MAX
  • 它必须能够在创建
    QImage
    实例时
    malloc
    这些字节

您正在构建64位应用程序吗?否则,您将很快遇到内存问题。在Windows上,即使计算机有16GB的ram,32位进程也将被限制为2GB(除非它比3GB更大)。一个16000x16000映像的容量将略低于1GB,因此您只能为1分配足够的内存,如果非常幸运的话,可能会为2分配足够的内存


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

基于@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)
QImageData*d=0;
if(format==QImage::format_无效)
返回d;
const int depth=qt_depthForFormat(格式);
每行计算字节数=((宽度*深度+31)/32)*4;
每行最小字节数=(宽度*深度+7)/8;

如果(bpl)这对于
QPixmap
可能是正确的,但是对于
QImage
的限制,请参见@povman的答案。有人能详细说明什么是“轴”吗?缩放图像时出现渲染问题,这是由此引起的,但我关于何时开始撕裂的结果与32767不一致。在无法正确渲染qpixmap之前,我可以缩放100000x200图像41000x。此外,我还看到片段来自
qpixmap::fromImage
函数;我设置的限制在哪里是否使用具有文件名的构造函数创建pixmap?
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)