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

如何使用Imagemagick根据底图尺寸动态调整水印Logo大小适配PPT生成需求

解决方法

核心思路是将固定尺寸的水印缩放改为按底图尺寸比例等比缩放,同时动态调整水印位置,保证不同大小的底图都能呈现一致的水印效果。

具体修改点

  • 放弃固定2000*600的水印尺寸,设定水印宽度占底图宽度的固定比例(可自行调整比例值控制水印大小),按照水印原图的宽高比计算目标高度,避免水印拉伸变形
  • 水印的边距也改为按底图尺寸动态计算,保证水印位置统一
  • 修复原代码中第二个文本框对象赋值错误的问题(原代码中tf1错误使用了第一个文本框的text_frame,会导致第二个文本框无内容)
  • 幻灯片尺寸设置移到循环外,避免重复执行无效操作

修改后的完整代码

from pptx import Presentation
from pptx.util import Inches,Pt
from wand.image import Image

# 水印配置参数,可根据需求调整
WATERMARK_WIDTH_RATIO = 0.2  # 水印宽度占底图宽度的比例
WATERMARK_MARGIN_RATIO = 0.02  # 水印距离底图边缘的距离占底图对应边长的比例
WATERMARK_OPACITY = 0.1  # 水印透明度

def addwatermark(pic_path,i):
    with Image(filename = pic_path) as image:
        img_width, img_height = image.width, image.height
        with Image(filename = 'nike_black.png') as water:
            # 按比例计算水印目标尺寸,等比缩放不拉伸
            target_water_width = int(img_width * WATERMARK_WIDTH_RATIO)
            water_aspect_ratio = water.width / water.height
            target_water_height = int(target_water_width / water_aspect_ratio)
            water.resize(target_water_width, target_water_height)
            
            # 动态计算水印位置,当前逻辑是放在左上角,可自行调整
            margin_x = int(img_width * WATERMARK_MARGIN_RATIO)
            margin_y = int(img_height * WATERMARK_MARGIN_RATIO)
            
            with image.clone() as watermark:
                watermark.watermark(water, WATERMARK_OPACITY, margin_x, margin_y)
                new_pic = "newimage{}.jpg".format(i)
                watermark.save(filename = new_pic)
    return new_pic


prs = Presentation()
# 幻灯片尺寸全局设置即可,不需要放到循环里每次修改
prs.slide_width = Inches(16)
prs.slide_height = Inches(9)

for i in range(1,6):
    blank_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(blank_slide_layout)

    # 文本框 --1
    text_Box = slide.shapes.add_textbox(left = Inches(3),top = Inches(0),width = Inches(2),height = Inches(1))
    tf = text_Box.text_frame
    p = tf.add_paragraph()
    p.text = "Image With Nike LOGO"
    p.font.bold = True
    p.font.size = Pt(40)

    # 文本框 --2
    text_Box1 = slide.shapes.add_textbox(left = Inches(1),top = Inches(3),width = Inches(2),height = Inches(1))
    tf1 = text_Box1.text_frame  # 修复原代码的赋值错误
    p = tf1.add_paragraph()
    run = p.add_run()
    p.level = 0
    run.text = "sample section {}".format(i)
    run.font.size = Pt(40)

    # 插入图片尺寸固定即可
    height = Inches(5.21)
    width = Inches(4.17)

    pic  = slide.shapes.add_picture(addwatermark("image{}.jpg".format(i),i) ,left = Inches(1),top = Inches(2), height=height, width = width)

prs.save('new.pptx')

参数调整说明

如果觉得水印大小不合适,直接修改WATERMARK_WIDTH_RATIO的数值即可:数值越大水印越大,越小水印越小。
如果需要调整水印位置,修改watermark.watermark()方法的后两个坐标参数即可,也可以调整WATERMARK_MARGIN_RATIO修改边距大小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:45:02