В этой части учебного материала PyCairo мы поговорим об изображениях. Мы покажем, как отображать изображения в форматах PNG и JPEG в окне GTK. Также мы напишем текст на выбранном изображении. Изображения, используемые в данном учебном материале можно скачать здесь.
PNG изображение
В первом примере мы покажем PNG изображение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/python from gi.repository import Gtk import cairo class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.load_image() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Image") self.resize(300, 170) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def load_image(self): self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png") def on_draw(self, wid, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
Данный пример демонстрирует изображение.
1 |
self.ims = cairo.ImageSurface.create_from_png("stmichaelschurch.png") |
Мы создаем поверхность изображения из PNG рисунка.
1 |
cr.set_source_surface(self.ims, 10, 10) |
Указываем в качестве исходника для рисования ранее созданную поверхность изображения.
1 |
cr.paint() |
Рисуем в окне исходником.
JPEG изображения
Встроенная поддержка PyCairo работает только с PNG изображениями. Другие изображения могут быть отображены при помощи объекта GdkPixbuf.Pixbuf. Это объект окна GTK для работы над изображениями.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/usr/bin/python from gi.repository import Gtk, Gdk, GdkPixbuf import cairo class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.load_image() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Image") self.resize(300, 170) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def load_image(self): self.pb = GdkPixbuf.Pixbuf.new_from_file("stmichaelschurch.jpg") def on_draw(self, wid, cr): Gdk.cairo_set_source_pixbuf(cr, self.pb, 5, 5) cr.paint() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
В данном примере мы отображаем JPEG изображение в окне.
1 |
from gi.repository import Gtk, Gdk, GdkPixbuf |
В дополнение к методу GTK нам также понадобятся GDK и GdkPixbuf .
1 |
self.pb = GdkPixbuf.Pixbuf.new_from_file("stmichaelschurch.jpg") |
GdkPixbuf.Pixbuf был создан из файла JPEG.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
1 2 |
Gdk.cairo_set_source_pixbuf(cr, self.pb, 5, 5) cr.paint() |
Метод Gdk.cairo_set_source_pixbuf() указывает pixbuf в качестве исходника для рисования.
Водяной знак
Рисовать информацию на изображениях достаточно просто. Написанный на изображении текст называется водяной знак и используется для идентификации изображения. Его можно использовать в качестве обозначения авторского права или для обозначения даты создания.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
#!/usr/bin/python from gi.repository import Gtk import cairo class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.load_image() self.draw_mark() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Watermark") self.resize(350, 250) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def load_image(self): self.ims = cairo.ImageSurface.create_from_png("beckov.png") def draw_mark(self): cr = cairo.Context(self.ims) cr.set_font_size(11) cr.set_source_rgb(0.9 , 0.9 , 0.9) cr.move_to(20 , 30) cr.show_text(" Beckov 2012 , (c) Jan Bodnar ") cr.stroke() def on_draw(self, wid, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
Мы написали информацию об авторских правах на изображении.
1 2 3 |
def load_image(self): self.ims = cairo.ImageSurface.create_from_png("beckov.png") |
В методе load_image() мы создали поверхность изображения из PNG файла.
1 2 3 4 |
def draw_mark(self): cr = cairo.Context(self.ims) ... |
В методе draw_mark() мы пишем сообщение об авторских правах на изображении. Для начала мы создаем контекст рисования из поверхности изображения.
1 2 3 4 5 |
cr.set_font_size(11) cr.set_source_rgb(0.9 , 0.9 , 0.9) cr.move_to(20 , 30) cr.show_text(" Beckov 2012 , (c) Jan Bodnar ") cr.stroke() |
Теперь мы пишем короткий текст белым цветом.
1 2 3 4 |
def on_draw(self, wid, cr): cr.set_source_surface(self.ims, 10, 10) cr.paint() |
Наконец, поверхность изображения нарисована в окне.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»