使用PIL与aggdraw绘制六边形无图形无报错问题求助
问题分析与修复
1. 生成器被耗尽导致无内容绘制
Python生成器只能遍历一次,你先执行print(list(hexagon))已经取完了所有元素,后续list(hexagon)会得到空列表,draw.polygon自然没有内容可绘制。
2. 缺少绘制刷新与图像保存步骤
使用aggdraw.Draw绘制后,必须调用draw.flush()将绘制内容同步到PIL图像对象,还要通过image.save()把图像保存为文件,否则看不到最终结果。
3. 坐标计算逻辑优化(可选)
原代码通过累加方式计算坐标,第一个顶点并非设定的偏移点,而是偏移点加上第一个边的向量。调整为直接基于偏移点计算每个顶点的绝对坐标,逻辑更严谨。
修复后的完整代码
import math from PIL import Image from aggdraw import Draw, Brush, Pen def hexagon_generator(edge_length, offset): """生成六边形顶点坐标""" x0, y0 = offset for angle in range(0, 360, 60): x = x0 + math.cos(math.radians(angle)) * edge_length y = y0 + math.sin(math.radians(angle)) * edge_length yield int(x) yield int(y) def main(): image = Image.new('RGB', (1000, 1000), 'white') draw = Draw(image) # 先将生成器转为列表,避免重复遍历导致耗尽 hexagon_coords = list(hexagon_generator(40, (30, 15))) print(hexagon_coords) draw.polygon(hexagon_coords, Pen('black'), Brush('red')) # 同步绘制内容到图像对象 draw.flush() # 保存生成的图像 image.save('hexagon.png') if __name__ == "__main__": main()
关键修改说明
- 提前将生成器转为列表,确保坐标数据可重复使用
- 调整坐标计算方式,直接基于偏移点生成每个顶点的绝对位置
- 添加
draw.flush()完成绘制缓冲区与图像对象的同步 - 添加
image.save()将图像输出为文件,方便查看结果 - 规范脚本执行入口,符合Python工程化编写习惯
内容的提问来源于stack exchange,提问作者Jimmy Xee
相关产品推荐
相关产品推荐

