ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

stb_image_write 单文件图片保存:3 行代码导出 PNG,一次完整上手

stb_image_write 单文件图片保存:3 行代码导出 PNG,一次完整上手 stb_image_write 单文件图片保存3 行代码导出 PNG一次完整上手【免费下载链接】stbstb single-file public domain libraries for C/C项目地址: https://gitcode.com/GitHub_Trending/st/stbstb_image_write 是 stb 仓库里负责图片保存的单文件 C 库把stb_image_write.h拷进工程、定义一个实现宏就能把内存里的像素直接写成 PNG、JPG、BMP、TGA、HDR 文件。需要给游戏或工具加保存截图/导出纹理功能、又不想引入 libpng 之类的重依赖时它是我最常拿出来用的方案。为什么选它而不是 libpng 之类先说结论功能上它不跟 libpng 硬碰硬但它干的是另一件事——把把像素落盘这件事的成本压到最低。单头文件。所有实现都在stb_image_write.h里在你要生成实现的那个 .c 里#define STB_IMAGE_WRITE_IMPLEMENTATION再 include 一次就完事。没有构建脚本、没有链接项交叉编译和嵌入式交叉链都不用折腾。零依赖、公共领域public domain许可商用品类随便用不用看 license 条款。它自己就带一个内置的 zlib 压缩实现PNG 不依赖系统 zlib。头文件里也写得很坦白产出的 PNG 体积比正经优化过的编码器大约 20-50%设计目标是代码紧凑和简单不是最优的文件体积。stb_image_writelibpng交付形态单个头文件库 头文件需要构建外部依赖无内置压缩通常还需 zlib许可公共领域宽松许可商用需读条款体积/速度PNG 偏大、速度够用更优适合调试输出、存档、工具链中间产物对文件体积敏感的发行物我的经验如果是日志贴图、存档截图、工具链中间产物体积差个 30% 无所谓选它省下的集成时间值回票价如果是对外发行的资产管线再考虑正经编码器。stb_image_write 跑通第一个 PNG最小可用示例#define STB_IMAGE_WRITE_IMPLEMENTATION // 全工程只在一个 .c 里放这句 #include stb_image_write.h int main(void) { int w 24, h 16, x, y; unsigned char buf[w * h * 3]; // 左上黑 - 右下蓝的简单渐变 for (y 0; y h; y) for (x 0; x w; x) { buf[(y * w x) * 3 0] 0; buf[(y * w x) * 3 1] (unsigned char)(y * 255 / (h - 1)); buf[(y * w x) * 3 2] (unsigned char)(x * 255 / (w - 1)); } // w, h, 通道数(1/2/3/4), 数据, 行跨度 stbi_write_png(grad.png, w, h, 3, buf, w * 3); return 0; }最后一个参数是 stride行跨度相邻两行像素起点之间的字节数w * 3是最常见的满宽情况。这个参数让你可以直接从一张大纹理或帧缓冲的任意子区域写出 PNG不用先拷出一块连续内存。写成功返回非 0写文件失败返回 0记得判一下。按场景挑格式PNG、JPG、TGA 怎么选格式一句话定位关键参数alpha 处理典型用途PNG无损体积适中stbi_write_png_compression_level默认 80-9保留纹理、截图、日志贴图JPG有损照片友好quality1-100直接忽略头像、照片、上传前压缩BMP无压缩最通用无丢弃兜底方案、老工具链TGA游戏纹理老标准stbi_write_tga_with_rle默认开保留纹理交换、老引擎资产HDR32bit 浮点保动态范围数据必须是线性float丢弃渲染管线中间产物PNG 压缩等级默认 8 已经很紧调 9 一般再省个位数百分比、编码更慢追求快就调到 4 左右日志类输出无所谓。JPG 质量参数85 左右是体积和观感的常用平衡点低于 70 会出现明显块效应。BMP/TGA 不支持 stride 参数只接受连续的矩形数据。各格式对 alpha 的态度不一致见上表带透明度的数据用 JPG 或 BMP 会悄悄丢 alpha这是静默行为不会报错。几个容易踩的坑上下翻转是第一大坑。图像格式从左上角开始存而 OpenGL 这类 API 的纹理坐标原点在左下角。你的帧缓冲直接丢给 stb_image_write出来的图就是竖着翻的。两种处理stbi_flip_vertically_on_write(1)让库帮你翻或者写之前自己翻转它是全局变量用完记得设回 0。stb 仓库里这张测试用的黑白人像图就是这类图像处理输出的典型样子压缩等级是全局变量不是函数参数。多线程各自写图时别指望我的等级只影响我的文件要么加锁要么各线程各写一份。stride 只在 PNG 里生效。别的格式只认连续内存从非连续来源写 BMP 会直接出错。通道数只能是 1/2/3/4。顺序固定为 Y / YA / RGB / RGBA每通道 8bit。传 5 或 0 属于未定义行为。想要更小的 PNG 可以注入压缩函数。头文件支持STBIW_ZLIB_COMPRESS宏替换内置压缩配合系统 zlib 能把前面说的 20-50% 体积差距拉平内存分配也支持STBIW_MALLOC/STBIW_FREE替换方便挂到自己的分配器上。平台细节Windows 下要写 Unicode 文件名需定义STBIW_WINDOWS_UTF8并传 UTF-8 路径HDR 写依赖 stdioSTBI_WRITE_NO_STDIO模式下 HDR 会被禁用。快速决策存档、截图、调试贴图 → PNG照片和上传场景 → JPG 85老工具链只认位图 → BMP接受它的体积渲染管线中间态要保 float 精度 → HDR。官方入口stb_image_write.h库本体单文件注释里就是 API 文档tests/image_write_test.c五种格式的最小测试用例翻转、stride 都有覆盖照着抄最稳stb_image.h配套的读图端保存后再读回来做校验的闭环用它需要拿完整仓库的话git clone https://gitcode.com/GitHub_Trending/st/stbstb 这套库都是单文件、公共领域的写图只是其中一个模块读图、缩图、字体渲染都有对应的单文件版本用顺手了基本可以凑齐一套图像处理工具链。【免费下载链接】stbstb single-file public domain libraries for C/C项目地址: https://gitcode.com/GitHub_Trending/st/stb创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表