В мире свободного ПО идёт гигантская работа над созданием отличных приложений для работы с растровой графикой. И это значит, что существует немало бесплатных или открытых библиотек, на основе которых можно создать редактор графики.
Тем не менее, большинство приложений используют собственное ядро. Krita использует pigment для управления цветом и kritaimage для работы с растром. Точно так же, в digiKam свой класс для работы с графикой, а у GIMP своё ядро, хотя его давно собираются заменить на GEGL, ну и так далее.
Существует три общепринятых способа хранения данных изображений: мозаика (tiles), растровые строки и блобы. Мозаика используется в Krita, GIMP, библиотека JAI из Java и Photoshop, не говоря о многих других. Размер элементов мозаики в Krita — 64×64 пиксела. Растровые строки используются в новой версии Cinepaint (Glasgow) и MosfetPaint Мосфета. Блобы, насколько мне известно, используются в digiKam и, разумеется, в самом Qt: QImage сама по себе маленькая библиотека, равно как и QPainter.
Соответственно, есть три способа получить растровые данные: указатель на массивы мозаики, линии растровой развертки или блобы, указатель на копию изображения, или, если используются современные языки программирования, итераторы.
Время от времени появляются люди, которые предлагают использовать в Krita ту или иную библиотеку работы с изображениями. Раньше это было болезненным вопросом, но сейчас Krita дорос до 100.000 строк кода и собственного ядра работы с изображениями, которое может быть и не самое оптимизированное, зато очень удобное и простое.
Наиболее близкой к ядру Krita библиотекой является, пожалуй, Vigra, поскольку и Krita, и Vigra используют не мозаику с растровыми строками, а итераторы. В части использования темплейтов к нему близка Generic Image Libary компании Adobe.
Далее следует вовсе не исчерпывающий список библиотек (или приложений, если у них свои библиотеки) для обработки изображений с моей оценкой каждой из них. Этот список был подготовлен ещё в 2003 году, но сейчас ради такого случая я его обновил.
В Krita своя библиотека обработки двухмерных изображений, состоящая из менеджера мозаики, классов слоёв и KisPainter. Начиная с KOffice 2.0 библиотека цветовых пространств выделена в pigment, а библиотека обработки изображений полностью отделена от GUI. Было бы неплохо полностью отделить их от KOffice, но это не приоритетная задача.
Преимущества:
Недостатки:
В GIMP сложное ядро, позволяющее осуществлять интерактивную манипуляцию изображениями в режиме 8бит/канал.
Преимущества:
Недостатки:
Vigra — библиотека на C++, написанная Ульрихом Кётте (Ullrich Koetthe) в качестве демонстрации к его докторской диссертации по гибким алгоритмам обработки изображений. Читать эту диссертацию — сплошное удовольствие. Она заметно повлияла на разработку Krita, хотя мы тут скорее машем собакой, чем хвостом, в плане использования шаблонов (Боудевийн ссылается на известную поговорку «Почему собака виляет хвостом? Потому что она умнее хвоста. Если бы хвост был умнее, он сам вилял бы собакой.» — прим.пер.).
Преимущества:
Недостатки:
VIPS — библиотека на C, но с C++ интерфейсом. Она спроектирована для обработки очень больших изображений, главным образом, для исследований картин в музеях вроде Национальной Галереи (имеется в виду Национальная Галерея в Лондоне — прим. пер.). К ней прилагается графический пользовательский интерфейс на Gtk2 под названием nip2, который больше похож на Excel для обработки графики.
Преимущества:
Недостатки:
VXL — набор небольших библиотек, используемых в академических исследованиях при визуализации образов и результатов вычислений.
Преимущества:
Недостатки:
CImg — прекрасная и очень маленькая библиотека, в которой реализованы действительно инновационные эффекты обработки изображений, такие как зарисовывание (inpainting) испорченных или шумных изображений. Мы используем её в расширении greycstoration в Krita.
Преимущества:
Недостатки:
Ожидалось, что GEGL станет ядром GIMP 2.0, но разработка застопорилась настолько, что перехода на GEGL до выхода 2.0 не произошло (как известно, его и до выхода 2.4 не произошло — прим. пер.). В целом, это попытка написать темплейтную библиотеку на C при помощи собственного языка описания операций над изображениями. Недавно Ойвинд Колас aka Pippin подобрал упавший флаг разработки. Прогресс налицо, но я всё же не уверен в том, что будет просто или вообще возможно взять и сходу портировать GIMP на GEGL.
Преимущества:
Недостатки:
На самом деле, libart — не библиотека для обработки изображений, а скорее канва для рисования изображений. Он оптимизирован под векторную графику и используется в Karbon 1.x для рендеринга фигур перед выводом на экран. Karbon 2.x будет использовать Arthur. (
Преимущества:
Недостатки:
Java2D — более или менее полноценная библиотека для созданий «рисовательных» программ. Она позволяет работать с изображениями разных форматов, цветовыми пространствами, алгоритмами преобразования пикселов изображения и текстом. Само собой, написана она на Java, и свободная реализация пока не готова ( Есть мнение, что автор давно не смотрел в GNU Classpath — прим. пер.), да и к тому же она использует Cairo. Когда-то у меня была программа с открытым исходным кодом, основанная на Java2D, но исходники я потерял, а названия уже не помню.
Преимущества:
Недостатки:
GraphicsMagick — это ImageMagick под другой лицензией и с фокусом на стабильный API. Теперь GM и IM отличаются ещё и функциональностью. Ранее Krita активно использовал IM (ещё в 2004 можно было найти его куски в коде программы), но затем от ядра на основе IM отказались в пользу нынешнего: оказалось, что IM сложно использовать в интерактивном приложении.
Недавно мы сделали большую часть фильтров импорта и экспорта независимыми от ImageMagick и оставшийся код ради стабильности API переписали под GraphicsMagick.
Преимущества:
Недостатки:
Огромная библиотека на С++ от создателей CMake для работы с двух- и трёхмерными изображениями и визуализации данных. Слишком огромная, чтобы я мог её всесторонне оценить.
Преимущества:
Недостатки:
Это набор заголовочных файлов, зависящих от Boost и реализующих алгоритмы работы с изображениями. Приятно то, что GIL одинаково работает с обычными и планарными изображениями, т.е. с изображениями, где каждый канал занимает свой блок памяти, и изображениями, где пикселы пишутся один за другим в память. GIL используется в приложениях Adobe и Mission Photo (опенсорсный каталогизатор фотографий на PyGtk).
Преимущества:
Недостатки:
Библиотеки для обработки изображений или самостоятельные приложения — Perico, Digikam, Cinepaint (and Glasgow), PIL, Java Advanced Imaging API — их ещё много… Я упомянул лишь те, которые исследовал сам, когдща взялся за разработку Krita и искал библиотеку, на которой можно было бы базировать код.
Думаю, что создание собственной было правильным решением: мы многому научились и создали свои, уникальные функции. Решение использовать итераторы стоило нам производительности, но сделало разработку функционала намного проще.
В настоящее время мы заменяем архитектуру прямого наследования в библиотеке цветовых пространств на темплейты, что ещё больше упрощает написание кода поддержки новых цветовых пространств. Нам больше не понадобится целых два дня, чтобы реализовать поддержку L*a*b!
Автор: Boudewijn Rempt
Источник: http://www.valdyas.org/fading/index.cgi/software/image_libraries.html?seemore=y
digilinux.ru
Системные типы и классы HBITMAP, Bitmap и им подобные рассчитаны, в первую очередь, на вывод на экран. Для них существует множество функций рисования геометрических примитивов, вывода текста, но при этом отсутствует прямой доступ к пикселям изображения. Функции Bitmap::GetPixel и им подобные работают непозволительно долго.
Оптимальным вариантом является работа с изображением непосредственно в памяти. Это можно сделать двумя способами:
Двумерные изображения хранятся в памяти в виде одномерных массивов. Обычно они записываются построчно: сначала идёт 0-я строка, затем 1-я и т.д. Последовательный доступ к памяти осуществляется быстрее, чем произвольный. Поэтому обход по изображению нужно делать так, чтобы доступ к памяти был последовательный: во внешнем цикле производится обход по вертикали, а во внутреннем — по горизонтали:
for (int y = 0; y
for (int x = 0; x
...
Также стоит быть аккуратным при использовании двумерных массивов в C# (а лучше вообще их не использовать, написав класс-обёртку для одномерных массивов): в них первый индекс — это строка (Y-координата), а вторая — столбец (X).
Вы всегда можете ознакомиться с форматами графических файлов и написать свои функции (классы, библиотеки) для чтения и сохранения изображений в желаемых форматах. Однако если для формата BMP написание подобных функций не составляет труда, то для более популярных форматов, таких как JPEG и PNG, написание своего декодера — идея не из лучших.
Существует множество сторонних библиотек для работы с изображениями в C++, которые можно использовать для загрузки и сохранения и загрузки изображений, однако в системе Windows для этих задач можно использовать встроенную библиотеку GDI+. Общий принцип работы такой: загрузить изображение в класс Gdiplus::Bitmap, получить прямой доступ к пикселям изображения и преобразовать изображение во внутреннее представление.
Ниже приложены проекты для Microsoft Visual Studio 2010, в которых реализованы функции чтения и записи изображений:
imaging.cs.msu.ru
Системные типы и классы HBITMAP, Bitmap и им подобные рассчитаны, в первую очередь, на вывод на экран. Для них существует множество функций рисования геометрических примитивов, вывода текста, но при этом отсутствует прямой доступ к пикселям изображения. Функции Bitmap::GetPixel и им подобные работают непозволительно долго.
Оптимальным вариантом является работа с изображением непосредственно в памяти. Это можно сделать двумя способами:
Двумерные изображения хранятся в памяти в виде одномерных массивов. Обычно они записываются построчно: сначала идёт 0-я строка, затем 1-я и т.д. Последовательный доступ к памяти осуществляется быстрее, чем произвольный. Поэтому обход по изображению нужно делать так, чтобы доступ к памяти был последовательный: во внешнем цикле производится обход по вертикали, а во внутреннем — по горизонтали:
for (int y = 0; y
for (int x = 0; x
...
Также стоит быть аккуратным при использовании двумерных массивов в C# (а лучше вообще их не использовать, написав класс-обёртку для одномерных массивов): в них первый индекс — это строка (Y-координата), а вторая — столбец (X).
Вы всегда можете ознакомиться с форматами графических файлов и написать свои функции (классы, библиотеки) для чтения и сохранения изображений в желаемых форматах. Однако если для формата BMP написание подобных функций не составляет труда, то для более популярных форматов, таких как JPEG и PNG, написание своего декодера — идея не из лучших.
Существует множество сторонних библиотек для работы с изображениями в C++, которые можно использовать для загрузки и сохранения и загрузки изображений, однако в системе Windows для этих задач можно использовать встроенную библиотеку GDI+. Общий принцип работы такой: загрузить изображение в класс Gdiplus::Bitmap, получить прямой доступ к пикселям изображения и преобразовать изображение во внутреннее представление.
Ниже приложены проекты для Microsoft Visual Studio 2010, в которых реализованы функции чтения и записи изображений:
imaging.cs.msu.ru
Ниже рассмотрены библиотеки на C/C++, которые могут быть использованы в основе разработки библиотеки для генерации 2D финансовых графиков и индикаторов технического анализа.
Основными требованиями являются:
Итог к рассмотрению:
Расширение для C++ форка GraphicsMagick библиотеки ImageMagick. С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах. В отличии от родителя (IMagick) разработчики делают упор на производительности, оптимизации и безопасности.
Сайт: http://www.graphicsmagick.org/
Примеры: http://www.imagemagick.org/Magick++/Image++.html
Расширение для C++: http://www.graphicsmagick.org/Magick++/
Расширение для Python: https://github.com/hhatto/pgmagick
Python-пакет PgMagick может работать как с GraphicsMagick, так и с ImageMagick. Библиотека интегрирована в Python с помощью Python-Boost. В отличие от Wand-Py работает в десятки раз быстрее, но при этом имеет худшую документацию для Python (надо все искать в документации C++-расширения Magick++).
Расширение для C++ популярной библиотеки ImageMagick (IMagick). С помощью библиотеки можно рисовать, обрабатывать картинки и сохранять в различных форматах.
Сайт: http://imagemagick.org/script/index.php
Примеры: http://www.imagemagick.org/Magick++/Image++.html
Расширение для C++: http://imagemagick.org/Magick++/
Расширение для Python: http://docs.wand-py.org/
Пример IPython: https://gist.github.com/emcconville/a0dd134bfa2b12c96377
Wand-Py работает крайне медленно по сравнению с Pillow (форк стандартной библиотеки PIL для Python). Не удалось решить проблемы со шрифтами (добавляет сглаживание и размытие).
Библиотека написанная на C для рендеринга векторной графики. Содержит функции для рисования двумерных изображений. Преимуществом отмечается (на форумах) хорошая документация. Работает медленнее SKIA (есть сравнение в интернете).
Сайт: https://www.cairographics.org/
Примеры: https://www.cairographics.org/samples/
Расширение для C++: https://www.cairographics.org/cairomm/
Расширение для Python: http://pythonhosted.org/cairocffi/
Графическая библиотека написанная на C++ для рендеринга векторной графики. Используется в Google Chrome, Chrome OS, Mozilla Firefox, Android. Поддерживается Google. Куцая документация, но есть примеры. По сравнению с Cairo работает быстрее.
Сайт: https://skia.org/
Примеры: https://skia.org/user/api/skcanvas
Расширение для Python: https://github.com/expobrain/python-skia
Библиотека растровой графики написанная на C++. Последняя версия выпущена в 2006 году. Есть предположение, что данная библиотека лежит в основе PIL для Python (и Pillow).
Сайт: http://www.antigrain.com/
Библиотека для работы с растровой графикой написанная на C. Популярна в PHP. В Python с похожим функционалом доступен пакет Pillow, который и рекомендуется использовать.
Сайт: https://libgd.github.io/
Примеры: https://libgd.github.io/pages/faq.html
Расширение для Python: https://github.com/Solomoriah/gdmodule
Форк стандартной библиотеки PIL для Python. Работает быстро. Корректно работает со шрифтами. Документации мало, но разобраться можно.
Сайт: http://pillow.readthedocs.io/
Примеры: http://pillow.readthedocs.io/en/3.3.x/reference/ImageDraw.html
Группированный список различных библиотек для C/C++ с кратким описанием и ссылкой на источник.
https://github.com/fffaraz/awesome-cpp
VKontakte
quantrum.me