c – QImage调整大小

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

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...