Я использовал Каир практически для всего, что связано с рисованием. Я работаю в медицинской компании по разработке программного обеспечения, поэтому я создаю прототип для визуализации научных данных и других вещей.
Обычно у меня есть три способа отображения моих рисунков:
- Область рисования GTK, созданная с помощью скрипта Python и GTK;
- Изображение PNG, отображаемое непосредственно на экране с использованием библиотеки изображений Python
show()
метод;
- Изображение PNG, сохраненное на диск, также через библиотеку изображений Python.
Простой скрипт, полученный из примеров каирографии, который я на самом деле использую в качестве шаблона для любого нового проекта:
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()
Или, если вы предпочитаете не работать с инструментами GUI, вы можете создать и отобразить изображение на экране, а также сохранить его в файл:
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')