极端缩放时巨大的图像撕裂/消失
Huge image tearing / disappearing on extreme scaling
我有一张 7589x5537 的大图片,我将其作为 QPixmapGraphicsItem
。
如果我将 QGraphicsView
缩放到 14.2318 并将其旋转 -35 度,像素图的渲染开始表现怪异;撕裂或完全消失。
其他旋转和缩放也会发生这种情况,但前提是它们的缩放比例超过 14。
我读过有关 X11 限制的内容,但我在 Windows。
我正在使用 Qt 5.5
我已经测试过将图像的内容更改为树形图案的 bucketfill,行为完全相同。图像已编入索引,但使用 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();
}
修复需要将图像切割成图块,将它们分组在一个父项目下,然后像以前一样继续。磁贴将是您无需担心的实现细节。
我有一张 7589x5537 的大图片,我将其作为 QPixmapGraphicsItem
。
如果我将 QGraphicsView
缩放到 14.2318 并将其旋转 -35 度,像素图的渲染开始表现怪异;撕裂或完全消失。
其他旋转和缩放也会发生这种情况,但前提是它们的缩放比例超过 14。
我读过有关 X11 限制的内容,但我在 Windows。
我正在使用 Qt 5.5
我已经测试过将图像的内容更改为树形图案的 bucketfill,行为完全相同。图像已编入索引,但使用 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();
}
修复需要将图像切割成图块,将它们分组在一个父项目下,然后像以前一样继续。磁贴将是您无需担心的实现细节。