PyPNG文档是否有误?保存像素行遇格式匹配问题
PyPNG Writer输入格式问题解析与解决方案
错误原因
你触发的png.ProtocolError本质是RGB模式下的行数据格式不匹配:PyPNG的Writer要求RGB图像的每一行必须是扁平化的整数分量序列,而不是包含RGB元组的数组。当你传入10个RGB元组作为一行时,Writer会将每个元组视为单个"值",导致一行仅被识别为10个值,但10列的RGB图像每行需要10×3=30个分量值,因此报错。
正确的两种输入格式
PyPNG稳定版仅支持以下两种合法输入格式:
格式1:全图像扁平化一维数组
将所有像素的RGB分量按顺序拼接成一个一维数组,长度为width×height×3。示例代码:import png width, height = 10, 10 # 生成全红像素数据:每个像素的R=255, G=0, B=0 pixels = [255, 0, 0] * width * height with open('output_rgb.png', 'wb') as f: writer = png.Writer(width, height, bitdepth=8) writer.write(f, pixels)格式2:按行拆分的扁平化一维数组列表
每一行对应一个长度为width×3的一维数组,所有行组成一个列表。示例代码:import png width, height = 10, 10 # 每行生成全绿像素的扁平化数据 rows = [[0, 255, 0] * width for _ in range(height)] with open('output_rows.png', 'wb') as f: writer = png.Writer(width, height, bitdepth=8) writer.write(f, rows)
关于文档与版本的疑问
- 文档问题:PyPNG官方文档确实存在表述模糊的情况,部分示例混淆了灰度图与RGB图的格式差异——灰度图可以直接传入单个数值的二维数组(如
[[0]*width]*height),但RGB图必须使用扁平化的分量序列。你看到的"3整数元组的宽×高二维数组"示例属于文档疏漏,并非合法的稳定版用法。 - 版本问题:如果你使用的是PyPNG稳定版(如0.20220715.0及以后),不存在所谓"实验版本"的特殊用法,元组二维数组本身就不是RGB模式的合法输入。
内容的提问来源于stack exchange,提问作者Portevent
相关产品推荐
相关产品推荐

