He utilizado el Cairo para prácticamente cualquier cosa relacionada con el dibujo. Trabajo en una empresa de software médico, por lo que prototipo de visualización de datos científicos y otras cosas.
que tienen por lo general tres formas de mostrar mis dibujos:
- un área de dibujo GTK creado con un script en Python y GTK;
- Una imagen PNG mostrada directamente en la pantalla usando la biblioteca de imágenes de Python
show()
método;
- Imagen PNG guardada en el disco, también a través de la Biblioteca de imágenes de Python.
un simple script derivado de ejemplos cairographics, lo que en realidad yo uso como un modelo para cualquier nuevo proyecto, es:
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()
O, si lo prefiere no tratar con herramientas GUI, puede crear y mostrar una imagen en la pantalla, y opcionalmente guardarlo en el archivo:
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')
Gracias por esto. Acabo de pasar por una tonelada de aros para que esto funcione (incluido el proceso de instalación completamente roto para PIL en OS X). Me temo que esto es completamente inadecuado para usuarios principiantes. (Tampoco debería ser: de PIL import Image?) – Alper
Ese tipo de cosas me hicieron cambiar a soluciones basadas en navegador (HTML Canvas o SVG basado en Javascript), y también Processing para dibujos rápidos y sucios. Pero el hecho es que El Cairo todavía es mucho más poderoso que cualquier otra solución hasta ahora: D. – heltonbiker
También: python es una forma mucho más decente de hacer esto que sangriento javascript. – Alper