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

Huge image tearing / disappearing on extreme scaling

我有一张 7589x5537 的大图片,我将其作为 QPixmapGraphicsItem

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

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

我读过有关 X11 限制的内容,但我在 Windows。

我正在使用 Qt 5.5

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

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

这个问题似乎与 unsigned int 的最大值有关,如果不旋转则与维度无关。创建 100 万 x 200 像素的未倾斜图像,可以放大到 4384 倍。在我的电脑上unsigned 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();
}

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