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