lib sppng ( simple png ) 是一个用于读写可移植网络图形 (PNG) 格式文件的 C 库,重点关注安全性和易用性。
libspng 是 libpng 的替代品,项目是独立的并且 API 不兼容。
目标是提供一个快速的 PNG 库,其 API 比 libpng 更简单,它在常见用例中的性能优于参考实现。
特征 | 斯彭 | 库文件 | 机顶盒图像 | 洛德彭 |
---|---|---|---|---|
从流中解码 | ✅ | ✅ | ✅ | |
伽玛校正 | ✅ | ✅ | ||
没有已知的安全错误[1] | ✅ | ✅ | ✅ | |
渐进式图像读取 | ✅ | ✅ | ||
解析所有标准块 | ✅ | ✅ | ||
不需要 zlib [2] | ✅ | ✅ | ✅ | |
编码 | ✅ | ✅ | ✅ | ✅ |
动画 PNG | 计划 | ✅ [3] |
[1]该项目在 OSS-Fuzz 上进行了模糊测试,漏洞在公开之前已得到修复。
[2]支持使用 miniz 进行构建。
[3]使用第 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 ={ .宽度=宽度, .高度=高度, .bit_深度 = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* 图像将根据 ihdr.color_type, .bit_depth 进行编码 */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。
代码根据 BSD 2 条款“简化”许可证获得许可。
该项目包含来自 libpng 的优化和测试图像,这些图像已根据 PNG 参考库许可证版本 2 获得许可。
代码是根据 CERT C 编码标准的规则编写的。检查所有整数算术是否有溢出,并妥善处理所有错误情况。
该库由 OSS-Fuzz 持续进行模糊测试,还使用 Clang Static Analyzer、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 获取。
所有 PNG 颜色类型和位深度组合均不支持解码为SPNG_FMT_G8
、 SPNG_FMT_GA8
和SPNG_FMT_GA16
输出格式,有关详细信息,请参阅文档。
SPNG_FMT_PNG
、 SPNG_FMT_G8
、 SPNG_FMT_GA8
和SPNG_FMT_GA16
输出格式未实现伽玛校正。
您可以通过 OpenCollective 赞助开发,资金将根据路线图用于维护和进一步开发。
与您的组织一起支持该项目。您的徽标将显示在此处,并带有指向您网站的链接。 [贡献]