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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:36:22