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