如何使用python-pptx在不改变图片宽高比的前提下将图片适配到PPT
可以实现。python-pptx本身支持在不修改图片原始宽高比的前提下,将图片缩放到适配指定页面区域。
你当前的问题是调用add_picture()时仅传入了插入位置,没做尺寸限制,程序默认按图片原始分辨率对应的物理尺寸输出,你的原图分辨率达4000x6016,远大于PPT页面可展示的范围,所以才会出现图片超出页面、仅显示局部的问题。
实现逻辑
- 提前确定PPT页面中给图片预留的最大允许宽度、最大允许高度
- 读取待插入图片的原始宽高,分别计算宽度、高度两个方向的缩放比例
- 取两个缩放比例中更小的值作为实际缩放比例,即可保证图片既完整展示在预留区域内,又完全保留原始宽高比
修改后的可运行代码
from wand.image import Image from pptx import Presentation from pptx.util import Inches prs = Presentation() blankSideLayout = prs.slide_layouts[4] # 可根据你的PPT布局自行调整图片预留区域的最大宽高 MAX_PIC_WIDTH = Inches(8) MAX_PIC_HEIGHT = Inches(4) def makePPTX(path): slide = prs.slides.add_slide(blankSideLayout) slide.shapes.title.text = "sample title" slide.placeholders[2].text = "Sample Sub Title" # 读取图片原始宽高 with Image(filename=path) as img: orig_width, orig_height = img.width, img.height # 计算缩放比例,取最小值保证图片不超出边界 width_scale = MAX_PIC_WIDTH / orig_width height_scale = MAX_PIC_HEIGHT / orig_height actual_scale = min(width_scale, height_scale) # 计算实际插入的宽高 actual_width = orig_width * actual_scale actual_height = orig_height * actual_scale # 传入计算好的宽高插入图片 slide.shapes.add_picture(path, Inches(1), Inches(3), width=actual_width, height=actual_height) prs.save("slides.pptx") logoImg = Image(filename='logo.jpg') logoImg.transparentize(0.33) img = Image(filename='img.jpg') img.composite_channel("all_channels",logoImg,"dissolve",20,20) img.save(filename='imgwatermark.jpg') makePPTX('imgwatermark.jpg')
效果说明
调整MAX_PIC_WIDTH和MAX_PIC_HEIGHT的数值即可自定义图片的最大展示区域,缩放后的图片会完整保留原始比例,不会出现拉伸变形,和预期输出效果一致。
内容的提问来源于stack exchange,提问作者Veera Silamban
相关产品推荐
相关产品推荐

