You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python在PNG文件中绘制矩形时遇png库报错求助

用Python给PNG图片绘制矩形并保存的正确方法

需求

有一个PNG文件,需要在其中绘制矩形并保存为新文件。

尝试的代码及错误

第一段代码(尝试修改像素)

import png

org_path = './arragon.png'
altered_path = './altered.png'

f = open(org_path, 'rb')
image = png.Reader(file=f)
width, height, rows, metadata = image.read()

for row in rows:
    for i in range(len(row)):
        row[i] = 255

writer = png.Writer(
    width=width,
    height=height,
    bitdepth=metadata['bitdepth'],
    greyscale=metadata['greyscale'],
    alpha=metadata['alpha']
)

writer.write(open(altered_path, 'wb'), rows)

执行后报错:

Traceback (most recent call last):
File "/home/miko/tmp/alter-image/./edit.py", line 23, in <module>
    writer.write(open(altered_path, 'wb'), rows)
File "/home/miko/.local/lib/python3.10/site-packages/png.py", line 670, in write
    raise ProtocolError(
png.ProtocolError: ProtocolError: rows supplied (0) does not match height (450)

第二段代码(仅复制图像)

import png

f = open(org_path, 'rb')
image = png.Reader(file=f)
width, height, rows, metadata = image.read()

writer = png.Writer(
    width=width,
    height=height,
    bitdepth=metadata['bitdepth'],
    greyscale=metadata['greyscale'],
    alpha=metadata['alpha']
)

writer.write(open(altered_path, 'wb'), rows)

执行后报错:

Traceback (most recent call last):
File "/home/miko/tmp/alter-image/./edit.py", line 23, in <module>
    writer.write(open(altered_path, 'wb'), rows)
File "/home/miko/.local/lib/python3.10/site-packages/png.py", line 668, in write
    nrows = self.write_passes(outfile, check_rows(rows))
File "/home/miko/.local/lib/python3.10/site-packages/png.py", line 703, in write_passes
    return self.write_packed(outfile, rows)
File "/home/miko/.local/lib/python3.10/site-packages/png.py", line 738, in write_packed
    for i, row in enumerate(rows):
File "/home/miko/.local/lib/python3.10/site-packages/png.py", line 658, in check_rows
    raise ProtocolError(
png.ProtocolError: ProtocolError: Expected 633 values but got 211 values, in row 0

问题原因

  1. 第一个错误:png.Reader.read()返回的rows是生成器对象,遍历一次后就会耗尽,后续传给writer.write()时没有任何行数据。
  2. 第二个错误:png库返回的rows是经过压缩/打包的像素数据(比如彩色图像每个像素包含RGB三个通道值,但生成器返回的是按字节打包的形式),直接传给写入器会导致像素数量不匹配。

正确实现方法

使用更易用的Pillow库(Python Imaging Library的分支)来处理,步骤如下:

1. 安装Pillow

pip install pillow

2. 代码示例

from PIL import Image, ImageDraw

# 打开原始图片
img = Image.open('./arragon.png')
# 创建绘图对象
draw = ImageDraw.Draw(img)

# 绘制矩形:参数依次为 (左上角x, 左上角y, 右下角x, 右下角y),fill是填充颜色,outline是边框颜色
# 示例:绘制红色边框、蓝色填充的矩形
draw.rectangle([(50, 50), (200, 200)], fill=(0, 0, 255), outline=(255, 0, 0), width=2)

# 保存修改后的图片
img.save('./altered.png')

代码说明

  • Image.open():打开PNG文件,返回可编辑的图像对象。
  • ImageDraw.Draw():创建绘图上下文,用于在图像上绘制形状。
  • draw.rectangle():绘制矩形,参数灵活,可以设置填充色、边框色和边框宽度。
  • img.save():将修改后的图像保存为新文件。

内容的提问来源于stack exchange,提问作者tscheingeld

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:30:12