LINUX.ORG.RU

Пурум-пум-пум, или SAIL: Библиотека декодирования изображений

 , , , ,


0

1

Привет!

Я начал новый проект под лицензией MIT и был бы очень рад вашим отзывам и фич-реквестам :)

Проект: https://github.com/smoked-herring/sail

Это библиотека декодирования изображений, ребрендинг кодеков ksquirrel-libs из давно почившего просмотрщика изображений KSquirrel.

Целевая аудитория:

  • Просмотрщики изображений
  • Разработка игр
  • Загрузка изображений для иных целей

Возможности:

  • Простая, маленькая, и быстрая библиотека написанная на С без сторонних зависимостей (кроме кодеков)
  • Простой, понятный, и в тоже время мощный API для всех нужд
  • биндинги к C++
  • Форматы изображений поддерживаются динамически загружаемыми кодеками
  • Чтение изображений из файла, памяти, или даже своего собственного источника данных
  • Определение типа изображения по расширению файла, или по магическому числу
  • Операции чтения всегда могут выдавать пиксели в формате RGB и RGBA
  • Большинство кодеков умеют выдавать также и исходные (SOURCE) пиксели. Это пригодится например тем, кто захочет выбить весь дух из CMYK изображений
  • Некоторые кодеки могут выдавать пиксели в ещё большем списке форматов
  • Чтение и запись ICC профилей
  • Примеры на C, Qt, SDL
  • Лучшие MIME иконки в компьютерной индустрии :)

Чего SAIL не предоставляет:

  • Редактирование изображений
  • Функции конверсии цветовых пространств кроме тех, что дают низлежащие кодеки (libjpeg и т.д.)
  • Функции управления цветом (применение ICC профилей и т.д.)

Поддерживаемые форматы на данный момент:

  • APNG (чтение, только на Windows)
  • JPEG (чтение, запись)
  • PNG (чтение, запись)

Работа по добавлению новых форматов ведётся. KSquirrel-libs так или иначе поддерживал около 60 форматов, так что работы предстоит много :)

Поддерживаемые платформы:

  • Windows (installer)
  • MacOS (brew)
  • Linux (Debian rules)

Простейший пример декодирования на C:

struct sail_context *context;

/*
 * Initialize SAIL context. You could cache the context and re-use it multiple times.
 * When it's not needed anymore, call sail_finish(context).
 */
SAIL_TRY(sail_init(&context));

struct sail_image *image;
unsigned char *image_pixels;

/*
 * sail_read() reads the image and outputs pixels in BPP32-RGBA pixel format for image formats
 * with transparency support and BPP24-RGB otherwise. If you need to control output pixel
 * formats, consider switching to the deep diver API.
 */
SAIL_TRY(sail_read(path,
                   context,
                   &image,
                   (void **)&image_pixels));

/*
 * Handle the image pixels here.
 * Use image->width, image->height, image->bytes_per_line,
 * and image->pixel_format for that.
 */

free(image_pixels);
sail_destroy_image(image);

Краткое описание уровней API:

  • Новичок: Я просто хочу загрузить этот чёртов JPEG
  • Продвинутый: Я хочу загрузить этот чёртов анимированный GIF из памяти
  • Глубоководный дайвер: Я хочу загрузить этот чёртов анимированный GIF из памяти, и иметь полный контроль над выбранными кодеками и форматом отдаваемых пикселей
  • Технический дайвер: Я хочу всё то, что выше, и мой собственный источник данных

Отличия от других библиотек:

  • Человеческий API с ожидаемыми сущностями - изображениями, палитрами и т.д. Никакого ада а-ля WIN32 API ;)
  • Большинство кодеков умеют отдавать не только RGB/RGBA пиксели
  • Писать кодеки можно на любом языке, и добавлять/удалять их без перекомпиляции всего проекта
  • Сохранение информации об исходном изображении
  • «Прощупывание» (probing) - получение информации об изображении без декодирования пиксельных данных
  • Размер и скорость

Кому интересна эта тема, приглашаю всех посмотреть! Отзывы и разного рода отчёты категорически приветствуются.

Если вы хотите как-то помощь проекту, то даже звёздочка (star) на Github будет огромной помощью.

SAIL всё ещё в разработке, но уже пригодна для использования. Бинарная совместимость и совместимость исходного кода пока что не гарантируется.



Последнее исправление: sailor (всего исправлений: 1)
Ответ на: комментарий от anonymous

Даю подсказку: imlib

спасибо. В imlib2 (видимо именно это имелось ввиду) реализован схожий принцип. Но imlib2 грузит все кодеки сразу. SAIL грузит кодеки on demand, если явно не указано обратное. Это значит, что в памяти лежит только то, что реально используется.

У imlib2 есть ещё много других недостатков - невозможность использования кодеков по magic, нет декодирования из памяти и собственных источников (как у FreeImage и SAIL) и т.д.

sailor
() автор топика
Ответ на: комментарий от Harald

а почему бы не использовать libjpeg или libpng напрямую, зачем лишние прокладки-обёртки

если есть цель загрузить только исключительно jpeg - это вариант. Однако SAIL и все конкуренты - это библиотека более общего назначения, когда через абстракцию грузится множество форматов изображений. Когда именно это и является целью, а именно грузить множество форматов через слой абстракции, тут и вступают в игру библиотеки аналогичные этой.

sailor
() автор топика
Ответ на: комментарий от sailor

Это значит, что в памяти лежит только то, что реально используется.

Кстати, по поводу мощей. Netpbm - это МОЩЬ. А твои байки про «аккуратное» пользование памяти - лабудень полная. Ты же в памяти изображение держишь, верно?

anonymous
()
Ответ на: комментарий от anonymous

А твои байки про «аккуратное» пользование памяти - лабудень полная

Есть реальный use-case: обработка windows иконок. Такие ути-пути картиночки размером 16x16 и выше. Если ты возьмёшь для этого FreeImage, то загрузишь в память несколько мегабайт библиотек. Каждый конечно сам решает.

sailor
() автор топика
Ответ на: комментарий от sailor

Если ты возьмёшь для этого FreeImage

Это был ответ на какой вопрос и кому? Со стеной чтоле разговоры ведёшь?

anonymous
()
Ответ на: комментарий от sailor

Есть реальный use-case: обработка windows иконок.

Это нереальный use-case, потому что такие иконки / битмапы лежат ресурсами.

Но, конечно, если ты норкоман, то можешь парсить их «библотекой для работы с изображениями».

LamerOk ★★★★★
()
Ответ на: комментарий от sailor

грузятся только те кодеки, которые ты реально используешь

А ещё лучше статически слинковаться, чтобы кодеки грузились не полностью, а только то, что реально используешь.

Думаю для игор это имеет смысл.

dsxl
()
Ответ на: комментарий от sailor

пока нет времени на это.

Я так и не услышал главного. Целевой конкретный продукт, пользующий данную либу уже сейчас?

«Имя, сестра! Имя!»

anonymous
()
Ответ на: комментарий от anonymous

Святая толстота.

Первый коммит в проекте был четыре месяца назад, миллионов форматов пока нет, только фундамент заложен. Либу ещё пилить и пилить, какие тебе продукты?

anonymous
()
Ответ на: комментарий от anonymous

Либу ещё пилить и пилить, какие тебе продукты?

Тогда всё гораздо проще: У данной либы то же будущее, что и множества таких же, успешно забытых и покоящихся в SVN (то есть никакого будущего).

anonymous
()
Ответ на: комментарий от question4

KDE со всеми своими API плавно переходила на KDE4. Работы предстояло относительно много. У меня не было времени всем этим заниматься, а мэйнтэйнеров не нашлось. Конец был закономерен.

sailor
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.