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