2017-10-08 82 views
1

我有一个4通道PNG图像与8x8像素由QImage加载。 QImage然后按比例缩放200倍,因此图像将具有1600x1600的新分辨率,每个原始像素的尺寸为200x200。但是,当通过QPixmap将此图像添加到QLabel并显示在屏幕上时,绘制的像素将具有略微不同的尺寸。如何在绘制缩放QImage时确保像素大小均匀?

我使用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); 
+1

我不确定这是否解决了您的问题,但是您可以在绘制(未缩放的)像素图时自行缩放,如下所示:https://github.com/gerbilvis/gerbil/blob/master/gui/ widgets/scaledview.cpp#L103缩放发生在这里:QTransform设置在这里:https://github.com/gerbilvis/gerbil/blob/master/gui/widgets/scaledview.cpp#L72(你的QTransform更容易设置与固定的规模和翻译)Btw。这是GL渲染后端非常有效的方法。 – ypnos

+0

谢谢。我从来没有猜到这个问题可能来自缩放算法。我认为这只是一个绘画/演示问题。但我只是将缩放后的图像保存到磁盘上,果然,这也是错误的。谢谢你的提示 :) – ifschleife

回答

0

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

setViewport(new QOpenGLWidget); 

这种单一的生产线将在添加OpenGL作为依赖项的警告时缩放图像会导致更高的精度。 使用这种方法的另一个问题是,调用setViewport使在QGraphicsView上完成的许多设置无效。因此,如果视图是在UI文件中设置的,就像我的情况一样,请务必在之后致电setViewport后致电其他设置器

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