You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用python-pptx获取图片占位符尺寸,实现插入图片自适应缩放

解决python-pptx插入图片到占位符时被裁剪的问题

我刚好碰到过类似的问题,python-pptx其实是可以动态获取占位符尺寸的——你只需要直接访问占位符对象的widthheight属性就行!下面是具体的解决方案,直接集成到你的代码里就能实现图片按比例缩放适配占位符,避免裁剪:

修改后的核心代码

def insert_images(slide, slide_num, images_path, image_df):
    """
    Insert images into a slide.
    :param slide: = slide object from Presentation class
    :param slide_num: the template slide number for formatting
    :param images_path: the directory to the folder with all the images
    :param image_df: Pandas data frame regarding information of each image in images_path
    :return: None
    """
    placeholders = get_image_placeholders(slide)
    image_pool = image_df[image_df['slide_num'] == slide_num]
    try:
        assert len(placeholders) == len(image_pool.index)
    except AssertionError:
        print('Length of placeholders in slide does not match image naming.')
    i = 0
    for idx, image in image_pool.iterrows():
        image_path = os.path.join(images_path, image.path)
        placeholder = slide.placeholders[placeholders[i]]
        pic = placeholder.insert_picture(image_path)
        
        # --- 新增:图片适配占位符逻辑 ---
        # 获取占位符和图片的原始尺寸
        placeholder_w, placeholder_h = placeholder.width, placeholder.height
        img_w, img_h = pic.width, pic.height
        
        # 计算缩放比例:取宽高比例中的较小值,保证图片完整显示且不拉伸
        scale_ratio = min(placeholder_w / img_w, placeholder_h / img_h)
        
        # 按比例缩放图片
        pic.width = img_w * scale_ratio
        pic.height = img_h * scale_ratio
        
        # 可选:让图片在占位符内居中对齐
        pic.left = placeholder.left + (placeholder_w - pic.width) / 2
        pic.top = placeholder.top + (placeholder_h - pic.height) / 2
        # --- 适配逻辑结束 ---
        
        # 保留你原来的边框颜色设置
        line = pic.line
        if image['view'] == 'red':
            line.color.rgb = RGBColor(255, 0, 0)
        elif image['view'] == 'green':
            line.color.rgb = RGBColor(0, 255, 0)
        elif image['view'] == 'blue':
            line.color.rgb = RGBColor(0, 0, 255)
        else:
            line.color.rgb = RGBColor(0, 0, 0)
        line.width = Pt(2.25)
        i+=1

关键逻辑解释

  1. 动态获取占位符尺寸:通过placeholder.widthplaceholder.height直接读取模板中占位符的实际大小,完全不需要硬编码尺寸参数;
  2. 等比例缩放图片:取占位符与图片的宽比例、高比例中的较小值,既能保证图片完整放入占位符不被裁剪,又不会破坏图片的原始宽高比;
  3. 居中对齐优化:调整图片的lefttop属性,让缩放后的图片在占位符内居中显示,视觉效果更协调(如果不需要可以删掉这两行)。

这个方案完美适配你的现有代码逻辑,解决了图片被过度裁剪的问题,同时不需要用户手动设置任何尺寸参数。

内容的提问来源于stack exchange,提问作者Robin White

火山引擎 最新活动