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

