在QImage上绘制QPainterPath的指定部分[zoom and pan]

时间:2015-09-13 09:42:23

标签: c++ qt qpainter

即。如果我在 Qt5 tutorial中指定的示例中指定了一些立方行:

QPainterPath path;
path.addRect(20, 20, 60, 60);

path.moveTo(0, 0);
path.cubicTo(99, 0,  50, 50,  99, 99);
path.cubicTo(0, 99,  50, 50,  0, 0);

QPainter painter(this);
painter.fillRect(0, 0, 100, 100, Qt::white);
painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,
                    Qt::FlatCap, Qt::MiterJoin));
painter.setBrush(QColor(122, 163, 39));

painter.drawPath(path);

构造了这组曲线enter image description here

现在我想只渲染QImage上某些区域指定的曲线的一部分,其中起点= [20px,50px],宽度= 80px,高度= 50px,因此结果如下所示: enter image description here

或者如果可能的话,使用3倍变焦进行渲染,因此结果QImage看起来相同,但尺寸= [240px,150px]

我是Qt的新手,有人可以向我展示一个有效的代码示例吗?

2 个答案:

答案 0 :(得分:2)

您可以转换画家坐标系:

    QPainter painter(this);
    painter.scale(3, 3); // zoom 3 times
    painter.translate(-20, -50); // offset origin to 20x50
    // ... render stuff

这比其他答案有一个优势,因为它会被渲染为好像你提供了更大的坐标,而不是渲染它,然后放大光栅图像,这会降低图像质量。此外,Qt可能会优化它以便不在图像外部渲染,因此它会渲染得更少,而且您不需要裁剪并抛弃结果。

结果:

enter image description here

将其与放大的栅格进行比较:

enter image description here

答案 1 :(得分:-1)

我为您准备了一个代码示例。但要找出方法并不难。您只需阅读文档,一切都很容易找到。 Qt的文档非常棒。

QApplication a(argc, argv);

QImage img(100, 100, QImage::Format_ARGB32);

QPainterPath path;
path.addRect(20, 20, 60, 60);

path.moveTo(0, 0);
path.cubicTo(99, 0,  50, 50,  99, 99);
path.cubicTo(0, 99,  50, 50,  0, 0);

QPainter painter(&img);
painter.fillRect(0, 0, 100, 100, Qt::white);
painter.setPen(QPen(QColor(79, 106, 25), 1, Qt::SolidLine,
                    Qt::FlatCap, Qt::MiterJoin));
painter.setBrush(QColor(122, 163, 39));

painter.drawPath(path);
painter.end();

QPixmap pixmap( QPixmap::fromImage(img).copy(20, 50, 80, 50).scaled(240,150) );

// option 1, use a QLabel ( only for simple cases )
QLabel label;
label.setPixmap( pixmap );
label.show();

// option 2, use a QGraphicsScene ( far more flexible )
QGraphicsView view;
QGraphicsScene scene;
scene.addPixmap( pixmap );
scene.setSceneRect( img.rect() );
view.setScene(&scene);
view.show();

return a.exec();