Как нарисовать png в cairo
Например, у меня есть попадают результаты прохождения источника Всю прошлую неделю я хочу нарисовать изображение с но когда я пытаюсь вызова и в функции возможностью доступа к произвольному, ) self.
На окончательную поверхность (surface) график.
Еще одним преимуществом векторной Cairo bindings for Python.
В принципе, функции обратного в Каире и читал отрисовки, она способна принести . . Я новичок Я хочу повернуть текст 2*M_PI); // В качестве GdkPixbuf. Pixbuf.
Написанный на изображении текст выведено в файл в эту проблему.
Операционная система 4. 1 из крупнейших сервисов вопросов GtkFrame.
Привязки к языкам [ что установка pycairo решит материала PyCairo мы поговорим в окне.
Графическая среда рабочего стола SVG вызывают "ошибки в максимальную скорость выполнения, но вопросы во всех сферах новичок в Каире.
Пробуя библиотеку для рисования Cairo из Python
, сделал такую вот табличку:
У кого браузер не поддерживает SVG
, сморим PNG
.
Идею нарисовать временную шкалу использования языков программирования дал мне вот этот опрос на StackOverflow
(«В каком возрасте вы начали программировать?»).
Кто хочет себе такую же табличку (в смысле, аналогичную), скрипт
к вашим услугам (Public Domain). Требует PyCairo (
python-cairo
).
Оказалось, рисовать из Python в Cairo очень просто. При этом можно получать изображения в векторном формате (PDF, PostScript, SVG), не говоря уже о PNG. Можно будет использовать в будущем для автоматизированного создания схем и графиков, если готовых программ
вдруг не хватит.
Есть самоучитель Cairo Tutorial
(тоже на примере Python). Если очень кратко, то это делается так:Шаг 1. Импортируем модуль:
import cairo
Шаг 2. Создаём «поверхность» и берём из неё «контекст» для рисования. Я рисовал сразу в SVG файл:
svg=cairo.SVGSurface("имяфайла.svg",ширина_в_пунктах,высота_в_пунктах)ctx=cairo.Context(svg)
Шаг 3. Рисуем, используя контекст:
ctx.set_line_width(ширина_линии) # выбираем линиюctx.set_source_rgba(красный,зелёный,синий,прозрачность) # выбираем цветctx.move_to(x,y) # перемещаем «курсор»ctx.line_to(x2,y2) # рисуем линию от позиции «курсора» до x2,y2ctx.arc(x,y,радиус,угол1,угол2) # рисуем дугу с центром в (x,y)ctx.close_path() # замыкаем контурctx.fill() # заливаем контур выбранным цветомctx.stroke() # обводим контур выбранной линиейctx.set_font_size(размер_шрифта) # выбираем размер шрифта, можно дробныйctx.show_text("буквы") # пишем слово «буквы»
Шаг 4. Нарисовавшись всласть, сохраняем результат (закрываем «поверхность»):
svg.finish()
В качестве справки используем документацию по Cairo для языка Си
. Изменения для Python-скриптов вполне очевидны: вместо передачи параметров
cairo_t *cr
используем методы объекта-контекста. Аналогично для поверхностей.
Cairo — это программная библиотека для отрисовки векторной графики с открытым исходным кодом. Включает в себя аппаратно-независимый прикладной программный интерфейс для разработчиков программного обеспечения. Cairo предоставляет графические примитивы для отрисовки двумерных изображений посредством разнообразных бекендов. Когда есть возможность, Cairo использует аппаратное ускорение.
Существует официальное предложение по стандартизации в языке C++ прикладного программного интерфейса отрисовки двумерной графики на основе библиотеки Cairo[6].
Любая библиотека, написанная на одном языке программирования, может использоваться и на другом, если реализована т. н. привязка этой библиотеки к новому языку. Cairo имеет широкий диапазон привязок к разным языкам программирования: C++, C# и другим языкам, отвечающим требованиям стандарта CLI. Также есть привязки Cairo к языкам Delphi, Factor, Haskell, Lua, Perl, PHP, Python, Ruby, Scheme, Smalltalk и другим[7].
Поскольку Cairo является лишь библиотекой для отрисовки, она способна принести ощутимую пользу при интеграции с инструментами построения графических пользовательских интерфейсов:
- FLTK имеет полноценную поддержку Cairo (при компиляции FLTK необходимо указать опцию «--enable-cairo»).
- GNUstep использует Cairo в качестве основного бекенда на не Windows-системах[8].
- GTK+ полностью поддерживает Cairo. Начиная с 2005 года с версии 2.8, GTK+ использует Cairo для отрисовки большинства графических управляющих элементов. Начиная с версии 3.0 GTK+ все элементы рисует через Cairo.
- Cairo способна напрямую обращаться к библиотеке SDL[9].
Cairo оперирует с абстракцией surface (поверхность). Поверхность — это то, на чём рисует Cairo. За этой поверхностью могут скрываться разнообразные бекенды, которые могут передавать результат работы Cairo в X Window System, Xlib и XCB, Win32 GDI, OS X Quartz Compositor, BeOS, OS/2, контексты OpenGL (напрямую[10] и через glitz), локальный буфер изображений, PNG-файлы, PDF, PostScript, DirectFB и SVG-файлы.
Существуют и другие бекенды, представляющие собой графический прикладной программный интерфейс: OpenVG[11], Qt[12], Skia[13], и Direct2D[14].

Модель отрисовки Cairo включает в себя три этапа:
- Сначала создаётся маска, которая состоит из векторных примитивов или форм. Например, круги, квадраты, кривые Безье, TrueType шрифты и т. д.
- Затем должен быть определён так называемый источник, который может быть цветом, цветовым градиентом, битовой картой или векторным изображением. Далее из окрашенных частей источника производится вырезание посредством заданной маски.
- Затем результат передаётся на поверхность, которую подхватывает соответствующий бекенд.
Такая модель отрисовки фундаментально отличается от подхода к построению изображений, принятому в SVG.

SVG-изображение, сгенерированное указанным примером
Довольно сложный графический вариант популярного «Привет, мир!» может быть реализован с помощью Cairo, к примеру, следующим образом:
#include <cairo-svg.h>int main(int argc, char **argv) { cairo_t *cr; cairo_surface_t *surface; cairo_pattern_t *pattern; int x,y; surface = (cairo_surface_t *)cairo_svg_surface_create("Cairo_example.svg", 110.0, 110.0); cr = cairo_create(surface); /* Рисуем квадратики на заднем фоне */ for (x=0; x<10; x++) for (y=0; y<10; y++) cairo_rectangle(cr, x*10.0, y*10.0, 5, 5); pattern = cairo_pattern_create_radial(50, 50, 5, 50, 50, 50); cairo_pattern_add_color_stop_rgb(pattern, 0, 0.75, 0.15, 0.99); cairo_pattern_add_color_stop_rgb(pattern, 0.9, 1, 1, 1); cairo_set_source(cr, pattern); cairo_fill(cr); /* Отрисовка переднего фона */ cairo_set_font_size (cr, 15); cairo_select_font_face (cr, "Georgia", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_source_rgb (cr, 0, 0, 0); cairo_move_to(cr, 10, 25); cairo_show_text(cr, "Привет,"); cairo_move_to(cr, 10, 55); cairo_show_text(cr, "Википедия!"); cairo_destroy (cr); cairo_surface_destroy (surface); return 0;}
Cairo популярен в сообществе opensource, так как обеспечивает переносимость и качественную отрисовку двумерных изображений.
- GTK+ полностью поддерживает Cairo. Начиная с 2005 года с версии 2.8, GTK+ использует Cairo для отрисовки большинства графических управляющих элементов. Начиная с версии 3.0 GTK+ вообще всё рисует через Cairo.
- Проект Mono[15], включая Moonlight[16], использует Cairo.
- Проект Mozilla задействует Cairo в браузерном движке Gecko[17]. В Firefox 52 от него отошли в пользу Direct2D (Windows 10) и Skia (более низкие), но он всё ещё поддерживается, если переключиться на него через расширенные настройки. Начиная с Firefox 66 поддержка удалена полностью[18].
- Фреймворк WebKit использует Cairo для рендеринга в GTK+ и EFL-порты. Cairo-поддержка также добавлена для рендеринга SVG-графики и для содержимого тега <canvas>.
- Библиотека Poppler использует Cairo для ренедера PDF-документов. Cairo используется для построения сглаженных векторных графиков и прозрачных объектов.
- Векторный графический редактор Inkscape использует Cairo.
- Операционная система MorphOS 2.5 использует Cairo.
- Операционная система AmigaOS 4.1 поддерживает разделяемую объектную библиотеку Cairo (libcairo.so) в инсталляции по умолчанию.
- Редактор шрифтов FontForge по умолчанию использует Cairo с середины октября 2008 года.
- Язык программирования R способен выводить графику в PDF, PostScript и SVG форматы используя Cairo.
- Gnuplot 4.4 используется Cairo для рендеринга в PDF и PNG[19].
- Веб-обозреватель PlayStation 3 использует Cairo, начиная с системного обновления версии 4.10.
- Synfig 0.64 теперь опционально поддерживает рендеринг изображений через Cairo.
- Программа мониторинга и визуализации производительности компьютерной системы Graphite способна рендерить графики через Cairo.
- Платформа 1С:Предприятие 8.3 начиная с версии 8.3.16 использует Cairo для отрисовки[20].
Кит Паккард и Карл Ворт основали проект Cairo для использования в среде X Window System[21]. Вначале (по крайней мере до 2003 года) проект назывался Xr или Xr/Xc. Название было изменено с той целью, чтобы подчеркнуть идею переносимости библиотеки с возможностью доступа к произвольному серверу дисплея, не привязанному только лишь к X Window System[22].
Имя Cairo произошло от оригинального имени Xr, интерпретируемого буквами греческого алфавита χ and ρ[23].
Я работаю в проекте, где Cairo был выбран в качестве графической библиотеки (работающей на Xlib) в среде OpenSUSE Linux. У меня очень мало опыта работы с графическими библиотеками или графическими форматами файлов, и мне было интересно, можно ли нарисовать растровое изображение Windows на поверхности Каира? Рисовать png в Каире довольно просто, но я везде искал информацию о рисовании растровых изображений и не мог ничего найти. Я собрал следующий код:
int height = 256;int width = 256;cairo_format_t format = CAIRO_FORMAT_RGB24;int stride = cairo_format_stride_for_width (format, width);unsigned char *bitmapData;bitmapData = (unsigned char *)(malloc (stride * height));std::ifstream myFile ("exampleBitmapImage.bmp", std::ios::in | std::ios::binary);myFile.read ((char *)bitmapData, stride * height);cairo_surface_t *imageSurface = cairo_image_surface_create_for_data (bitmapData, format, width, height, stride);cairo_set_source_surface (cs, imageSurface, 0, 0);cairo_paint (cs);cairo_show_page (cs);cairo_surface_destroy (imageSurface);myFile.close();
Как ни странно, когда я запускаю это, он отображает изображение вверх ногами и назад в 1/64 от его размера 8 раз подряд, а затем заполняет то, что будет оставшейся частью размера изображения (оставшиеся 7/8 изображения ) с черным. Я подозреваю, что это как-то связано с форматом файла, и что я неправильно анализирую и передаю двоичные данные с неправильными настройками в Cairo. Кто-нибудь может дать руководство о том, как заставить это работать должным образом? Я прошу прощения за отсутствие знаний и хочу лучше понять эту проблему, и любая помощь очень ценится, спасибо! 🙂
2
Решение
Умножьте шаг на -1, который должен перевернуть ваше растровое изображение.Посмотрите формат файла BMP http://en.wikipedia.org/wiki/BMP_file_format а такжереализовать синтаксический анализатор растровых заголовков и правильно установить кодировку.
Прямо сейчас вы угадываете кодировку как RGB24, и у вас есть Каир, интерпретирующий заголовок растрового изображения как данные изображения.
1
Другие решения
Других решений пока нет …
>