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

У меня есть большое изображение 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 Ответ

0 голосов
/ 03 мая 2018

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

...