PIL ImageDraw.Draw()未绘制线条,请求排查自定义check函数问题
问题排查与解决方案
先揪出你代码里最直观的问题:你设置的线条填充色是fill=128,这对应的是中灰色(不管是灰度图还是RGB图,128都代表偏灰的色调),根本不是你想要的黑色!如果原图是浅色背景,灰色线条可能淡到几乎看不见,自然会让你觉得没生效。先把fill改成0(灰度图的黑色值)或者"black"(RGB/RGBA图的黑色标识)试试,这大概率是最核心的原因。
除此之外,还有几个容易踩的坑需要排查:
- 图像模式不兼容:如果你的
layout {}.png是RGBA带透明通道的格式,直接传单值128作为颜色会出问题,得用四元组格式,比如黑色要写成(0,0,0,255)。可以先加一行print(imgg.mode)确认图像的色彩模式。 - 修改后未留存:
imgg.show()只是临时弹出修改后的图像预览,关闭窗口后修改就没了。如果需要永久保存修改,得调用imgg.save("修改后的文件名.png")。 - 循环逻辑冗余:你现在的代码是遍历
all_里的每个cartella,只要匹配到number就重新打开图像、绘制线条、显示。如果all_里有多个包含该number的cartella,会重复打开同一张图多次,后面的绘制可能覆盖前面的,或者你只看到最后一次的结果。应该把图像打开和ImageDraw初始化的代码放到循环外面,一次性完成所有线条绘制再显示。
给你调整后的参考代码:
def check(user, number): # 只打开一次图像,避免重复IO操作 imgg = Image.open(f"layout {user}.png") drawer = ImageDraw.Draw(imgg) for cartella in all_: if number in cartella: line_coords = coords[cartella.index(number)] print(line_coords) # 确认坐标正确性 # 根据图像模式选择对应的黑色参数 if imgg.mode == "L": # 灰度图像模式 drawer.line(line_coords, fill=0, width=5) else: # RGB/RGBA彩色模式 drawer.line(line_coords, fill="black", width=5) # 显示并保存修改后的图像 imgg.show() imgg.save(f"modified_layout_{user}.png")
这样调整后,黑色线条应该就能正常显示了。
内容的提问来源于stack exchange,提问作者Fghjkgcfxx56u
相关产品推荐
相关产品推荐

