绘制缩放QImage时如何保证像素大小均匀?
How to ensure even pixel size when painting scaled QImage?
我有一个由 QImage
加载的 8x8 像素的 4 通道 png 图像。 QImage
然后按 200 倍缩放,因此图像将具有 1600x1600 的新分辨率,每个原始像素的大小为 200x200。但是,当通过 QPixmap
将此图像添加到 QLabel
并显示在屏幕上时,绘制的像素大小将略有不同。
我已经使用 Gimp
截取了屏幕截图并更仔细地查看了绘制的图像。似乎每个其他像素都比它应该的稍大,例如 201 而不是 200 像素宽。然后一行中的最后一个像素将变小以进行补偿,从而使整个图像最终具有正确的大小。
并非所有缩放因子都会发生这种情况,例如 100 就可以,2 的幂也是如此,例如 256。
我最初的方法是使用 QGraphicsView
和 QGraphicsPixmapItem
,在这种情况下,我缩放了 GraphicsItem 而不是图像。效果是一样的。
我在这里看到了什么效果?如果有的话,可以做些什么?
重现此问题的代码非常简单
int scale = 200;
image = QImage("some image file");
QPixmap pixmap = QPixmap::fromImage(image.scaled(image.size() * scale));
some_label->setPixmap(pixmap);
事实证明,解决我的问题最简单的方法是在 QGraphicsView
:
中使用 QOpenGLWidget
setViewport(new QOpenGLWidget);
构造函数中的这一行在缩放图像时会产生更高的精度,但需要注意的是添加 OpenGL
作为依赖项。
这种方法的另一个陷阱是调用 setViewport
会使在 QGraphicsView
上完成的许多设置无效。因此,如果视图是在 UI 文件中设置的,就像我的情况一样,请确保在 调用 setViewport
.
之后调用其他设置器
我找不到更好的解决方案,如果没有 OpenGL
,我当然无法编写自己的光栅器。
我有一个由 QImage
加载的 8x8 像素的 4 通道 png 图像。 QImage
然后按 200 倍缩放,因此图像将具有 1600x1600 的新分辨率,每个原始像素的大小为 200x200。但是,当通过 QPixmap
将此图像添加到 QLabel
并显示在屏幕上时,绘制的像素大小将略有不同。
我已经使用 Gimp
截取了屏幕截图并更仔细地查看了绘制的图像。似乎每个其他像素都比它应该的稍大,例如 201 而不是 200 像素宽。然后一行中的最后一个像素将变小以进行补偿,从而使整个图像最终具有正确的大小。
并非所有缩放因子都会发生这种情况,例如 100 就可以,2 的幂也是如此,例如 256。
我最初的方法是使用 QGraphicsView
和 QGraphicsPixmapItem
,在这种情况下,我缩放了 GraphicsItem 而不是图像。效果是一样的。
我在这里看到了什么效果?如果有的话,可以做些什么?
重现此问题的代码非常简单
int scale = 200;
image = QImage("some image file");
QPixmap pixmap = QPixmap::fromImage(image.scaled(image.size() * scale));
some_label->setPixmap(pixmap);
事实证明,解决我的问题最简单的方法是在 QGraphicsView
:
QOpenGLWidget
setViewport(new QOpenGLWidget);
构造函数中的这一行在缩放图像时会产生更高的精度,但需要注意的是添加 OpenGL
作为依赖项。
这种方法的另一个陷阱是调用 setViewport
会使在 QGraphicsView
上完成的许多设置无效。因此,如果视图是在 UI 文件中设置的,就像我的情况一样,请确保在 调用 setViewport
.
我找不到更好的解决方案,如果没有 OpenGL
,我当然无法编写自己的光栅器。