如何用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
相关产品推荐
相关产品推荐

