Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QImage调整大小_C++_Qt_Drawing_Sprite - Fatal编程技术网

C++ QImage调整大小

C++ QImage调整大小,c++,qt,drawing,sprite,C++,Qt,Drawing,Sprite,我正在编写小型图形编辑器,需要一些帮助。 我正在画这样的奇玛格: 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()

我正在编写小型图形编辑器,需要一些帮助。 我正在画这样的奇玛格:

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); 
    }

    // (...)
} 
void编辑器::paintEvent(QPaintEvent*event)
{
油漆工(本);
//zoom是一个int,表示从1到12的zoomFactor。
画师(
QRect(0,0,image.width()*缩放,image.height()*缩放),
图像);
如果(缩放>=3&&showGrid){
painter.setPen(调色板().foreground().color());
painter.setPen(Qt::DotLine);
//这就是我画网格的方式

对于(int i=0;i处理高度缩放图像的代码在一段时间前已经在Qt中进行了“优化”,现在不幸的是出现了bug。我没有检查代码,但我的猜测是,用于绘制的纹理“速度”或“偏移量”在计算之前是用浮点计算的,而现在是用定点计算的

我不记得是哪一个版本引入的,但它在4.0之后很早就出现了。我们有一个应用程序,需要允许在缩放因子较高的点上放置亚像素精度和缩放的十字,您可以注意到图片“抖动”

我是第一个不会声称别人的代码中有bug的人,除非100%确定,但这是我确实100%确定的情况之一

唯一的解决方法是手动绘制缩放的图像,或者重新实现纹理映射代码,或者(如果您只需要
int>1
zoom factors),使用
drawRect
一次绘制一个像素……在PC上应该足够快


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

我很好奇——如果您的大图像是25x25(或28x28)问题是否仍然存在?如果不是,我会怀疑渲染正在缩放图像以适应其布局,布局大小为非平方比,宽度的缩放与高度的缩放无关。奇怪的是…只有当大小为16x16、32x32等时,它才能正常工作。看起来像是图像缩放中的舍入错误。这是什么平台?可能吗不复制,对我来说很好,Ubuntu 11.10KDE@winch请添加您的解决方案作为问题的答案,并接受它…而不是作为问题本身的更新。这是完全可以接受的(并受到鼓励)为了回答你自己的问题,如果你知道答案是什么。嗨,谢谢你的回答。我试着一个像素一个像素地画图像,效果也很好,但是当我尝试用image.setPixel函数在上面画东西时,它使用了很多CPU(25-99%)。当我用drawImage函数画图像时,这个问题不会发生。