quickest way to get started with cairo

前端 未结 2 1841
隐瞒了意图╮
隐瞒了意图╮ 2021-01-02 22:32

I have taken passing shots at learning Cairo in the past, but always moved on in favor of some other graphics library. My problem is that I can\'t find a good tutorial that

2条回答
  •  梦谈多话
    2021-01-02 22:55

    I have used cairo for virtually anything involving drawing. I work at a medical software company, so I prototype scientific data visualization and other things.

    I have usually three ways to display my drawings:

    1. A GTK drawing area created with a Python script and GTK;
    2. A PNG image displayed directly on screen using Python Image Library show() method;
    3. A PNG image saved to disk, also via Python Image Library.

    A simple script derived from cairographics examples, which actually I use as a template for any new project, is:

    import gtk
    
    class Canvas(gtk.DrawingArea):
        def __init__(self):
            super(Canvas, self).__init__()
            self.connect("expose_event", self.expose)
            self.set_size_request(800,500)
    
        def expose(self, widget, event):
            cr = widget.window.cairo_create()
            rect = self.get_allocation()
    
            # you can use w and h to calculate relative positions which
            # also change dynamically if window gets resized
            w = rect.width
            h = rect.height
    
            # here is the part where you actually draw
            cr.move_to(0,0)
            cr.line_to(w/2, h/2)
            cr.stroke()
    
    window = gtk.Window()
    canvas = Canvas()
    window.add(canvas)
    window.set_position(gtk.WIN_POS_CENTER)
    window.show_all()
    gtk.main()
    

    Or if you prefer not to deal with GUI toolkits, you can create and display an image on screen, and optionally save it to file:

    import cairo, Image
    
    width = 800
    height = 600
    
    surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
    cr = cairo.Context(surface)
    
    # optional conversion from screen to cartesian coordinates:
    cr.translate(0, height)
    cr.scale(1, -1)
    
    # something very similar to Japanese flag:
    cr.set_source_rgb(1,1,1)
    cr.rectangle(0, 0, width, height)
    cr.fill()
    cr.arc(width/2, height/2, 150, 0, 6.28)
    cr.set_source_rgb(1,0,0)
    cr.fill()
    
    im = Image.frombuffer("RGBA",
                           (width, height),
                           surface.get_data(),
                           "raw",
                           "BGRA",
                           0,1) # don't ask me what these are!
    im.show()
    # im.save('filename', 'png')
    

提交回复
热议问题