LINUX.ORG.RU

Сообщения sailor

 

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

Привет!

Я начал новый проект под лицензией 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
()

RSS подписка на новые темы