平滑圆圈 - 画家绘画

时间:2016-03-11 01:14:49

标签: c++ qt qpainter

我使用以下代码在圆圈中绘制图像。

 QPixmap target(110, 130); // the size may vary
    target.fill(Qt::transparent);

    QPixmap p = QPixmap::fromImage( QImage(":/Images/head").scaled(110,110,Qt::IgnoreAspectRatio,Qt::SmoothTransformation).convertToFormat(QImage::Format_ARGB32));
    QPainter painter(&target);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setRenderHint(QPainter::Antialiasing, true);

    QRegion r(QRect(10,10,100,100), QRegion::Ellipse);
    painter.setClipRegion(r);

    painter.drawPixmap(0, 0,p);

    ui->label->setPixmap(target);

这是我得到的输出

enter image description here

请注意圆圈不平滑。我的问题是如何让这个圆圈顺利进行。

1 个答案:

答案 0 :(得分:3)

使用剪辑路径在绘图时不具备抗锯齿能力。

您可以使用蒙版图像或制作彩色蒙版图像,将图像绘制为特殊形状。

这是一个简单的例子:

        QPainter *painter....
        QPixmap pixmapToDraw....
        ....
        QImage dst(sourceRect.width(), sourceRect.height(), QImage::Format_ARGB32);
        dst.fill(QColor(0, 0, 0, 0));

        QPainter p(&dst);
        QPainterPath path;
        path.addRoundedRect(0, 0, sourceRect.width(), sourceRect.height(), sourceRect.width() / 2, sourceRect.height() / 2);

        p.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform, true);
        p.fillPath(path, QBrush(Qt::white));
        p.setCompositionMode(QPainter::CompositionMode_SourceAtop);
        p.drawPixmap(dst.rect(), pixmapToDraw);
        painter->drawImage(0, 0, dst);

以下是Qt的文档Image Composition ExampleQPainter::CompositionMode