QImage调整大小

4

我正在编写一个小型图形编辑器,需要一些帮助。 我正在这样绘制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 X 28),问题就开始了

2

如您所见,像素的宽度和高度不同!我做错了什么?请帮帮我 :)

更新:问题出乎意料地解决了。我注意到编辑器是QGLWidget,于是我尝试将其更改为QWidget,一切都正常工作了。我真是太蠢了-_- 顺便说一下,可能有更方便的方法来缩放图像吗?(例如裁剪不需要绘制的像素)


我很好奇 -- 如果你的大图像是25x25(或28x28),问题是否仍然存在?如果不是,我会怀疑渲染正在缩放图像以适应其布局,布局大小具有非正方形比率,并且宽度的缩放与高度的缩放是独立的。 - mah
奇怪...只有当大小为16x16、32x32等时才能正常工作。 - user999040
似乎是图像缩放时的舍入误差。这是哪个平台? - Stephen Chu
无法复现,对我来说运行良好,Ubuntu 11.10 KDE。 - pnezis
@winch 请将您的解决方案作为答案添加到问题中,并接受它...而不是作为问题本身的更新。如果您找到了答案,回答自己的问题在SO上是完全可以接受(并且鼓励的)做法。 - HostileFork says dont trust SE
显示剩余2条评论
1个回答

0
处理高度缩放图像的代码在Qt中已经进行了“优化”,但现在不幸的是出现了一些错误。我没有检查过代码,但我的猜测是用于绘制的纹理“速度”或“偏移量”以前是使用浮点数计算的,现在则使用固定点计算。
我不记得确切的版本是什么时候引入的,但它是在4.0之后相当早的一个版本。我们有一个应用程序需要允许在缩放因子很高时以亚像素精度和比例放置十字线,你会注意到图片在“抖动”。
我是第一个不会声称别人代码中有错误的人,除非我百分之百确定,但这是那种我确实百分之百确定的情况之一。
唯一的出路是手动绘制缩放后的图像,要么重新实现纹理映射代码,要么(如果您只需要int > 1缩放因子)逐个像素地使用drawRect绘制... 在PC上应该足够快。
请注意,错误可能是视频驱动程序的常见错误,而不是Qt中的错误... 我们发现我们的软件问题存在于不同的平台上(Windows / Linux / OsX),确实只有在使用QWidget时才会出现(而不是使用QGLWidget)。

你好,感谢您的回复。我尝试逐像素绘制图像,这也可以正常工作,但是当我使用image.setPixel函数在其上绘制时,它会占用大量CPU(25-99%)。但是,当我使用drawImage函数来绘制图像时,这个问题就不会发生。 - user999040

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接