【问题标题】:Huge image tearing / disappearing on extreme scaling极端缩放时巨大的图像撕裂/消失
【发布时间】:2018-05-03 18:18:06
【问题描述】:

我有一张 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();
}

【问题讨论】:

    标签: qt qt5 qgraphicsview tearing


    【解决方案1】:

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

    【讨论】:

    • 我会看看平铺是否能解决问题并回复您。你能详细说明撕裂发生的原因吗?你是什​​么意思'一个你不需要担心的实现细节'?请注意,使用 QImage 可能会更糟,我检查了图像查看器 qt creator's example 并没有限制放大。程序崩溃耗尽内存。
    • 查看我的更新。我强烈怀疑这个问题实际上与图像的大小无关,如果我有一个比 unsigned int 大小更大的场景,我也会有同样的效果。我将尝试用两个相隔 4G 像素的单像素图​​像来证明这一点。
    • 好吧,我错了。如果图像被分割,问题会出现相对于每块的大小,因此块值的缩放时间宽度必须适合 4 字节的无符号整数。
    • 场景坐标是浮点数,所以场景大小无关紧要。图像绘制代码使用整数来提高速度,因此缩放系数太大是不可用的。虽然平铺是微不足道的。
    • 作为实现细节的图块意味着处理整个图像的代码仍然看到单个QGraphicsItem。瓷砖是它的孩子,不是什么大问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多