Source SDK 2013 内置 libspng:从 libpng 平滑迁移的完整 API 对照指南

发布时间:2026/9/15 21:17:43
Source SDK 2013 内置 libspng:从 libpng 平滑迁移的完整 API 对照指南 Source SDK 2013 内置 libspng从 libpng 平滑迁移的完整 API 对照指南【免费下载链接】source-sdk-2013The 2013 edition of the Source SDK项目地址: https://gitcode.com/GitHub_Trending/so/source-sdk-2013导读本文基于 Source SDK 2013 仓库内第三方组件 libspng 的官方迁移文档 migrate-libpng.md 展开系统梳理如何将基于 libpng 的 PNG 读取/写入代码迁移到 libspng。libspngsimple png是一个以安全与易用为设计目标的 C 语言 PNG 编解码库API 与 libpng 不兼容但概念一一对应。读完本文你将掌握spng 上下文模型与错误处理语义、图像/块级内存限制的配置、IHDR 等块信息的读写 API 映射、解码与编码的格式转换与渐进式操作、以及 CRC 策略、zlib 压缩参数、滤波选择等选项的迁移方式。关联文档src/thirdparty/libspng/docs/migrate-libpng.md源码spng/spng.c、spng/spng.h示例examples/example.c上下文模型从 info struct 到单一spng_ctxlibpng 的经典用法需要同时维护 read/write struct 与 info struct 两个对象libspng 将其合并为唯一的上下文句柄spng_ctx是不透明opaque类型持有全部状态信息没有独立的 info struct也没有公开成员通过spng_ctx_new()创建默认上下文或spng_ctx_new2()传入自定义内存分配器该分配器同时传递给 zliballoc及其成员必须非 NULL上下文默认是解码器传入SPNG_CTX_ENCODER标志值为 2即创建编码器上下文另一个标志SPNG_CTX_IGNORE_ADLER32值为 1用于忽略 DEFLATE 流校验和spng_ctx_free()释放上下文持有的全部资源包括内部缓冲区、块缓存、文本/未知块数据等。错误处理零值即成功错误码驱动绝不 abortspng 的错误语义非常统一所有函数返回 0 表示成功非零表示错误解码或编码错误会使上下文进入不可恢复状态后续大多数函数调用都会返回SPNG_EBADSTATE在 spng.h 中定义以防止未定义行为错误只通过返回值传递spng 从不调用abort()这与 libpng 的 longjmp 错误模型截然不同无需setjmp/png_jmpbuf保护可用spng_strerror()将错误码转为可读的错误消息。解码层面的错误进一步分为关键错误与非关键错误详见 decode.md 的 Error handling 小节关键错误如截断的 PNG、截断的图像数据不可恢复必须假定解码彻底失败、部分输出无效非关键错误损坏的 CRC、无效的块等可通过忽略校验和或丢弃无效块进行确定性处理图像仍能一致地提取但可能损失色彩精度或透明度。为兼容既有图片默认行为刻意模仿 libpng多数非关键错误被忽略非法调色板索引按黑色不透明像素处理IEND 标记之后不再做任何解析与校验。内存与资源限制libpng 限制 API 的完整对应libpngspng说明png_set_user_limits()spng_set_image_limits()设置图像宽/高上限不超过 2³¹−1png_get_user_width_max()spng_get_image_limits()查询宽/高上限png_get_user_height_max()spng_get_image_limits()同上png_set_chunk_malloc_max()spng_set_chunk_limits()对应chunk_size参数png_get_chunk_malloc_max()spng_get_chunk_limits()对应chunk_size参数png_set_chunk_cache_max()spng_set_option()选项SPNG_CHUNK_COUNT_LIMIT要点spng_set_chunk_limits(ctx, chunk_size, cache_limit)中chunk_size是块数据长度上限cache_limit是整体内存用量上限默认分别为 2³¹−1 与SIZE_MAX达到任一限制按 OOM内存耗尽错误处理该函数只用于限制额外内存大多数标准块不消耗额外内存不受这些限制约束SPNG_CHUNK_COUNT_LIMITv0.7.0 起控制可存储的块数量默认 1000与块缓存上限相互独立解码至少需要 2 行图像驻留内存隔行扫描interlaced图像需要 3 行SPNG_FMT_RGBA16等 16 位输出做伽马校正时额外需要 128KB 查找表。在 usage.md 的“解码不可信文件”一节中官方给出的安全解码最低要求是用spng_set_image_limits()设置宽/高上限、用spng_decoded_image_size()计算输出尺寸并与固定常量比对、再用spng_set_chunk_limits()限制块大小与缓存三者缺一不可。图像信息与块数据get/set 函数对照块数据存储在spng_ctx中。语义规则见 chunk.md所有spng_get_*()成功返回 0若 PNG 中不存在对应块则返回SPNG_ECHUNKAVAIL成功的spng_set_*()会替换先前设置的值或列表不与文件数据合并解码器调用 get/set 时会读取并校验第一个 IDAT 之前的所有块图像解码完成后再调用则会一直读到 IEND 标记通过spng_set_*()存入的块数据永远不会被输入文件数据覆盖。注意除 IHDR 外的图像基本信息可用spng_get_ihdr()取得大多数块数据是拷贝存储的但任意长度块eXIf、text、sPLT、未知块与块列表不被拷贝——列表引用必须在上下文生命周期内保持有效与 libpng 不同内部列表指针不可直接访问获取 text / sPLT / 未知块列表时必须先用 NULL 指针查询列表数量、再自行分配缓冲区。读取侧libpng get → spng getlibpngspng说明png_get_IHDR()spng_get_ihdr()图像信息png_get_PLTE()spng_get_plte()调色板png_get_tRNS()spng_get_trns()透明度png_get_cHRM()spng_get_chrm()浮点色度坐标png_get_cHRM_fixed()spng_get_chrm_int()PNG 内部整数表示png_get_gAMA()spng_get_gama()浮点伽马png_get_gAMA_fixed()spng_get_gama_int()PNG 内部整数表示png_get_iCCP()spng_get_iccp()ICC 配置不校验png_get_sBIT()spng_get_sbit()有效位png_get_sRGB()spng_get_srgb()渲染意图png_get_text()spng_get_text()文本块png_get_bKGD()spng_get_bkgd()背景色png_get_hIST()spng_get_hist()直方图png_get_pHYs()spng_get_phys()物理像素尺寸png_get_sPLT()spng_get_splt()建议调色板png_get_tIME()spng_get_time()修改时间png_get_oFFs()spng_get_offs()图像偏移png_get_eXIf_1()spng_get_exif()EXIF 数据png_get_sCAL()N/A不支持png_get_unknown_chunks()spng_get_unknown_chunks()未知块png_get_image_width()等 6 个尺寸/类型查询spng_get_ihdr()统一从 IHDR 结构读取写入侧libpng set → spng setlibpngspng说明png_set_IHDR()spng_set_ihdr()图像头png_set_PLTE()spng_set_plte()调色板png_set_tRNS()spng_set_trns()透明度png_set_cHRM()/_fixedspng_set_chrm()/spng_set_chrm_int()色度png_set_gAMA()/_fixedspng_set_gama()/spng_set_gama_int()伽马png_set_iCCP()spng_set_iccp()profile_name 只能含可打印 Latin-1 字符与空格不允许首尾/连续空格png_set_sBIT()spng_set_sbit()有效位png_set_sRGB()spng_set_srgb()渲染意图png_set_text()spng_set_text()文本必须为 Latin-1换行只能是 LF十进制 10compression_method必须为 0png_set_bKGD()spng_set_bkgd()背景色png_set_hIST()spng_set_hist()直方图png_set_pHYs()spng_set_phys()物理尺寸png_set_sPLT()spng_set_splt()建议调色板png_set_tIME()spng_set_time()修改时间png_set_oFFs()spng_set_offs()偏移png_set_eXIf_1()spng_set_exif()EXIFpng_set_sCAL()N/A不支持png_set_unknown_chunks()spng_set_unknown_chunks()未知块解码迁移设置输入源与解码器配置设置输入 PNGlibpngspng说明png_set_read_fn()spng_set_png_stream()设置流回调读回调拷贝length字节到dest返回 0 或SPNG_IO_EOF/SPNG_IO_ERRORpng_init_io()spng_set_png_file()设置FILE*输入N/Aspng_set_png_buffer()直接设置内存缓冲区输入输入源每个上下文只能设置一次PNG 会一直被读到文件结束标记IEND与 libpng 行为一致。注意本版本不支持 push 式解码libpng 的png_set_read_fn推送模型没有对应实现。解码器配置libpngspng说明png_set_crc_action()spng_set_crc_action()见下文 CRC 行为常量png_set_interlace_handling()N/A渐进式解码见 decode.mdpng_create_read_struct()N/A见上文“上下文模型”png_destroy_read_struct()N/A用spng_ctx_free()替代CRC 行为常量对照SPNG_CRC_ERROR默认关键块、SPNG_CRC_DISCARDv0.6.2 起为辅助块默认、SPNG_CRC_USE三个动作覆盖了 libpng 的 CRC 策略子集libpngspng关键块动作辅助块动作PNG_CRC_DEFAULTN/ASPNG_CRC_ERRORSPNG_CRC_USEPNG_CRC_ERROR_QUITSPNG_CRC_ERRORerrorerrorPNG_CRC_WARN_DISCARDSPNG_CRC_DISCARD无效丢弃数据PNG_CRC_WARN_USEN/A无警告系统无警告系统PNG_CRC_QUIET_USESPNG_CRC_USE使用数据使用数据PNG_CRC_NO_CHANGEN/A补充要点来自 decode.md 的 Checksums 小节PNG 使用两类校验和——块数据的 32 位 CRC 与 DEFLATE 流中的 Adler-32SPNG_CTX_IGNORE_ADLER32标志会忽略 Adler-32仅 zlib ≥ 1.2.11 支持编译为 miniz 时不可用当SPNG_CRC_USE作用于任一块类型时 DEFLATE 流中的 Adler-32 也会被忽略作用于两种块类型时等价于SPNG_CTX_IGNORE_ADLER32反之不成立DEFLATE 流中的 Adler-32 错误与其他错误统一映射为SPNG_EZLIB错误码spng.h。图像格式与转换spng_format语义与透明度迁移libspng 当前只处理源格式与目标格式不会根据源 PNG 格式或 tRNS 等元数据自动变换输出格式。所有spng_format都是显式的、主机字节序的SPNG_FMT_PNG与SPNG_FMT_RAW除外解码时 PNG 格式被转换到目标spng_format编码时反向转换。目标格式含 alpha 而源格式不含时alpha 采样被隐式置为不透明的最大值alpha 通道始终是直通 alphastraight alpha不支持预乘 alpha。两个特殊格式SPNG_FMT_PNG256等价于 PNG 头IHDR声明的格式按主机字节序x86 上即小端解码时输出恒为主机字节序编码时假定源图像为主机字节序等价于仅在小端机上调用png_set_swap()SPNG_FMT_RAW512同SPNG_FMT_PNG但为大端等价于 libpng 不做任何转换PNG 标准只支持大端 16 位编码用作源格式时假定源图像大端解码 16 位图像时输出恒为大端。部分解码标志可能影响最终图像但永远不会改变像素内采样的尺寸或布局。另外某些源/目标组合不受支持可核对 decode.md 与 encode.md 中的支持组合表。添加透明度对应png_set_tRNS_to_alpha()指定带 alpha 通道的输出格式如SPNG_FMT_RGBA8并加SPNG_DECODE_TRNS解码标志即可ret spng_decode_image(ctx, out, len, SPNG_FMT_RGBA8, SPNG_DECODE_TRNS);注意图像没有 tRNS 块、或该标志对当前 PNG 格式/输出格式组合不适用时不会报错标志被静默忽略。png_set_tRNS_to_alpha()在 libpng 中会存在 tRNS 时添加同比特深度的 alpha 通道、将索引色隐式转为 8 位 RGB、将 1/2/4 位灰度转为 8 位灰度并在有 tRNS 时加 alpha。用 spng 等价实现如下migrate-libpng.md 原文示例int fmt SPNG_FMT_PNG; int decode_flags SPNG_DECODE_TRNS; if(ihdr.color_type SPNG_COLOR_TYPE_INDEXED) fmt SPNG_FMT_RGB8; else if(ihdr.color_type SPNG_COLOR_TYPE_GRAYSCALE ihdr.bit_depth 8) fmt SPNG_FMT_G8; struct spng_trns trns {0}; int have_trns !spng_get_trns(ctx, trns); if(have_trns) { if(ihdr.color_type SPNG_COLOR_TYPE_TRUECOLOR) { if(ihdr.bit_depth 16) fmt SPNG_FMT_RGBA16; else fmt SPNG_FMT_RGBA8; } else if(ihdr.color_type SPNG_COLOR_TYPE_GRAYSCALE) { if(ihdr.bit_depth 16) fmt SPNG_FMT_GA16; else fmt SPNG_FMT_GA8; } else if(ihdr.color_type SPNG_COLOR_TYPE_INDEXED) { fmt SPNG_FMT_RGBA8; } }其他 libpng 变换的迁移对照libpngspng说明png_set_swap()N/A字节交换由源/目标格式自动完成png_set_expand_gray_1_2_4_to_8()N/A需要时用SPNG_FMT_G8png_set_tRNS_to_alpha()N/A见上文“添加透明度”png_set_palette_to_rgb()N/A需要时用SPNG_FMT_RGB8png_set_gamma()SPNG_DECODE_GAMA假定屏幕伽马为 2.2png_read_update_info()N/A不再需要png_set_expand_16()N/A不支持png_set_bgr()N/A不支持png_set_gray_to_rgb()N/A需要时用SPNG_FMT_RGB8png_set_rgb_to_gray()/_fixedN/A不支持png_build_grayscale_palette()N/A不支持png_set_alpha_mode()/_fixedN/A不支持png_set_strip_alpha()N/A不支持png_set_swap_alpha()N/A不支持png_set_invert_alpha()N/A不支持png_set_filler()/png_set_add_alpha()N/A不支持png_set_packing()/png_set_packswap()N/A不支持png_set_shift()N/A不支持png_set_invert_mono()N/A不支持png_set_background()/_fixedN/A不支持png_set_scale_16()/png_set_strip_16()N/A不支持解码图像一次性解码与渐进式解码spng不使用行指针数组row pointers图像数据是连续缓冲区。核心解码流程对照 usage.md 与 README#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); /* 计算输出尺寸 */ spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0); /* 解码为 8 位 RGBA */ spng_ctx_free(ctx); /* 释放上下文 */函数映射libpngspng说明png_read_row()spng_decode_row()解码一行png_write_image()spng_decode_image()一次性解码文档原文如此对应png_read_info()spng_decode_chunks()可选块按需读取png_read_end()spng_decode_chunks()可选块按需读取spng_decode_image()会完成隔行去隔行deinterlace、16 位图像转主机字节序out指向长度len的缓冲len必须不小于用同一输出格式调用spng_decoded_image_size()得到的值该函数每个上下文只能调用一次设置SPNG_DECODE_PROGRESSIVE标志256时仅初始化渐进式解码忽略out/len。渐进式解码非隔行图像按行调用spng_decode_row()最后一行返回SPNG_EOIspng.h 定义int error; size_t image_width image_size / ihdr.height; for(i 0; i ihdr.height; i) { void *row image image_width * i; error spng_decode_row(ctx, row, image_width); if(error) break; } if(error SPNG_EOI) /* 成功 */隔行图像的行会被多次、非顺序访问必须用spng_get_row_info()获取当前行号spng_row_info.row_num/pass这也是所有情况下的推荐写法int error; struct spng_row_info row_info; do { error spng_get_row_info(ctx, row_info); if(error) break; void *row image image_width * row_info.row_num; error spng_decode_row(ctx, row, len); } while(!error) if(error SPNG_EOI) /* 成功 */spng_decode_scanline()解码单个扫描线spng_decode_row()解码并去隔行两者都要求先用SPNG_DECODE_PROGRESSIVE初始化非隔行图像下spng_decode_row()与spng_decode_scanline()行为一致最后一个扫描线/行及后续调用返回SPNG_EOI。截断的 PNG 与图像数据始终视为关键错误渐进式解码可能得到部分图像但不保证所有情形都可用。编码迁移目标输出、编码器配置与图像写入设置目标 PNG编码上下文必须带SPNG_CTX_ENCODER标志创建在任何隐式写操作前必须先设置输出libpngspng说明png_set_write_fn()spng_set_png_stream()设置流回调写回调处理length字节返回 0 或SPNG_IO_ERRORpng_init_io()spng_set_png_file()设置FILE*输出N/Aspng_set_option(ctx, SPNG_ENCODE_TO_BUFFER, 1)编码到内部缓冲区SPNG_ENCODE_TO_BUFFER启用后编码器创建并管理内部输出缓冲调用spng_get_png_buffer()取出后所有权转移给用户须自行 free否则由spng_ctx_free()释放。所有情况下 PNG 都必须显式终结finalize用SPNG_ENCODE_FINALIZE标志或在图像编码完成后调用spng_encode_chunks()。编码器配置libpngspng说明png_create_write_struct()/png_destroy_write_struct()N/A见“上下文模型”png_set_keep_unknown_chunks()spng_set_option()SPNG_KEEP_UNKNOWN_CHUNKSpng_handle_as_unknown()N/A不支持png_set_unknown_chunk_location()N/A不支持需提前设置location字段png_set_compression_level()spng_set_option()SPNG_IMG_COMPRESSION_LEVELpng_set_compression_mem_level()spng_set_option()SPNG_IMG_MEM_LEVELpng_set_compression_strategy()spng_set_option()SPNG_IMG_COMPRESSION_STRATEGYpng_set_compression_window_bits()spng_set_option()SPNG_IMG_WINDOW_BITSpng_set_compression_method()N/A不支持png_set_text_compression_level()spng_set_option()SPNG_TEXT_COMPRESSION_LEVELpng_set_text_compression_mem_level()spng_set_option()SPNG_TEXT_MEM_LEVELpng_set_text_compression_strategy()spng_set_option()SPNG_TEXT_COMPRESSION_STRATEGYpng_set_text_compression_window_bits()spng_set_option()SPNG_TEXT_WINDOW_BITSpng_set_text_compression_method()N/A不支持png_set_filter()spng_set_option()SPNG_FILTER_CHOICE见滤波选择png_set_chunk_cache_max()spng_set_option()SPNG_CHUNK_COUNT_LIMITpng_set_chunk_malloc_max()spng_set_chunk_limits()chunk_size参数png_get_chunk_malloc_max()spng_get_chunk_limits()chunk_size参数png_set_quantize()N/A不支持编码器选项默认值与取值范围见 encode.mdSPNG_IMG_COMPRESSION_LEVEL默认Z_DEFAULT_COMPRESSION0-9SPNG_IMG_WINDOW_BITS默认 159-15SPNG_IMG_MEM_LEVEL默认 8SPNG_IMG_COMPRESSION_STRATEGY默认Z_FILTERED文本侧四项压缩选项同样可独立配置SPNG_FILTER_CHOICE默认SPNG_FILTER_CHOICE_ALLSPNG_ENCODE_TO_BUFFER默认 0。注意编码器选项会基于 PNG 格式与压缩级别自动优化覆盖滤波等选项可能禁用部分优化。编码图像libpngspng说明png_write_row()spng_encode_row()编码一行必要时交织png_write_image()spng_encode_image()一次性编码png_write_info_before_PLTE()N/A不支持png_write_info()spng_encode_chunks()可选块按需写出png_write_end()spng_encode_chunks()可用SPNG_ENCODE_FINALIZE替代spng_encode_image()要求先用spng_set_ihdr()设置宽、高、颜色类型、位深与隔行方法颜色类型为SPNG_COLOR_TYPE_INDEXED时还必须用spng_set_plte()设置调色板len必须等于给定格式fmt的预期图像尺寸SPNG_ENCODE_FINALIZE会在最后一行写入 IEND 结束标记多数情况下图像数据后只有 12 字节的 IEND。编码输入格式仅支持SPNG_FMT_PNG任意 PNG 格式必要时由主机字节序转换与SPNG_FMT_RAW假定大端不做转换16 位图像除SPNG_FMT_RAW外均假定为主机字节序。编码器最小示例来自 README/* 创建编码器上下文 */ spng_ctx *enc spng_ctx_new(SPNG_CTX_ENCODER); /* 编码到库管理的内部缓冲 */ spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1); /* 指定图像尺寸与 PNG 格式 */ struct spng_ihdr ihdr { .height height, .width width, .bit_depth 8, .color_type SPNG_COLOR_TYPE_TRUECOLOR_ALPHA }; spng_set_ihdr(enc, ihdr); /* SPNG_FMT_PNG 匹配 ihdr 中的格式SPNG_ENCODE_FINALIZE 写入 IEND */ 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);渐进式编码与解码对称SPNG_ENCODE_PROGRESSIVE1标志初始化渐进写入spng_encode_row()按行编码隔行图像配合spng_get_row_info()使用spng_encode_scanline()适用于已按 pass 拆分好的交织数据最后一行返回SPNG_EOI。公共常量迁移对照块位置常量libpngspngPNG_HAVE_IHDRSPNG_AFTER_IHDRPNG_HAVE_PLTESPNG_AFTER_PLTEPNG_AFTER_IDATSPNG_AFTER_IDAT颜色类型常量libpngspngPNG_COLOR_TYPE_GRAYSPNG_COLOR_TYPE_GRAYSCALEPNG_COLOR_TYPE_PALETTESPNG_COLOR_TYPE_INDEXEDPNG_COLOR_TYPE_RGBSPNG_COLOR_TYPE_TRUECOLORPNG_COLOR_TYPE_RGB_ALPHA/PNG_COLOR_TYPE_RGBASPNG_COLOR_TYPE_TRUECOLOR_ALPHAPNG_COLOR_TYPE_GRAY_ALPHA/PNG_COLOR_TYPE_GASPNG_COLOR_TYPE_GRAYSCALE_ALPHA滤波常量标准定义的滤波值libpngspngPNG_FILTER_VALUE_NONESPNG_FILTER_NONE0PNG_FILTER_VALUE_SUBSPNG_FILTER_SUB1PNG_FILTER_VALUE_UPSPNG_FILTER_UP2PNG_FILTER_VALUE_AVGSPNG_FILTER_AVERAGE3PNG_FILTER_VALUE_PAETHSPNG_FILTER_PAETH4供SPNG_FILTER_CHOICE选项使用的滤波选择标志libpngspngPNG_NO_FILTERSSPNG_DISABLE_FILTERING0PNG_FILTER_NONESPNG_FILTER_CHOICE_NONE8PNG_FILTER_SUBSPNG_FILTER_CHOICE_SUB16PNG_FILTER_UPSPNG_FILTER_CHOICE_UP32PNG_FILTER_AVGSPNG_FILTER_CHOICE_AVG64PNG_FILTER_PAETHSPNG_FILTER_CHOICE_PAETH128PNG_ALL_FILTERSSPNG_FILTER_CHOICE_ALL8|16|32|64|128其他常用函数迁移libpngspng说明png_create_info_struct()N/A见“上下文模型”png_set_mem_fn()N/A改用spng_ctx_new2()png_get_mem_ptr()N/A不支持png_get_current_row_number()spng_get_row_info()读spng_row_info.row_numpng_get_current_pass_number()spng_get_row_info()读spng_row_info.passpng_get_io_state()N/A不支持png_set_option()spng_set_option()同名对应png_set_invalid()N/A不支持png_set_sig_bytes()/png_sig_cmp()/png_check_sig()N/A不支持png_get_compression_buffer_size()/png_set_compression_buffer_size()N/A不支持png_jmpbuf()N/A不支持无 longjmp 模型png_reset_zstream()N/A不支持png_write_sig()/png_write_chunk()/_start()/_data()/_end()N/A不支持迁移要点速览结构简化spng_ctx一个对象取代 read/write struct info structSPNG_CTX_ENCODER标志区分编解码器错误模型返回码 SPNG_EBADSTATE无 setjmp/abort务必检查每个返回值错误消息用spng_strerror()查询安全三件套解码不可信文件必须设置图像宽/高限制、校验解码尺寸、设置块大小与缓存限制usage.md格式显式化明确选择输出spng_formatSPNG_FMT_RGBA8等alpha 始终为直通 alphaSPNG_FMT_PNG/SPNG_FMT_RAW分别对应主机字节序与大端原样格式变换收敛libpng 的大量png_set_*变换swap、expand、packing、background 等在 spng 中不再单独存在或由格式选择隐式完成或明确不支持png_set_tRNS_to_alpha()可用“带 alpha 的输出格式 SPNG_DECODE_TRNS”等价实现渐进式读写SPNG_DECODE_PROGRESSIVE/SPNG_ENCODE_PROGRESSIVE配合spng_get_row_info()处理隔行图像最后一行/扫描线以SPNG_EOI表示结束选项集中化zlib 压缩参数、滤波选择、块计数限制、未知块保留等统一通过spng_set_option()/spng_get_option()管理默认值与取值范围见 decode.md 与 encode.md。完整的 API 参考可继续阅读仓库内文档context.md上下文与选项、chunk.md块 get/set 语义、decode.md解码细节与支持组合、encode.md编码细节与支持组合、errors.md错误码以及完整示例 examples/example.c。【免费下载链接】source-sdk-2013The 2013 edition of the Source SDK项目地址: https://gitcode.com/GitHub_Trending/so/source-sdk-2013创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询