1

我有一个 7589x5537 的大图像,我将它作为QPixmapGraphicsItem.

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

这也发生在其他旋转和比例上,但前提是它们的比例大于 14。

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

我在 Qt 5.5

我已经测试了将图像的内容更改为树模式的桶填充,完全相同的行为。图像已编入索引,但使用 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();
}
4

1 回答 1

0

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

于 2018-05-02T22:33:19.317 回答