<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # PyCairo 的透明度 > 原文: [https://zetcode.com/gfx/pycairo/transparency/](https://zetcode.com/gfx/pycairo/transparency/) 在 PyCairo 教程的這一部分中,我們將討論透明度。 我們將提供一些基本定義和三個有趣的透明度示例。 透明性是指能夠透視材料的質量。 了解透明度的最簡單方法是想象一塊玻璃或水。 從技術上講,光線可以穿過玻璃,這樣我們就可以看到玻璃后面的物體。 在計算機圖形學中,我們可以使用 alpha 合成實現透明效果。 Alpha 合成是將圖像與背景組合以創建部分透明外觀的過程。 合成過程使用 alpha 通道。 Alpha 通道是圖形文件格式的 8 位層,用于表達半透明性(透明度)。 每個像素的額外八位用作掩碼,表示 256 級半透明。 (answers.com,wikipedia.org) ## 透明矩形 第一個示例將繪制十個透明度不同的矩形。 ```py def on_draw(self, wid, cr): for i in range(1, 11): cr.set_source_rgba(0, 0, 1, i*0.1) cr.rectangle(50*i, 20, 40, 40) cr.fill() ``` `set_source_rgba()`方法具有 alpha 參數以提供透明度。 ```py for i in range(1, 11): cr.set_source_rgba(0, 0, 1, i*0.1) cr.rectangle(50*i, 20, 40, 40) cr.fill() ``` 此代碼創建十個矩形,其 alpha 值從 0.1 到 1。 ![Transparent rectangles](https://img.kancloud.cn/f9/17/f917f298040d0dcec1b34fbac057da9b_592x126.jpg) 圖:透明矩形 ## 泡芙效果 在以下示例中,我們創建一個粉撲效果。 該示例將顯示一個不斷增長的居中文本,該文本將從某個點逐漸淡出。 這是一個非常常見的效果,我們經常可以在 Flash 動畫中看到它。 `paint_with_alpha()`方法對于產生效果至關重要。 ```py #!/usr/bin/python ''' ZetCode PyCairo tutorial This program creates a 'puff' effect. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' from gi.repository import Gtk, GLib import cairo class cv(object): SPEED = 14 TEXT_SIZE_MAX = 20 ALPHA_DECREASE = 0.01 SIZE_INCREASE = 0.8 class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): self.darea = Gtk.DrawingArea() self.darea.connect("draw", self.on_draw) self.add(self.darea) self.timer = True self.alpha = 1.0 self.size = 1.0 GLib.timeout_add(cv.SPEED, self.on_timer) self.set_title("Puff") self.resize(350, 200) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_timer(self): if not self.timer: return False self.darea.queue_draw() return True def on_draw(self, wid, cr): w, h = self.get_size() cr.set_source_rgb(0.5, 0, 0) cr.paint() cr.select_font_face("Courier", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) self.size = self.size + cv.SIZE_INCREASE if self.size > cv.TEXT_SIZE_MAX: self.alpha = self.alpha - cv.ALPHA_DECREASE cr.set_font_size(self.size) cr.set_source_rgb(1, 1, 1) (x, y, width, height, dx, dy) = cr.text_extents("ZetCode") cr.move_to(w/2 - width/2, h/2) cr.text_path("ZetCode") cr.clip() cr.paint_with_alpha(self.alpha) if self.alpha <= 0: self.timer = False def main(): app = Example() Gtk.main() if __name__ == "__main__": main() ``` 該示例在窗口上創建一個逐漸增長和褪色的文本。 ```py class cv(object): SPEED = 14 TEXT_SIZE_MAX = 20 ALPHA_DECREASE = 0.01 SIZE_INCREASE = 0.8 ``` 在這里,我們定義了示例中使用的一些常量。 ```py self.alpha = 1.0 self.size = 1.0 ``` 這兩個變量存儲當前的 alpha 值和文本大小。 ```py GLib.timeout_add(cv.SPEED, self.on_timer) ``` 每 14 毫秒調用一次`on_timer()`方法。 ```py def on_timer(self): if not self.timer: return False self.darea.queue_draw() return True ``` 在`on_timer()`方法中,我們使用`queue_draw()`方法重繪繪圖區域小部件。 ```py def on_draw(self, wid, cr): w, h = self.get_size() cr.set_source_rgb(0.5, 0, 0) cr.paint() cr.select_font_face("Courier", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD) ... ``` 在`on_draw()`方法中,我們獲得窗口工作區的寬度和高度。 這些值用于使文本居中。 我們用一些深紅色填充窗口的背景。 我們為文本選擇一種 Courier 字體。 ```py (x, y, width, height, dx, dy) = cr.text_extents("ZetCode") ``` 我們得到了文本指標。 我們將僅使用文本寬度。 ```py cr.move_to(w/2 - width/2, h/2) ``` 我們移動到文本將在窗口上居中的位置。 ```py cr.text_path("ZetCode") cr.clip() cr.paint_with_alpha(self.alpha) ``` 我們使用`text_path()`方法獲得文本的路徑。 我們使用`clip()`方法將繪畫限制為當前路徑。 `paint_with_alpha()`方法使用 alpha 值的掩碼在當前剪裁區域內的任何地方繪制當前源。 ![Puff effect](https://img.kancloud.cn/a2/36/a236133f790d85b19c3ef540a7d4f74d_352x226.jpg) 圖:粉撲效果 ## 反射圖像 在下一個示例中,我們顯示反射圖像。 這種效果使人產生幻覺,好像圖像在水中被反射一樣。 ```py #!/usr/bin/python ''' ZetCode PyCairo tutorial This program creates an image reflection. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' from gi.repository import Gtk import cairo import sys class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.load_image() self.init_vars() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Reflection") self.resize(300, 350) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def load_image(self): try: self.s = cairo.ImageSurface.create_from_png("slanec.png") except Exception, e: print e.message sys.exit(1) def init_vars(self): self.imageWidth = self.s.get_width() self.imageHeight = self.s.get_height() self.gap = 40 self.border = 20 def on_draw(self, wid, cr): w, h = self.get_size() lg = cairo.LinearGradient(w/2, 0, w/2, h*3) lg.add_color_stop_rgba(0, 0, 0, 0, 1) lg.add_color_stop_rgba(h, 0.2, 0.2, 0.2, 1) cr.set_source(lg) cr.paint() cr.set_source_surface(self.s, self.border, self.border) cr.paint() alpha = 0.7 step = 1.0 / self.imageHeight cr.translate(0, 2 * self.imageHeight + self.gap) cr.scale(1, -1) i = 0 while(i < self.imageHeight): cr.rectangle(self.border, self.imageHeight-i, self.imageWidth, 1) i = i + 1 cr.save() cr.clip() cr.set_source_surface(self.s, self.border, self.border) alpha = alpha - step cr.paint_with_alpha(alpha) cr.restore() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() ``` 窗戶上顯示了一座城堡的倒影。 ```py def load_image(self): try: self.s = cairo.ImageSurface.create_from_png("slanec.png") except Exception, e: print e.message sys.exit(1) ``` 在`load_image()`方法中,從 PNG 圖像創建圖像表面。 ```py def init_vars(self): self.imageWidth = self.s.get_width() self.imageHeight = self.s.get_height() self.gap = 40 self.border = 20 ``` 在`init_vars()`方法內部,我們獲得圖像的寬度和高度。 我們還定義了兩個變量。 ```py lg = cairo.LinearGradient(w/2, 0, w/2, h*3) lg.add_color_stop_rgba(0, 0, 0, 0, 1) lg.add_color_stop_rgba(h, 0.2, 0.2, 0.2, 1) cr.set_source(lg) cr.paint() ``` 窗口的背景填充有漸變顏料。 涂料是從黑色到深灰色的平滑混合。 ```py cr.translate(0, 2 * self.imageHeight + self.gap) cr.scale(1, -1) ``` 此代碼翻轉圖像并將其轉換為原始圖像下方。 平移操作是必需的,因為縮放操作會使圖像上下顛倒并向上平移圖像。 要了解發生了什么,只需拍攝一張照片并將其放在桌子上即可。 并翻轉它。 ```py i = 0 while(i < self.imageHeight): cr.rectangle(self.border, self.imageHeight-i, self.imageWidth, 1) i = i + 1 cr.save() cr.clip() cr.set_source_surface(self.s, self.border, self.border) alpha = alpha - step cr.paint_with_alpha(alpha) cr.restore() ``` 這是最后一部分。 我們使第二個圖像透明。 但是透明度不是恒定的。 圖像逐漸淡出。 反射的圖像逐行繪制。 `clip()`方法將圖形限制為高度為 1 的矩形。`paint_with_alpha()`在繪制圖像表面的當前剪裁時會考慮透明度。 ![Reflected image](https://img.kancloud.cn/22/be/22be2b023ce140d6f1d3c52c7833911a_302x376.jpg) 圖:反射圖像 ## 等待演示 在此示例中,我們使用透明效果創建一個等待演示。 我們將繪制 8 條線,這些線將逐漸消失,從而產生一種錯覺,即一條線在移動。 此類效果通常用于通知用戶幕后正在進行繁重的任務。 一個示例是通過互聯網流式傳輸視頻。 ```py #!/usr/bin/python ''' ZetCode PyCairo tutorial This program creates a 'waiting' effect. author: Jan Bodnar website: zetcode.com last edited: August 2012 ''' from gi.repository import Gtk, GLib import cairo import math class cv(object): trs = ( ( 0.0, 0.15, 0.30, 0.5, 0.65, 0.80, 0.9, 1.0 ), ( 1.0, 0.0, 0.15, 0.30, 0.5, 0.65, 0.8, 0.9 ), ( 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65, 0.8 ), ( 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65 ), ( 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5 ), ( 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3 ), ( 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15 ), ( 0.15, 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, ) ) SPEED = 100 CLIMIT = 1000 NLINES = 8 class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): self.darea = Gtk.DrawingArea() self.darea.connect("draw", self.on_draw) self.add(self.darea) self.count = 0 GLib.timeout_add(cv.SPEED, self.on_timer) self.set_title("Waiting") self.resize(250, 150) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_timer(self): self.count = self.count + 1 if self.count >= cv.CLIMIT: self.count = 0 self.darea.queue_draw() return True def on_draw(self, wid, cr): cr.set_line_width(3) cr.set_line_cap(cairo.LINE_CAP_ROUND) w, h = self.get_size() cr.translate(w/2, h/2) for i in range(cv.NLINES): cr.set_source_rgba(0, 0, 0, cv.trs[self.count%8][i]) cr.move_to(0.0, -10.0) cr.line_to(0.0, -40.0) cr.rotate(math.pi/4) cr.stroke() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() ``` 我們用八個不同的 alpha 值繪制八條線。 ```py class cv(object): trs = ( ( 0.0, 0.15, 0.30, 0.5, 0.65, 0.80, 0.9, 1.0 ), ( 1.0, 0.0, 0.15, 0.30, 0.5, 0.65, 0.8, 0.9 ), ( 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65, 0.8 ), ( 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5, 0.65 ), ( 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3, 0.5 ), ( 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15, 0.3 ), ( 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, 0.15 ), ( 0.15, 0.3, 0.5, 0.65, 0.8, 0.9, 1.0, 0.0, ) ) ... ``` 這是此演示中使用的透明度值的二維元組。 有 8 行,每行一種狀態。 8 行中的每行將連續使用這些值。 ```py SPEED = 100 CLIMIT = 1000 NLINES = 8 ``` `SPEED`常數控制動畫的速度。 `CLIMIT`是`self.count`變量的最大數量。 達到此限制后,變量將重置為 0。`NLINES`是示例中繪制的行數。 ```py GLib.timeout_add(cv.SPEED, self.on_timer) ``` 我們使用計時器函數來創建動畫。 `on_timer()`方法的每個`cv.SPEED` ms 被調用。 ```py def on_timer(self): self.count = self.count + 1 if self.count >= cv.CLIMIT: self.count = 0 self.darea.queue_draw() return True ``` 在`on_timer()`方法中,我們增加`self.count`變量。 如果變量達到`cv.CLIMIT`常量,則將其設置為 0。我們防止溢出,并且不使用大數。 ```py def on_draw(self, wid, cr): cr.set_line_width(3) cr.set_line_cap(cairo.LINE_CAP_ROUND) ... ``` 我們使線條更粗一些,以便更好地顯示它們。 我們用帶帽的線畫線。 ```py w, h = self.get_size() cr.translate(w/2, h/2) ``` 我們將圖形放置在窗口的中央。 ```py for i in range(cv.NLINES): cr.set_source_rgba(0, 0, 0, cv.trs[self.count%8][i]) cr.move_to(0.0, -10.0) cr.line_to(0.0, -40.0) cr.rotate(math.pi/4) cr.stroke() ``` 在`for`循環中,我們繪制了 8 條具有不同透明度值的旋轉線。 線以 45 度角分開。 ![Waiting demo](https://img.kancloud.cn/2e/88/2e8814c133835834de581130da5ee383_252x176.jpg) 圖:等待 demo 在 PyCairo 教程的這一部分中,我們介紹了透明度。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看