反鋸齒(Antialiasing)

  • 在顯示器上繪製非水平、非垂直的直線或多邊形邊界時,因為直線和多邊形的邊界是連續的,而像素則是由離散的點組成,所以或多或少會造成鋸齒狀外觀,用於減少這種效果的技術,稱為反鋸齒。
  • 包括Qt在內,很多系統的繪圖API裡面都內置了有關反鋸齒的設定,不過由於性能考量,一般預設是關閉的。
  • 這邊分別示範有無開啟反鋸齒的圖形,左側為預設樣式的橢圓,可看出邊緣的鋸齒外觀,右側開啟了反鋸齒設定。雖然反鋸齒的圖像品質較好,但是在對圖像品質要求不高,或在性能受限的環境下,比如嵌入式和手機環境,一般是不進行反鋸齒的。

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPainter>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
protected:
    void paintEvent(QPaintEvent *);
};

#endif 

widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent)
{
    setWindowTitle(tr("繪圖"));
}

void Widget::paintEvent(QPaintEvent *){
    QPainter painter(this);
    painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine));
    painter.setBrush(Qt::green);
    painter.drawEllipse(20, 50, 200, 150);

    painter.setRenderHint(QPainter::Antialiasing, true);   //開啟反鋸齒
    painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine));
    painter.setBrush(Qt::green);
    painter.drawEllipse(240, 50, 200, 150);
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.resize(460,250);
    w.show();

    return a.exec();
}

Antialiasing