lib spng ( s imple png ) — это библиотека C для чтения и записи файлов формата PNG с упором на безопасность и простоту использования.
libspng — альтернатива libpng, проекты отдельные, API несовместимы.
Цель состоит в том, чтобы предоставить быструю библиотеку PNG с более простым API, чем libpng. В распространенных случаях использования она превосходит эталонную реализацию.
Особенность | spng | libpng | stb_image | лодепнг |
---|---|---|---|---|
Декодировать из потока | ✅ | ✅ | ✅ | |
Гамма-коррекция | ✅ | ✅ | ||
Нет известных ошибок безопасности [1] | ✅ | ✅ | ✅ | |
Прогрессивное чтение изображений | ✅ | ✅ | ||
Парсит все стандартные фрагменты | ✅ | ✅ | ||
Не требует zlib [2] | ✅ | ✅ | ✅ | |
Кодирование | ✅ | ✅ | ✅ | ✅ |
Анимированный PNG | Планируется | ✅ [3] |
[1] Проект проходит фазовое тестирование на OSS-Fuzz, уязвимости устраняются до того, как они становятся общедоступными.
[2] Поддерживается сборка с помощью miniz.
[3] Со сторонним патчем
Загрузите последнюю версию и включите spng.c/spng.h
в свой проект. Вы также можете собрать его с помощью CMake или Meson, подробности см. в документации.
#include <spng.h>/* Создать контекст декодера */spng_ctx *ctx = spng_ctx_new(0);/* Установить входной буфер */spng_set_png_buffer(ctx, buf, buf_size);/* Определить размер выходного изображения */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* Декодируем в 8-битный RGBA */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Свободная контекстная память */spng_ctx_free(ctx);/* Для создания контекста кодировщика требуется флаг */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Кодировать во внутренний буфер, управляемый библиотекой */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Укажите размеры изображения, формат PNG */struct spng_ihdr ihdr ={ .ширина = ширина, .height = высота, .bit_глубина = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* Изображение будет закодировано в соответствии с ihdr.color_type, .bit_length */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG — это специальное значение, соответствующее формату в ihdr, SPNG_ENCODE_FINALIZE завершит PNG с помощью маркер конца файла */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG по умолчанию записывается во внутренний буфер */void *png = spng_get_png_buffer(enc, &png_size, &error);/* Пользователь владеет буфером после успешного вызова */free(png);/* Свободная контекстная память */spng_ctx_free(enc);
См. пример.c.
Код лицензируется по 2-пунктной «Упрощенной» лицензии BSD.
Проект содержит оптимизации и тестовые изображения из libpng, они лицензируются по лицензии справочной библиотеки PNG версии 2.
Код пишется в соответствии с правилами CERT C Coding Standard. Вся целочисленная арифметика проверяется на переполнение, и все ошибки корректно обрабатываются.
Библиотека постоянно фаззится с помощью OSS-Fuzz, код также сканируется с помощью Clang Static Analyser, Coverity Scan и PVS-Studio.
Набор тестов состоит из более чем 1000 тестовых случаев, 175 тестовых изображений декодируются со всеми возможными выходными форматами и комбинациями флагов и сравниваются с libpng на корректность.
Релизы следуют схеме семантического управления версиями с дополнительными гарантиями:
Релизы с 0.4.0 по 0.8.x стабильны.
Если в версии 1.0.0 будут внесены критические изменения, то версия 0.8.x будет поддерживаться как отдельная стабильная ветка.
В настоящее время планируется, что версия 1.0.0 будет совместима.
Онлайн-документация доступна по адресу libspng.org/docs.
Декодирование в выходные форматы SPNG_FMT_G8
, SPNG_FMT_GA8
и SPNG_FMT_GA16
не поддерживается для всех комбинаций цветового типа PNG и разрядности, подробности см. в документации.
Гамма-коррекция не реализована для выходных форматов SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
и SPNG_FMT_GA16
.
Вы можете спонсировать разработку через OpenCollective, средства будут использованы на обслуживание и дальнейшее развитие согласно дорожной карте.
Поддержите этот проект своей организацией. Здесь появится ваш логотип со ссылкой на ваш сайт. [Способствовать]