Огромное изображение разрывается / исчезает при экстремальном масштабировании

У меня есть большое изображение 7589x5537, которое я вставил в сцену как QPixmapGraphicsItem,

Если я масштабирую QGraphicsView до 14.2318 и повернуть его на -35 градусов, рендеринг растрового изображения начинает вести себя странно; разрывая или полностью исчезая.

Это происходит также при других поворотах и ​​масштабах, но только в том случае, если их масштабирование больше 14.

Я читал об ограничениях X11, но я на Windows.

Я на Qt 5.5

Я протестировал изменение содержимого изображения на шаблон дерева, точно такое же поведение. Изображение проиндексировано, но с RGB у меня та же проблема.

У кого-нибудь есть подсказка, почему это происходит и как это исправить? Является ли проблема воспроизводимой?

Кажется, проблема связана с максимальным значением unsigned int, независимым от размера, если не повернуто. Создавая изображение размером 1 на 200 пикселей, можно увеличить изображение до 4384х. На моем компьютере размер целого без знака составляет 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 ответ

Решение

Исправление требует разрезать изображение на плитки, сгруппировать их под одним родительским элементом, а затем продолжить, как вы делали раньше. Плитки будут деталями реализации, о которых вам не нужно беспокоиться.

Другие вопросы по тегам