日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyCairo 中的形状和填充

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyCairo 中的形状和填充 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

PyCairo 教程的這個部分,我們創建一些基本的和更高級的形狀。我們使用純色,模式和漸變填充這些形狀。漸變將在另一章中討論。

基本形狀

PyCairo 有一些基本的方法可以用來繪制簡單的形狀。

def on_draw(self, wid, cr):cr.set_source_rgb(0.6, 0.6, 0.6)cr.rectangle(20, 20, 120, 80)cr.rectangle(180, 20, 80, 80)cr.fill()cr.arc(330, 60, 40, 0, 2 * math.pi)cr.fill()cr.arc(90, 160, 40, math.pi / 4, math.pi)cr.fill()cr.translate(220, 180)cr.scale(1, 0.7)cr.arc(0, 0, 50, 0, 2 * math.pi)cr.fill()

在這個例子中,我們創建一個矩形,一個方形,一個圓形,一個弧形,和一個橢圓形。

cr.rectangle(20, 20, 120, 80)cr.rectangle(180, 20, 80, 80)

rectangle() 方法用于創建方形和矩形。方形僅是特殊類型的矩形。參數是左上角在窗口中的 x 和 y 坐標及矩形的寬度和高度。

cr.arc(330, 60, 40, 0, 2 * math.pi)

arc() 方法創建一個圓形。參數是弧心的 x 和 y 坐標,半徑,起始和結束角度,以弧度數表示。

cr.arc(90, 160, 40, math.pi / 4, math.pi)

這里我們創建一個弧形,圓形的一部分。

cr.scale(1, 0.7)cr.arc(0, 0, 50, 0, 2 * math.pi)

我們使用 scale() 和 arc() 方法創建橢圓形。


圖:基本形狀

其它形狀可以通過組合基本元素創建。

#!/usr/bin/python''' ZetCode PyCairo tutorialThis code example draws another three shapes in PyCairo.Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 '''import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import cairoclass cv(object):points = ((0, 85),(75, 75),(100, 10),(125, 75),(200, 85),(150, 125),(160, 190),(100, 150),(40, 190),(50, 125),(0, 85))class 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("Complex shapes")self.resize(460, 240)self.set_position(Gtk.WindowPosition.CENTER)self.connect("delete-event", Gtk.main_quit)self.show_all()def on_draw(self, wid, cr):cr.set_source_rgb(0.6, 0.6, 0.6)cr.set_line_width(1)for i in range(10):cr.line_to(cv.points[i][0], cv.points[i][1])cr.fill()cr.move_to(240, 40)cr.line_to(240, 160)cr.line_to(350, 160)cr.fill()cr.move_to(380, 40)cr.line_to(380, 160)cr.line_to(450, 160)cr.curve_to(440, 155, 380, 145, 380, 40)cr.fill()def main():app = Example()Gtk.main()if __name__ == "__main__":main()

在這個例子中,我們創建了一個星星對象,一個三角形和一個變形的三角形。這些對象使用一些直線和一條曲線創建。

for i in range(10):cr.line_to(cv.points[i][0], cv.points[i][1])cr.fill()

星星通過連接點元組中的所有的點來繪制。fill() 方法使用當前顏色填充星星對象。

cr.move_to(240, 40)cr.line_to(240, 160)cr.line_to(350, 160)cr.fill()

這些直線創建一個三角形。最后兩個點自動連接。

cr.move_to(380, 40)cr.line_to(380, 160)cr.line_to(450, 160)cr.curve_to(440, 155, 380, 145, 380, 40)cr.fill()

變形的三角形是兩條直線和一條曲線的簡單組合。


圖:復雜形狀

填充

填充填充形狀的內部。填充可以是純色,模式或漸變。

純色

顏色是表示紅,綠和藍 (RGB) 亮度值的組合的對象。PyCairo 有效的 RGB 值在 0 到 1 范圍內。

def on_draw(self, wid, cr):cr.set_source_rgb(0.2, 0.23, 0.9)cr.rectangle(10, 15, 90, 60)cr.fill()cr.set_source_rgb(0.9, 0.1, 0.1)cr.rectangle(130, 15, 90, 60)cr.fill()cr.set_source_rgb(0.4, 0.9, 0.4)cr.rectangle(250, 15, 90, 60)cr.fill()

在這個例子中,我們畫了三個彩色矩形。

cr.set_source_rgb(0.2, 0.23, 0.9)cr.rectangle(10, 15, 90, 60)cr.fill()

set_source_rgb() 方法設置 source 為一個不透明的顏色。參數為紅,綠,藍亮度值。通過調用 fill() 方法,source 被用于填充矩形內部。


圖:純色

模式

模式是可用于填充形狀的復雜圖形對象。

#!/usr/bin/python''' ZetCode PyCairo tutorialThis program shows how to work with patterns in PyCairo.Author: Jan Bodnar Website: zetcode.com Last edited: April 2016 '''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()self.create_surpat()def init_ui(self):darea = Gtk.DrawingArea()darea.connect("draw", self.on_draw)self.add(darea)self.set_title("Patterns")self.resize(300, 290)self.set_position(Gtk.WindowPosition.CENTER)self.connect("delete-event", Gtk.main_quit)self.show_all()def create_surpat(self):sr1 = cairo.ImageSurface.create_from_png("blueweb.png")sr2 = cairo.ImageSurface.create_from_png("maple.png")sr3 = cairo.ImageSurface.create_from_png("crack.png")sr4 = cairo.ImageSurface.create_from_png("chocolate.png")self.pt1 = cairo.SurfacePattern(sr1)self.pt1.set_extend(cairo.EXTEND_REPEAT)self.pt2 = cairo.SurfacePattern(sr2)self.pt2.set_extend(cairo.EXTEND_REPEAT)self.pt3 = cairo.SurfacePattern(sr3)self.pt3.set_extend(cairo.EXTEND_REPEAT)self.pt4 = cairo.SurfacePattern(sr4)self.pt4.set_extend(cairo.EXTEND_REPEAT)def on_draw(self, wid, cr):cr.set_source(self.pt1)cr.rectangle(20, 20, 100, 100)cr.fill()cr.set_source(self.pt2)cr.rectangle(150, 20, 100, 100)cr.fill()cr.set_source(self.pt3)cr.rectangle(20, 140, 100, 100)cr.fill()cr.set_source(self.pt4)cr.rectangle(150, 140, 100, 100)cr.fill()def main():app = Example()Gtk.main()if __name__ == "__main__":main()

在這個例子中,我們繪制了四個矩形。這次我們用一些模式填充它們。我們使用了來自 Gimp 圖像管理程序的四個模式圖像。我們必須保持那些模式的原始大小,因為我們將展開他們。

我們在 draw() 方法外面創建圖像 surface。每次窗口需要重繪時,都從硬盤讀取不是很高效。

sr1 = cairo.ImageSurface.create_from_png("blueweb.png")

圖像 surface 用一幅 PNG 圖像創建。

self.pt1 = cairo.SurfacePattern(sr1)self.pt1.set_extend(cairo.EXTEND_REPEAT)

模式由 surface 創建。我們把模式設置為 cairo.EXTEND_REPEAT,這將使得模式以重復的方式展開。

cr.set_source(self.pt1)cr.rectangle(20, 20, 100, 100)cr.fill()

此處我們繪制我們的第一個矩形。set_source() 方法告訴Cairo 上下文,在繪制的時候使用模式作為 source。圖像模式可能不完全適合形狀。rectangle() 創建一個矩形 path。最后,fill() 方法用 source 填充 path。

上面那段代碼中所用到的四幅圖片。

代碼的執行效果如下:

本章討論了 PyCairo 的形狀和填充。

原文

Done.

總結

以上是生活随笔為你收集整理的PyCairo 中的形状和填充的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。