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

如何用OpenCV/Pillow实现内部透明带描边的文字水印效果?

实现方案

你要的内部透明仅带描边的文字效果可以直接基于现有Pillow代码调整实现,核心是将文字填充色设为完全透明,同时配置文字描边参数即可:

  • 文字填充fill参数的Alpha通道设为0,实现内部完全透明
  • 新增stroke_width参数设置描边粗细
  • 新增stroke_fill参数设置描边的颜色和透明度
调整后完整代码
def generate_watermark_image(self, banner_details):
    banner_image = requests.get(banner_details.get('banner_url'))
    open('image.jpg', 'wb').write(banner_image.content)
    background_image = Image.open('image.jpg').convert("RGBA")
    actual_width, actual_height = background_image.size
    watermark_text = Image.new('RGBA', background_image.size, (255,255,255,0))
    font_size = '50'
    if actual_width>1000 and actual_height>1000:
        font_size = '100'
    title_font = ImageFont.truetype("arial", int(font_size))
    font_width, font_height = title_font.getsize('PLOTCH')
    padding_left = int((banner_details.get('width')/2)-(font_width/2))
    padding_top = int((banner_details.get('height')/2)-(font_height*2))
    d = ImageDraw.Draw(watermark_text)    
    # 核心修改:fill设为完全透明,添加描边参数
    d.text(
        (padding_left, padding_top), 
        "PLOTCH", 
        fill=(255, 255, 255, 0), # 内部完全透明
        font=title_font,
        stroke_width=2, # 描边宽度,可根据字体大小调整
        stroke_fill=(255, 255, 255, 150) # 描边颜色和透明度,和你原来的半透明白色一致
    )
    combined = Image.alpha_composite(background_image, watermark_text)
    background_image = cv2.cvtColor(np.array(combined), cv2.COLOR_RGB2BGR) 
    cv2.imwrite("font/minion.png", background_image)
    return background_image
版本兼容说明

stroke_width和stroke_fill参数需要Pillow版本 >= 9.1.0,如果你使用的版本较低,可以手动实现描边效果:先在上下左右4个方向各偏移1像素绘制描边颜色的文字,最后再绘制中间完全透明的文字即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:15:04