How do you draw transparent polygons with Python?

后端 未结 7 1277
独厮守ぢ
独厮守ぢ 2020-12-05 10:28

I\'m using PIL (Python Imaging Library). I\'d like to draw transparent polygons. It seems that specifying a fill color that includes alpha level does not work. Are their

相关标签:
7条回答
  • 2020-12-05 11:12

    From what I have found it can't be done directly with PIL. Here is a solution with PyCairo. Cairo is also used by Mozilla, GTX+, Mono, Inkscape, and WebKit so I think it is a safe to use in terms of future support. It can also be done with aggdraw, an optional add-on for PIL. See my listed source for more details. Python version 2.7.3 is used.

    Source: http://livingcode.org/2008/12/14/drawing-with-opacity.1.html

    Helper file: random_polys_util.py

        MIN_ALPHA = 50
        MAX_ALPHA = 100
    
        WIDTH = 500
        HEIGHT = 250
    
        #
        #   Utilities
        #
        def hex2tuple(hex_color):
            return tuple([int(hex_color[i:i+2], 16) for i in range(1,9,2)])
    
        def tuple2hex(tuple_color):
            return "#%0.2X%0.2X%0.2X%0.2X" % tuple_color
    
        def ints2floats(tuple_color):
            return tuple([c / 255.0 for c in tuple_color])
    
        def inc_point(p, dp):
            return (p[0] + dp[0]) % WIDTH, (p[1] + dp[1]) % HEIGHT
    
        def inc_triangle(t, dt):
            return tuple([inc_point(t[i], dt[i]) for i in range(3)])
    
        def inc_color(c, dc):
            new_c = [(c[i] + dc[i]) % 256 for i in range(3)]
            new_a = (c[3] + dc[3]) % MAX_ALPHA
            if new_a < MIN_ALPHA: new_a += MIN_ALPHA
            new_c.append(new_a)
            return tuple(new_c)
    
        def draw_all(draw_fn):
            triangle = start_t
            color = start_c
            for i in range(50):
                triangle = inc_triangle(triangle, dt)
                color = inc_color(color, dc)
                draw_fn(triangle, color)
    
        #
        #   Starting and incrementing values
        #
        start_c = hex2tuple('E6A20644')
        start_t = (127, 132), (341, 171), (434, 125)
        dt = (107, 23), (47, 73), (13, 97)
        dc = 61, 113, 109, 41
    

    Main file: random_polys.py

    from random_polys_util import *
    
    def cairo_poly(pts, clr):
        ctx.set_source_rgba(*ints2floats(clr))
        ctx.move_to(*pts[-1])
        for pt in pts:
            ctx.line_to(*pt)
        ctx.close_path()
        ctx.fill()
    
    def cairo_main():
        # Setup Cairo
        import cairo
        global ctx
        surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
        ctx = cairo.Context(surface)
        # fill background white
        cairo_poly(((0,0),(WIDTH,0),(WIDTH,HEIGHT),(0,HEIGHT)),(255,255,255,255))
        draw_all(cairo_poly)
        surface.write_to_png('cairo_example.png')
    
    def main():
        cairo_main()
    
    if __name__ == "__main__":
        main()
    
    0 讨论(0)
提交回复
热议问题