【问题标题】:Smoothing a circle - painter drawing平滑圆-画家绘图
【发布时间】:2016-03-11 01:14:49
【问题描述】:

我正在使用下面的代码来画一个圆圈。

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

这是我得到的输出

请注意圆圈不平滑。我的问题是我怎样才能使这个圈子变得平滑。

【问题讨论】:

  • 仅供参考,painter.setRenderHint(QPainter::Antialiasing);painter.setRenderHint(QPainter::Antialiasing, true); 之间没有区别。
  • 感谢您解决这个问题
  • 您可以使用 QPainterPath 代替 QRegion。 QPainterPath p; p.addEllipse(QRect(10,10,100,100));画家.setClipPath(p);

标签: c++ qt qpainter


【解决方案1】:

使用剪辑路径在绘图中不会有抗锯齿能力。

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

这是一个简单的例子:

        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 Example,QPainter::CompositionMode

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2014-01-12
    相关资源
    最近更新 更多