【问题标题】:How to ensure even pixel size when painting scaled QImage?绘制缩放的 QImage 时如何确保像素大小均匀?
【发布时间】:2017-10-08 11:36:53
【问题描述】:

我有一个 8x8 像素的 4 通道 png 图像,由 QImage 加载。然后将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);

【问题讨论】:

  • 我不确定这是否能解决您的问题,但您可以在绘制(未缩放的)像素图时自己进行缩放,如下所示:github.com/gerbilvis/gerbil/blob/master/gui/widgets/… 缩放通过此处设置的 QTransform 进行: github.com/gerbilvis/gerbil/blob/master/gui/widgets/…(您的 QTransform 设置起来要简单得多,具有固定的比例和平移)顺便说一句。这是使用 GL 渲染后端的一种非常有效的方法。
  • 谢谢。我永远不会猜到这个问题可能来自缩放算法。我认为这只是一个绘画/演示问题。但我只是将缩放后的图像保存到磁盘,果然,它也是错误的。感谢您的提示:)

标签: qt qgraphicsview qimage qpixmap


【解决方案1】:

原来解决我的问题最简单的方法是在QGraphicsView 中使用QOpenGLWidget

setViewport(new QOpenGLWidget);

构造函数中的这一行将在缩放图像时产生更高的精度,但需要注意的是添加OpenGL 作为依赖项。 这种方法的另一个问题是调用setViewport 会使QGraphicsView 上的许多设置无效。因此,如果视图是在 UI 文件中设置的,如我的情况,请确保在调用 setViewport 之后调用其他设置器

如果没有OpenGL,我找不到更好的解决方案,当然我自己的光栅化器也没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2023-03-19
    相关资源
    最近更新 更多