You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python PIL绘制文本出现边缘黑点,如何消除该问题?

嘿,我之前也碰到过PIL绘制文本时出现这种奇怪黑点的情况!大概率是字体渲染的抗锯齿或者像素对齐问题,咱们一步步来解决:

首先先把你的代码补全方便参考(假设你原本的逻辑是这样):

from PIL import Image, ImageDraw, ImageFont

font_size = 14
MEDIA_FONT = "你的字体文件路径.ttf"  # 替换成你实际的字体路径
font = ImageFont.truetype(MEDIA_FONT, font_size)

box_image_height = 80
box_image_width = 250
box_image = Image.new('RGB', (box_image_width, box_image_height), (255,255,255))
draw = ImageDraw.Draw(box_image)

# 假设你原本要绘制的文本代码
draw.text((30, 20), "需要显示的文本", font=font, fill=(0,0,0))
box_image.save("output.png")

可能的原因&对应解决方案

  • 原因1:浮点坐标导致的插值像素
    如果你的draw.text坐标用了浮点数(比如(30.2, 20.5)),PIL在渲染时会做像素插值,容易出现边缘黑点。
    解决: 确保坐标是整数,比如(30, 20)

  • 原因2:未开启抗锯齿或渲染引擎老旧
    PIL默认的文本渲染可能没开启抗锯齿,或者默认的布局引擎处理某些字体时会有bug。
    解决:

    1. draw.text里添加antialias=True参数(PIL 9.1.0+版本支持):
      draw.text((30, 20), "需要显示的文本", font=font, fill=(0,0,0), antialias=True)
      
    2. 换用更优的文本布局引擎,初始化字体时指定:
      font = ImageFont.truetype(MEDIA_FONT, font_size, layout_engine=ImageFont.LAYOUT_RAQM)
      
  • 原因3:RGB模式直接绘制的像素溢出
    有些情况下,在RGB画布上直接绘制文本会出现边缘像素异常,换成RGBA画布先绘制再合成能解决。
    解决:

    # 先创建透明RGBA画布绘制文本
    text_canvas = Image.new('RGBA', (box_image_width, box_image_height), (255,255,255,0))
    text_draw = ImageDraw.Draw(text_canvas)
    text_draw.text((30,20), "需要显示的文本", font=font, fill=(0,0,0,255), antialias=True)
    # 把文本合成到白色背景上
    box_image.paste(text_canvas, mask=text_canvas)
    
  • 原因4:字体文件本身有问题
    如果以上方法都没用,可能是你用的字体文件本身存在渲染bug,换个常见字体(比如系统自带的Arial、宋体)试试,排除字体本身的问题。

你可以先试试前两个方案,这两个解决了我之前遇到的类似黑点问题~如果还是不行,可以补充下完整代码和黑点的具体位置描述,咱们再进一步排查!

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

火山引擎 最新活动