使用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
问题原因
- 第一个错误:
png.Reader.read()返回的rows是生成器对象,遍历一次后就会耗尽,后续传给writer.write()时没有任何行数据。 - 第二个错误:
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
相关产品推荐
相关产品推荐

