PyCairo渐变
PyCairo 教程的這個部分,我們將討論漸變。我們將提到線性的和徑向的漸變。
在計算機圖形學中,漸變是從淺色到深色或從一種顏色到另一種顏色的平滑混合。在 2D 繪圖程序和繪畫程序中,漸變被用于創建五彩繽紛的背景和特殊的效果,也用于模擬燈光和陰影。(answers.com)
線性漸變
線性漸變是顏色或色調沿著線的混合。在 PyCairo 中,它們由一個 cairo.LinearGradient 類表示。
#!/usr/bin/python''' ZetCode PyCairo tutorial This program works with linear gradients in PyCairo.author: Jan Bodnar website: zetcode.com last edited: August 2018 '''import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import cairoclass Example(Gtk.Window):def __init__(self):super(Example, self).__init__()self.init_ui()def init_ui(self): darea = Gtk.DrawingArea()darea.connect("draw", self.on_draw)self.add(darea)self.set_title("Linear gradients")self.resize(340, 390)self.set_position(Gtk.WindowPosition.CENTER)self.connect("delete-event", Gtk.main_quit)self.show_all()def on_draw(self, wid, cr):self.draw_gradient1(cr)self.draw_gradient2(cr)self.draw_gradient3(cr)def draw_gradient1(self, cr):lg1 = cairo.LinearGradient(0.0, 0.0, 350.0, 350.0)count = 1i = 0.1 while i < 1.0: if count % 2:lg1.add_color_stop_rgba(i, 0, 0, 0, 1)else:lg1.add_color_stop_rgba(i, 1, 0, 0, 1)i = i + 0.1count = count + 1 cr.rectangle(20, 20, 300, 100)cr.set_source(lg1)cr.fill()def draw_gradient2(self, cr): lg2 = cairo.LinearGradient(0.0, 0.0, 350.0, 0)count = 1i = 0.05 while i < 0.95: if count % 2:lg2.add_color_stop_rgba(i, 0, 0, 0, 1)else:lg2.add_color_stop_rgba(i, 0, 0, 1, 1)i = i + 0.025count = count + 1 cr.rectangle(20, 140, 300, 100)cr.set_source(lg2)cr.fill()def draw_gradient3(self, cr): lg3 = cairo.LinearGradient(20.0, 260.0, 20.0, 360.0)lg3.add_color_stop_rgba(0.1, 0, 0, 0, 1) lg3.add_color_stop_rgba(0.5, 1, 1, 0, 1) lg3.add_color_stop_rgba(0.9, 0, 0, 0, 1) cr.rectangle(20, 260, 300, 100)cr.set_source(lg3)cr.fill()def main():app = Example()Gtk.main()if __name__ == "__main__": main()這個例子繪制了由線性漸變填充的三個矩形。
lg3 = cairo.LinearGradient(20.0, 260.0, 20.0, 360.0)此處我們創建了一個線性漸變。參數指定了一條直線,我們沿著這條直線繪制。這是一條豎直直線。
lg3.add_color_stop_rgba(0.1, 0, 0, 0, 1) lg3.add_color_stop_rgba(0.5, 1, 1, 0, 1) lg3.add_color_stop_rgba(0.9, 0, 0, 0, 1)我們定義顏色終止點來產生我們的漸變模式。在這個例子中,漸變是黑色和黃色的混合。通過添加兩個黑色和一個黃色終止點,我們創建了一個橫向的漸變模式。這些終止點實際意味著什么呢?在我們的例子中,我們以黑色開始,它會終止于 1/10 大小處。然后我們逐漸地用黃色來繪制,這將在形狀的中心達到高潮。黃色終止于 9/10 大小處,我們在此處再次開始用黑色繪制,直到終點。
徑向漸變
徑向漸變是兩個圓之間的顏色或色調的混合。在PyCairo中,用 cairo.RadialGradient 類創建徑向漸變。
#!/usr/bin/python''' ZetCode PyCairo tutorialThis program works with radial gradients in PyCairo.author: Jan Bodnar website: zetcode.com last edited: August 2012 '''import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import cairo import mathclass Example(Gtk.Window):def __init__(self):super(Example, self).__init__()self.init_ui()def init_ui(self): darea = Gtk.DrawingArea()darea.connect("draw", self.on_draw)self.add(darea)self.set_title("Radial gradients")self.resize(300, 200)self.set_position(Gtk.WindowPosition.CENTER)self.connect("delete-event", Gtk.main_quit)self.show_all()def on_draw(self, wid, cr):self.draw_gradient1(cr)self.draw_gradient2(cr)def draw_gradient1(self, cr):cr.set_source_rgba(0, 0, 0, 1)cr.set_line_width(12)cr.translate(60, 60)r1 = cairo.RadialGradient(30, 30, 10, 30, 30, 90)r1.add_color_stop_rgba(0, 1, 1, 1, 1)r1.add_color_stop_rgba(1, 0.6, 0.6, 0.6, 1)cr.set_source(r1)cr.arc(0, 0, 40, 0, math.pi * 2)cr.fill()cr.translate(120, 0)def draw_gradient2(self, cr): r2 = cairo.RadialGradient(0, 0, 10, 0, 0, 40)r2.add_color_stop_rgb(0, 1, 1, 0)r2.add_color_stop_rgb(0.8, 0, 0, 0)cr.set_source(r2)cr.arc(0, 0, 40, 0, math.pi * 2)cr.fill() def main():app = Example()Gtk.main()if __name__ == "__main__": main()在這個例子中,我們繪制了兩個徑向漸變。
r1 = cairo.RadialGradient(30, 30, 10, 30, 30, 90)r1.add_color_stop_rgba(0, 1, 1, 1, 1)r1.add_color_stop_rgba(1, 0.6, 0.6, 0.6, 1)cr.set_source(r1)cr.arc(0, 0, 40, 0, math.pi * 2)cr.fill()我們繪制了一個圓圈,并用徑向漸變填充它的內部。徑向漸變由兩個圓定義。add_color_stop_rgba() 方法定義顏色。我們可以試驗圓的位置或半徑的長度。在第一個漸變的例子中,我們創建一個對象,它類似于一個 3D 形狀。
r2 = cairo.RadialGradient(0, 0, 10, 0, 0, 40)r2.add_color_stop_rgb(0, 1, 1, 0)r2.add_color_stop_rgb(0.8, 0, 0, 0)cr.set_source(r2)cr.arc(0, 0, 40, 0, math.pi * 2)cr.fill()在這個例子中,定義徑向漸變的圓和將要繪制的圓,具有相同的中心位置。
在這一章中,我們討論了 PyCairo 的漸變。
原文
Done.
總結
- 上一篇: PyCairo 中的形状和填充
- 下一篇: Brotli压缩算法的Android封装