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

时间:2018-05-02 17:32:07

标签: qt qt5 qgraphicsview tearing

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

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

这种情况也发生在其他轮换和尺度上,但前提是它们的比例大于14。

我已经了解了X11的限制,但我在Windows上。

我在Qt 5.5上

我已经测试过将图像内容更改为树形图案的桶装填充,完全相同的行为。图像被编入索引,但是使用RGB我有同样的问题。

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

该问题似乎与unsigned int的最大值有关,如果不旋转则与维度无关。创建一个100万乘200像素的图像,可以缩放到4384x。在我的计算机中,unsigned int的大小是4个字节,可以处理大约4000万的值。

我认为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();
}

1 个答案:

答案 0 :(得分:0)

修复需要将图像切割成图块,将它们分组到单个父项下,然后按照之前的步骤进行处理。磁贴将是一个您不必担心的实现细节。