绘制缩放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。

我最初的方法是使用 QGraphicsViewQGraphicsPixmapItem,在这种情况下,我缩放了 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,我当然无法编写自己的光栅器。