程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> Qt學習之路(26):反走樣

Qt學習之路(26):反走樣

編輯:關於C++

今天繼續前面的內容。既然已經進入2D繪圖部分,那麼就先繼續研究一下有關QPainter的東西吧!

反走樣是圖形學中的重要概念,用以防止“鋸齒”現象的出現。很多系統的繪圖API裡面都會內置了反走樣的算法,不過默認一般都是關閉的,Qt也不例外。下面我們來看看代碼。這段代碼僅僅給出了paintEvent函數,相信你可以很輕松地替換掉前面章節中的相關代碼。

void PaintedWidget::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(Qt::yellow);
painter.drawEllipse(50, 150, 200, 150);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
painter.setBrush(Qt::yellow);
painter.drawEllipse(300, 150, 200, 150);
}

看看運行後的效果:

左邊的是沒有使用反走樣技術的,右邊是使用了反走樣技術的。二者的差別可以很容易的看出來。

下面來看看相關的代碼。為了嘗試畫筆的樣式,這裡故意使用了一個新的畫筆:

painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));

我們對照著API去看,第一個參數是畫筆顏色,這裡設置為黑色;第二個參數是畫筆的粗細,這裡是5px;第三個是畫筆樣式,我們使用了 DashDotLine,正如同其名字所示,是一個短線和一個點相間的類型;第四個是RoundCap,也就是圓形筆帽。然後我們使用一個黃色的畫刷填充,畫了一個橢圓。

後面的一個和前面的十分相似,唯一的區別是多了一句

painter.setRenderHint(QPainter::Antialiasing, true);

不過這句也很清楚,就是設置Antialiasing屬性為true。如果你學過圖形學就會知道,這個長長的單詞就是“反走樣”。經過這句設置,我們就打開了QPainter的反走樣功能。還記得我們曾經說過,QPainter是一個狀態機,因此,只要這裡我們打開了它,之後所有的代碼都會是反走樣繪制的了。

看到這裡你會發現,反走樣的效果其實比不走樣要好得多,那麼,為什麼不默認打開反走樣呢?這是因為,反走樣是一種比較復雜的算法,在一些對圖像質量要求不高的應用中,是不需要進行反走樣的。為了提高效率,一般的圖形繪制系統,如Java2D、OpenGL之類都是默認不進行反走樣的。

還有一個疑問,既然反走樣比不反走樣的圖像質量高很多,不進行反走樣的繪制還有什麼作用呢?前面說的是一個方面,也就是,在一些對圖像質量要求不高的環境下,或者說性能受限的環境下,比如嵌入式和手機環境,是不必須要進行反走樣的。另外還有一點,在一些必須精確操作像素的應用中,也是不能進行反走樣的。請看下面的圖片:

上圖是使用Photoshop的鉛筆和畫筆工具畫的1像素的點在放大到3200%視圖下截下來的。Photoshop裡面的鉛筆工具是不進行反走樣,而畫筆是要進行反走樣的。在放大的情況下就會知道,有反走樣的情況下是不能進行精確到1像素的操作的。因為反走樣很難讓你控制到1個像素。這不是 Photoshop畫筆工具的缺陷,而是反走樣算法的問題。如果你想了解為什麼這樣,請查閱計算機圖形學裡面關於反走樣的原理部分。

出處:http://devbean.blog.51cto.com/448512/237447

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved