我正在编写小图形编辑器,需要一些帮助。 我正在画这样的QImage:
void Editor::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
// zoom is an int, representing zoomFactor from 1 to 12.
painter.drawImage(
QRect(0, 0, image.width() * zoom , image.height() * zoom),
image);
if (zoom >= 3 && showGrid) {
painter.setPen(palette().foreground().color());
painter.setPen(Qt::DotLine);
// this is how I draw grid
for (int i = 0; i <= image.width(); ++i)
painter.drawLine(zoom * i, 0,
zoom * i, zoom * image.height());
for (int j = 0; j <= image.height(); ++j)
painter.drawLine(0, zoom * j,
zoom * image.width(), zoom * j);
}
// (...)
}
这样的图像很好用(16 x 16)
当我打开这样的图像(25×28)
时,麻烦就开始了
正如您所见,可以看到不同宽度和高度的像素! 我究竟做错了什么?请帮助:)
UPD:问题意外解决了。我注意到,编辑器是QGLWidget,因此我尝试将其更改为QWidget,一切正常。愚蠢的我 -_- 顺便说一句,可能有更方便的缩放图像的方法吗?(比如裁剪像素,不需要绘制)
答案 0 :(得分:1)
处理高度放大的图像的代码已经在Qt中被“优化”了一段时间,现在很不幸。我没有检查代码,但我的猜测是用于绘图的纹理“速度”或“偏移”是在浮点计算之前,现在使用固定点计算。
我不记得究竟引入了哪个版本,但是在4.0之后它还很早。我们的应用程序之一需要允许放置具有子像素精度的十字,并且当缩放系数高时缩放点,您可以注意到图像是“摇摆”。
我是第一个不会在其他人的代码中声明错误的人,除非100%肯定,但这是我确实100%肯定的情况之一。
唯一的出路是手动绘制缩放图像,重新实现纹理映射代码或(如果只需要int > 1
缩放因子),通过drawRect
一次绘制一个像素...它应该在PC上足够快。
请注意,该错误可能是视频驱动程序的常见错误,而不是Qt中的错误...我已经看到我们的软件上存在的问题出现在不同的平台上(Windows / Linux / OsX),实际上只有IIRC使用QWidget
时(而不是使用QGLWidget
时)。