Привет!


Я начал новый проект под лицензией 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 всё ещё в разработке, но уже пригодна для использования. Бинарная совместимость и совместимость исходного кода пока что не гарантируется.









 , , , ,






URL записи