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

使用PIL绘制等宽水平填充线时图像留白无法填满如何解决

问题根因

出现留白是两个逻辑错误导致的:

  • 高度计算时将浮点型的单条高度amount强制转换为整数,当图像总高度无法被颜色列表长度整除时,整数截断丢失的像素值会持续累积,最终在图像底部形成白色留白。例如3种颜色分1000像素高度时,1000/3≈333.33,转int后单条高度333像素,3条总高度仅999像素,剩余1像素就是空白。
  • 用draw.line绘制宽线条时,PIL会以传入的y坐标为中线向两侧扩展线宽,而非从传入的y坐标开始向下占满整个线宽高度,加上浮点坐标累加的精度误差,会进一步导致条带位置偏移、出现缝隙。
修复方案

放弃用宽线条拼接的实现,改用填充矩形绘制水平条带,提前用整数运算拆分总高度,将无法整除的余数字素均匀分摊到前序条带中,全程无浮点精度损失,可适配任意长度的颜色列表,完全填满图像无留白。

修复后可直接运行的代码:

from PIL import Image, ImageDraw

# 可根据需求自定义参数
IMAGE_WIDTH = 1000
IMAGE_HEIGHT = 1000
# 颜色列表可替换为任意长度,逻辑无需修改
colors = [(255, 0, 0), (255, 255, 0)]

im = Image.new('RGB', (IMAGE_WIDTH, IMAGE_HEIGHT), (255, 255, 255))
draw = ImageDraw.Draw(im)
color_num = len(colors)
base_strip_height = IMAGE_HEIGHT // color_num
remainder_pixel = IMAGE_HEIGHT % color_num

current_top_y = 0
for idx, fill_color in enumerate(colors):
    # 前remainder_pixel个条带多分配1像素,消化所有余数,保证总高度和图像高度完全一致
    current_strip_height = base_strip_height + 1 if idx < remainder_pixel else base_strip_height
    # 绘制填充矩形,规避线宽渲染偏移问题
    draw.rectangle(
        xy=[
            (0, current_top_y),
            (IMAGE_WIDTH, current_top_y + current_strip_height)
        ],
        fill=fill_color
    )
    current_top_y += current_strip_height

im.save('no_gap_strip.png')
方案特性
  • 全程整数坐标计算,无浮点精度累积误差
  • 矩形填充绘制无渲染偏移,条带之间无重叠、无缝隙
  • 自动适配任意长度的颜色列表,无需手动调整高度计算逻辑
  • 余数字素均匀分摊,不会出现单条条带高度明显异常的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 18:06:25