самый быстрый способ начать работу с Каиром - PullRequest
6 голосов
/ 07 апреля 2011

В прошлом я делал мимолетные снимки, изучая Каир, но всегда двигался в пользу какой-то другой графической библиотеки. Моя проблема в том, что я не могу найти хороший учебник, который дает мне простой дисплей для моей поверхности. Я всегда заканчивал тем, что копался в документации GTK или QT о вещах, которые не имеют ничего общего с тем, что я хочу сделать. Я хочу изучать Каир, а не массивную ОО-архитектуру.

Что такое обертка с открытыми костями, чтобы дать мне кроссплатформенное окно с каирским холстом для рисования?

Ответы [ 2 ]

10 голосов
/ 15 июля 2011

Я использовал Каир практически для всего, что связано с рисованием. Я работаю в медицинской компании по разработке программного обеспечения, поэтому я создаю прототип для визуализации научных данных и других вещей.

Обычно у меня есть три способа отображения моих рисунков:

  1. Область рисования GTK, созданная с помощью скрипта Python и GTK;
  2. Изображение PNG, отображаемое непосредственно на экране с использованием библиотеки изображений Python show() метод;
  3. Изображение 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')
1 голос
/ 08 апреля 2011

Ответ на связанный с вопрос демонстрирует очень простую настройку в Gtk2HS для рисования на рисованной области с помощью Cairo.

import Graphics.UI.Gtk
import Graphics.Rendering.Cairo

main :: IO ()
main = do
    initGUI
    window      <- windowNew
    drawingArea <- drawingAreaNew
    containerAdd window drawingArea

    drawingArea `onExpose` (\_ -> renderScene drawingArea)
    window `onDestroy` mainQuit

    windowSetDefaultSize window 640 480
    widgetShowAll window
    mainGUI

renderScene :: DrawingArea -> IO Bool
renderScene da = do
    dw <- widgetGetDrawWindow da
    renderWithDrawable dw $ do setSourceRGBA 0.5 0.5 0.5 1.0
                               moveTo 100.0 100.0
                               showText "HelloWorld"

    return True

Просто передайте свою анимационную процедуру в Каире на renderWithDrawable dw в renderScene.

...