巨大的图像在极端缩放时撕裂/消失



我有一个 7589x5537 的大图像,我把它放在一个场景中作为QPixmapGraphicsItem

如果我将QGraphicsView缩放到 14.2318 并将其旋转 -35 度,像素图的渲染开始表现得很奇怪;撕裂或完全消失。

这在其他旋转和缩放时也会发生,但前提是它们的缩放比例超过 14。

我已经阅读了有关X11限制的信息,但我使用的是Windows。

我使用的是Qt 5.5

我已经测试了将图像内容更改为树形模式的桶填充,完全相同的行为。图像已编入索引,但使用 RGB 时我遇到了同样的问题。

任何人都知道为什么会发生这种情况以及如何解决它?问题是否可重现?

该问题似乎与无符号 int 的最大值有关,如果不旋转,则与维度无关。创建 100 万 x 200 像素的未倾斜图像,可以放大到 4384 倍。在我的电脑中,无符号 int 的大小为 4 个字节,可以处理大约高达 40 亿的值。

我认为Qt在缩放之前不会将放大的图像裁剪到视图中,或者类似的东西。奇怪的是,它撕裂了它,而不是崩溃耗尽资源,无法分配连续内存或其他东西。

这些都是怀疑,因为目前我不知道QGraphicsView是如何实现扩展的。

#include <QtWidgets>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
unsigned int w = 7589;
unsigned int h = 5537;
QImage image(w, h, QImage::Format_ARGB32);
for(unsigned int j = 0; j < h; j++)
{
for(unsigned int i = 0; i < w; i++)
{
QRgb rgb = qRgb(i%255,j%255,(i+j)%255);
image.setPixel(i, j, rgb);
}
}
QPixmap imagepm = QPixmap::fromImage(image);
QGraphicsPixmapItem* item = new QGraphicsPixmapItem(imagepm);
item->setTransformationMode(Qt::FastTransformation);
QGraphicsScene* scene = new QGraphicsScene;
scene->addItem(item);
QGraphicsView* view = new QGraphicsView(scene);
view->rotate(-35);
view->scale(14.2318,14.2318);
view->show();
return a.exec();
}

此修复需要将图像剪切成磁贴,将它们分组到单个父项目下,然后像以前一样继续。磁贴将是您无需担心的实现细节。

最新更新