QImage调整大小

时间:2011-12-02 18:46:04

标签: c++ qt drawing sprite

我正在编写小图形编辑器,需要一些帮助。 我正在画这样的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) 1

当我打开这样的图像(25×28)

时,麻烦就开始了

2

正如您所见,可以看到不同宽度和高度的像素! 我究竟做错了什么?请帮助:)

UPD:问题意外解决了。我注意到,编辑器是QGLWidget,因此我尝试将其更改为QWidget,一切正常。愚蠢的我 -_- 顺便说一句,可能有更方便的缩放图像的方法吗?(比如裁剪像素,不需要绘制)

1 个答案:

答案 0 :(得分:1)

处理高度放大的图像的代码已经在Qt中被“优化”了一段时间,现在很不幸。我没有检查代码,但我的猜测是用于绘图的纹理“速度”或“偏移”是在浮点计算之前,现在使用固定点计算。

我不记得究竟引入了哪个版本,但是在4.0之后它还很早。我们的应用程序之一需要允许放置具有子像素精度的十字,并且当缩放系数高时缩放点,您可以注意到图像是“摇摆”。

我是第一个不会在其他人的代码中声明错误的人,除非100%肯定,但这是我确实100%肯定的情况之一。

唯一的出路是手动绘制缩放图像,重新实现纹理映射代码或(如果只需要int > 1缩放因子),通过drawRect一次绘制一个像素...它应该在PC上足够快。

请注意,该错误可能是视频驱动程序的常见错误,而不是Qt中的错误...我已经看到我们的软件上存在的问题出现在不同的平台上(Windows / Linux / OsX),实际上只有IIRC使用QWidget时(而不是使用QGLWidget时)。