FreeImage

Библиотека для работы с изображениями

Работа с изображениями - более чем актуальный в наше время аспект программирования прикладных приложений. Несмотря на то, что узкоспециальных графических программ на рынке и так очень много, новые всё продолжают появляться. Кроме графических программ, функции работы с изображениями теперь встраиваются и в те инструменты, где они изначально не предполагались и нужны теперь, скорее, не в качестве основной функциональности, а просто для удобства пользователя. Например, во всё большем количестве архиваторов появляется функция просмотра графики, находящейся в архиве. Даже в программах для работы с базами данных, которые чаще всего пишут на заказ программисты-одиночки, часто оказывается нужна графическая функциональность, причём не только в виде показа картинок и сохранения их в базе, но и в виде простых функций редактирования вроде поворота, отражения, обрезки краёв, инвертирования изображения и тому подобных вещей. Поэтому, думаю, существование готовых библиотек для работы с изображениями все программисты должны только приветствовать. А если кто-то не согласен - что ж, никто не мешает написать свою аналогичную библиотеку.

Библиотека, о которой я сейчас хочу вам рассказать, как раз и относится к разряду графических - впрочем, думаю, вы и сами догадались об этом из заголовка статьи. И её название я тоже уже представил: она называется FreeImage. Как видно, библиотека абсолютно бесплатна и поставляется с исходными текстами. Тем, кому интересно, сообщу, что имеется сразу два варианта лицензий на использование FreeImage: GNU General Public License (GPL) и своя собственная FreeImage Public License. Поэтому библиотеку можно использовать как в некоммерческих, так и в коммерческих приложениях. Официальный сайт проекта размещается в интернете по адресу freeimage.sourceforge.net. На нём можно найти дистрибутив самой библиотеки как в виде исходных текстов, так и в виде скомпилированных модулей, а также документацию и примеры на английском и китайском языках. Также очень интересен раздел сайта, на котором находится перечень разработок (как коммерческих, так и свободных), в которых используется FreeImage. В нём много довольно известных и успешных программ. Поэтому даже если вы с опаской относитесь к программному обеспечению с открытым исходным кодом, то прислушайтесь к опыту тех, кто уже использовал эту библиотеку в своих продуктах.

Итак, что же именно умеет делать FreeImage и почему эта библиотека заслуживает внимания читателей нашей газеты? Во-первых, сразу отмечу, что FreeImage - не одна из библиотек широкого назначения. Она умеет только работать с изображениями (я имею в виду, картинками), но не рисует их сама. То есть, отрисовка кривых, заливка и прочее - все эти вещи должны ложиться на плечи какой-то другой библиотеки, но никак не FreeImage. Она умеет только загрузить картинку из файла, зато потом с этой картинкой можно будет проделать много интересных вещей.

В своей области библиотека обладает, если можно так сказать, изрядным профессионализмом. Потому что количество поддерживаемых форматов изображений очень велико. Имеются в виду, конечно же, форматы файлов, в которых эти самые изображения хранятся. Список этих форматов не мал, но я всё же приведу его полностью, чтобы избежать голословности. Итак, вот какие форматы библиотека умеет читать: BMP, DDS, Dr.Halo, GIF, LBM, HDR, ICO, IFF, JBIG, JNG, JPEG/JIF, KOALA, Kodak PhotoCD, MNG, PCX, PBM, PGM, PNG, PPM, PSD, G3, SGI, RAS, TARGA, TIFF, WBMP, XBM, XPM. Итого - 27 штук. Большинство коммерческих библиотек того же назначения ограничиваются десятком форматов. Производить запись FreeImage умеет в меньшее количество форматов, но всё равно их достаточно много: BMP, GIF, HDR, ICO, JBIG, JPEG/JIF, PBM, PGM, PNG, PPM, TARGA, TIFF, WBMP, XPM. В этом списке 14 форматов. Впрочем, нужно оговориться, что файлы Dr.Halo библиотека умеет читать только в серой (grayscale) палитре, а для чтения и записи файлов формата JBIG нужен плагин к библиотеке, причём для использования этой функциональности в коммерческих приложениях может потребоваться покупка коммерческой же лицензии. Всё дело в том, что формат JBIG запатентован, и не кем-нибудь, а самой корпорацией IBM (подробности можно найти по адресу www.cl.cam.ac.uk/~mgk25/jbigkit/patents.html). Впрочем, большинство программ вполне могут жить и безо всяких JBIG'ов.

Чем ещё привлекает библиотека, кроме изрядного списка поддерживаемых форматов картинок? На втором месте после оного, как мне кажется, стоит возможность её использования под разными платформами. Сами разработчики в списке поддерживаемых систем указывают Windows, Linux, Solaris 9 и MacOS X. В плане переносимости библиотеки также стоит сказать, что, хотя сама она написана на C++, но есть "переходники" для использования её в виде скомпилированного модуля из программ на других языках: Delphi, Visual Basic, а также C# и VB.NET. Впрочем, конечно, у программистов, использующих C++, более широкие возможности, поскольку они смогут включать FreeImage в свои приложения как в виде динамической библиотеки, так и в виде статической.

FreeImage умеет загружать изображения не только из файлов, но и из потока данных. То есть картинки можно передавать (например, по сети) не в виде файлов, а в виде потока данных, что экономит трафик. Как утверждают разработчики FreeImage, эта возможность уникальна, и другие библиотеки так делать не умеют. Ещё одна уникальная особенность библиотеки FreeImage - её структура, позволяющая подключать плагины к самой библиотеке. О ней я уже вскользь упоминал, когда говорил о поддержке JBIG, однако хочу сейчас заострить ваше внимание на данном вопросе. Плагины, как и сама библиотека, могут компоноваться статически или динамически. Плагинов для библиотеки пока не так много, но будем верить, что со временем они появятся.

Из моего рассказа можно сделать вывод о том, что все функции библиотеки FreeImage сводятся к загрузке изображений из файла (или, в общем случае, из потока данных) и к обратной задаче - сохранению изображений. Однако на самом деле это не совсем так, и сейчас я расскажу о функциональности FreeImage, которая кому-то покажется излишним наворотом, хотя в ряде случаев именно она может стать ничуть не менее полезной, чем указанные выше основные функции библиотеки.

Во-первых, библиотека умеет переводить растровые изображения из одной палитры в другую, т.е. менять глубину цвета. FreeImage поддерживает работу с 1, 4, 8, 16, 24 и 32-битными изображениями. Вторая "дополнительная" возможность - это доступ к отдельным битам и байтам как изображения, так и палитры, которая в нём используется. Именно эта функция мне кажется наиболее полезной, поскольку позволяет получить полный контроль над изображением. Третья возможность - поддержка метаданных, прикрепляемых к изображению (для тех форматов, которые такую возможность предусматривают). Поддерживаются комментарии к изображениям, EXIF-информация, IPTC, Adobe XPM, GeoTIFF. Это самые распространённые стандарты метаданных для изображений. Так что в этом вопросе библиотека далеко не аутсайдер на рынке. Четвёртая дополнительная функциональность FreeImage - это специальная улучшенная интеграция с OpenGL и DirectX. Что скрывается за этими красивыми словами? Это значит, что для использования загруженных с помощью FreeImage изображений в качестве текстур при отрисовке сцен при помощи Direct3D и OpenGL не нужно писать сложного дополнительного кода. В библиотеке уже присутствуют необходимые для такой интеграции функции. Думаю, эта возможность должна прийтись по душе тем, кто пишет приложения, работающие с быстрой графикой. Также добавлю, что FreeImage имеет встроенные средства для простого манипулирования изображениями: например, поворота, изменения размеров, отражения. Конечно, PhotoShop с такой библиотекой за пять минут не сделаешь, но там, где нужны только простые операции с графикой, FreeImage вполне может использоваться без привлечения большого количества дополнительных библиотек, осуществляющих трансформацию изображения. А, как я уже говорил, это может пригодиться даже там, где такой функциональности, по идее, может и не быть.

Что ж, пожалуй, на этом можно разговор о библиотеке FreeImage потихонечку и сворачивать. Но сначала я расскажу ещё пару вещей, которые тоже будет полезно знать и на которые обращают внимание пользователей своего детища разработчики. Библиотека не поддерживает работу с векторными форматами (то есть, с её помощью нельзя будет ни загрузить, ни просмотреть ни один из них). Поэтому если есть необходимость использовать в приложении векторную графику наряду с растровой, то одной FreeImage уже ограничиться будет нельзя. Ну а вторая из этих вещей - это то, что библиотека разрабатывается и совершенствуется командой разработчиков со всего мира уже без малого десять лет. Думаю, за такой срок разработчики были в состоянии создать вполне качественный и достаточно свободный от ошибок программный продукт, которому можно доверить работу с изображениями в разрабатываемом приложении. Впрочем, конечно же, окончательное решение останется за вами - свою задачу я выполнил, рассказав об этой замечательной и полезной библиотеке. Думаю, в любом случае, будет не лишним запомнить в браузере ссылку на её официальный сайт, и обратиться в случае надобности к нему.

Вадим СТАНКЕВИЧ

Версия для печатиВерсия для печати

Номер: 

49 за 2006 год

Рубрика: 

Software
Заметили ошибку? Выделите ее мышкой и нажмите Ctrl+Enter!

Комментарии

Аватар пользователя Инкогнито
Спасибо за очень полезную информацию!