从图片到PPT:用Python实现多图片格式(PNG/JPG/SVG)到幻灯片的批量转换

目录

引言

安装必要的库

[1. 将单个 PNG 或 JPG 图片转换为 PPT 幻灯片](#1. 将单个 PNG 或 JPG 图片转换为 PPT 幻灯片)

[1.1 生成与图片尺寸匹配的幻灯片](#1.1 生成与图片尺寸匹配的幻灯片)

[1.2 自定义幻灯片大小和图片位置](#1.2 自定义幻灯片大小和图片位置)

[2. 批量将多张 PNG 或 JPG 图片转换为 PPT 幻灯片](#2. 批量将多张 PNG 或 JPG 图片转换为 PPT 幻灯片)

[2.1 为每张图片生成单独的幻灯片](#2.1 为每张图片生成单独的幻灯片)

[2.2 自定义每页幻灯片中的图片数量](#2.2 自定义每页幻灯片中的图片数量)

[3. 将 SVG 图片转换为可编辑的PPT形状](#3. 将 SVG 图片转换为可编辑的PPT形状)

总结


引言

在制作演示文稿时,想必大家常常需要将各种格式的图片插入到 PPT 中。虽然手动操作不算难,但如果要处理大量的图片,任务就变得非常繁琐了。而借助 Python,我们可以轻松实现将图片批量转换为 PPT 幻灯片。

这篇文章将详细介绍如何使用 Python 将各种图片转换为 PPT 幻灯片,甚至批量处理多个图片,同时确保图片质量不受损。

本文主要涵盖的内容如下:

  • 将单张 PNG 或 JPG 图片转换为 PPT 幻灯片,并保持图片的原始大小
  • 自定义幻灯片的大小和图片的位置
  • 批量将多个 PNG 或 JPG 图片转换为独立的幻灯片
  • 自定义每张幻灯片上的图片数量
  • 将 SVG 图片转换为可编辑的 PPT 形状

安装必要的库

要使用 Python 将图片转换为 PPT,需要安装一个支持处理演示文稿的库。本文使用 Spire.Presentation for Python,该库支持生成PPT文档以及对PPT文档进行多种操作,包括插入图片,调整幻灯片大小,将PPT文档保存为PDF、图片格式等,而且不需要运行环境安装 Microsoft PowerPoint。

安装方法

在程序终端中运行以下命令,即可安装该库:

python 复制代码
pip install Spire.Presentation

安装完成后,就可以使用该库提供的接口来实现各种图片转PPT需求了。

1. 将单个 PNG 或 JPG 图片转换为 PPT 幻灯片

1.1 生成与图片尺寸匹配的幻灯片

将图片转换为 PPT 幻灯片时,保持图片的原始分辨率和比例非常重要。为了避免图片被拉伸或失真,我们可以通过设置幻灯片的尺寸与图片尺寸一致来实现这一点。

代码示例

python 复制代码
from spire.presentation import *

# 创建 PPT 演示文稿对象
presentation = Presentation()

# 删除默认幻灯片
presentation.Slides.RemoveAt(0)

# 加载图片
imagePath = r"C:\Users\Administrator\Downloads\Images\1.png"
stream = Stream(imagePath)
imageData = presentation.Images.AppendStream(stream)
stream.Close()

# 获取图片尺寸
imageWidth = float(imageData.Width)
imageHeight = float(imageData.Height)

# 设置幻灯片尺寸与图片一致
presentation.SlideSize.Type = SlideSizeType.Custom
presentation.SlideSize.Size = SizeF(imageWidth, imageHeight)

# 添加新幻灯片
slide = presentation.Slides.Append()

# 插入图片
rect = RectangleF(0.0, 0.0, imageWidth, imageHeight)
pptImage = slide.Shapes.AppendEmbedImageByImageData(ShapeType.Rectangle, imageData, rect)
pptImage.Line.FillType = FillFormatType.none

# 保存演示文稿
presentation.SaveToFile("单张图片转PPT.pptx", FileFormat.Pptx2013)
presentation.Dispose()

输出效果

图片填满整个幻灯片,且保持原始尺寸和比例:

1.2 自定义幻灯片大小和图片位置

在某些情况下,你可能希望使用固定的幻灯片大小(如 16:9 宽屏或 A4 比例),而不是完全匹配图片的尺寸。这种方法有助于保持演示文稿的统一风格。同时你还可以控制图片的位置,例如,将图片居中或放在指定的边距内。

以下示例展示了如何:

  • 设置固定的幻灯片大小
  • 在图片周围添加边距
  • 将图片居中显示

代码示例

python 复制代码
from spire.presentation import *

# 创建新的 PowerPoint 演示文稿
presentation = Presentation()

# 删除默认的第一张幻灯片
presentation.Slides.RemoveAt(0)

# 加载图片
imagePath = r"C:\Users\Administrator\Downloads\Images\1.png"
stream = Stream(imagePath)
imageData = presentation.Images.AppendStream(stream)
stream.Close()

# 设置标准的 16:9 宽屏幻灯片尺寸
presentation.SlideSize.Type = SlideSizeType.Screen16x9
slide = presentation.Slides.Append()

# 获取幻灯片和图片的尺寸
slideWidth = presentation.SlideSize.Size.Width
slideHeight = presentation.SlideSize.Size.Height
imgWidth = float(imageData.Width)
imgHeight = float(imageData.Height)

# 设置边距
margin = 30.0

# 按比例缩放图片以适应幻灯片边距
scale = min((slideWidth - 2 * margin) / imgWidth, (slideHeight - 2 * margin) / imgHeight)
scaledWidth = imgWidth * scale
scaledHeight = imgHeight * scale

# 将图片居中显示
x = (slideWidth - scaledWidth) / 2
y = (slideHeight - scaledHeight) / 2

# 插入图片
rect = RectangleF(x, y, scaledWidth, scaledHeight)
pptImage = slide.Shapes.AppendEmbedImageByImageData(ShapeType.Rectangle, imageData, rect)
pptImage.Line.FillType = FillFormatType.none

# 保存演示文稿
presentation.SaveToFile("自定义幻灯片大小和图片位置.pptx", FileFormat.Pptx2013)
presentation.Dispose()

输出效果

图片被按比例缩放并居中显示,同时保持幻灯片的 16:9 宽屏比例,且图片与幻灯片边缘保持一定的边距。

2. 批量将多张 PNG 或 JPG 图片转换为 PPT 幻灯片

2.1 为每张图片生成单独的幻灯片

如果你有多张 PNG 或 JPG 图片(如产品照片或扫描文档页面),你可以批量将它们自动转换为 PPT,每张图片对应一张幻灯片,且每张幻灯片的尺寸自动与图片的尺寸匹配,确保图片保留原始比例。

代码示例

python 复制代码
import os
from spire.presentation import *

# 创建新的 PowerPoint 演示文稿
presentation = Presentation()

# 删除默认的幻灯片
presentation.Slides.RemoveAt(0)

# 定义图片文件夹路径
baseDir = r"C:\Users\Administrator\Downloads\Images"

# 获取文件夹中的所有图片文件
picFiles = [f for f in os.listdir(baseDir) if os.path.isfile(os.path.join(baseDir, f))]

# 遍历所有图片文件
for picFile in picFiles:
    # 添加新幻灯片
    slide = presentation.Slides.Append()

    # 加载图片
    imagePath = os.path.join(baseDir, picFile)
    stream = Stream(imagePath)
    imageData = presentation.Images.AppendStream(stream)
    stream.Close()

    # 设置幻灯片尺寸与图片尺寸匹配
    imageWidth = float(imageData.Width)
    imageHeight = float(imageData.Height)
    presentation.SlideSize.Type = SlideSizeType.Custom
    presentation.SlideSize.Size = SizeF(imageWidth, imageHeight)

    # 插入图片
    rect = RectangleF(0.0, 0.0, imageWidth, imageHeight)
    pptImage = slide.Shapes.AppendEmbedImageByImageData(ShapeType.Rectangle, imageData, rect)
    pptImage.Line.FillType = FillFormatType.none

# 保存演示文稿
presentation.SaveToFile("MultipleImagesToPPT.pptx", FileFormat.Pptx2013)
presentation.Dispose()

输出效果

最终生成的 PPT文件包含多个幻灯片,每张幻灯片显示一张图片。

2.2 自定义每页幻灯片中的图片数量

在实际使用场景中,你可能需要将多张图片添加到单个幻灯片中,以便高效地比较或展示图片数据。要实现这一点,我们可以将幻灯片划分为网格,然后将图片放置在相应的网格单元格中。

例如:

  • 每页 2 张图片:划分为一个简单的 1x2 网格(两张图片并排排列)。
  • 每页 4 张图片:划分为一个 2x2 网格(四张图片排列成两行两列)。
  • 每页 6 张图片:划分为一个 2x3 网格(六张图片排列成两行三列)。

根据每页要显示的图片数量,动态调整网格布局,这样可以确保图片均匀分布,布局整洁且一致。

代码示例

以下示例展示了如何将每个幻灯片划分为网格,并根据每页幻灯片的图片数量(例如 2张或4张)将图片放置到每个网格单元格中。图片会自动缩放以适应分配的单元格,并且幻灯片的布局会相应调整。

python 复制代码
import os
from spire.presentation import *

def add_images_to_slide(slide, image_files, images_per_slide, slide_width, slide_height, margin=20.0):
    """
    该函数根据指定的网格布局(例如每页 2 张、4 张或更多图片)将图片添加到幻灯片。
    """
    # 计算网格的行数和列数
    columns = int(images_per_slide ** 0.5)  # 列数(每页图片数量的平方根)
    rows = (images_per_slide + columns - 1) // columns  # 计算行数

    # 计算每个图片的宽度和高度
    cell_width = (slide_width - 2 * margin) / columns
    cell_height = (slide_height - 2 * margin) / rows

    # 遍历图片并将它们放置到网格中
    for i in range(images_per_slide):
        if i >= len(image_files):
            break  # 防止超出可用图片的数量

        # 加载图片
        image_path = os.path.join(baseDir, image_files[i])
        stream = Stream(image_path)
        image_data = presentation.Images.AppendStream(stream)
        stream.Close()

        # 获取图片的尺寸
        image_width = float(image_data.Width)
        image_height = float(image_data.Height)

        # 缩放图片以适应单元格
        scale = min(cell_width / image_width, cell_height / image_height)
        scaled_width = image_width * scale
        scaled_height = image_height * scale

        # 计算图片在网格中的位置(x, y)
        row = i // columns
        col = i % columns
        x = margin + col * cell_width + (cell_width - scaled_width) / 2  # 在单元格中水平居中
        y = margin + row * cell_height + (cell_height - scaled_height) / 2  # 在单元格中垂直居中

        # 插入图片
        rect = RectangleF(x, y, scaled_width, scaled_height)
        ppt_image = slide.Shapes.AppendEmbedImageByImageData(ShapeType.Rectangle, image_data, rect)
        ppt_image.Line.FillType = FillFormatType.none

# 创建一个新的演示文稿
presentation = Presentation()

# 删除默认幻灯片
presentation.Slides.RemoveAt(0)

# 定义图片文件夹路径
baseDir = r"C:\Users\Administrator\Downloads\Images"

# 获取文件夹中的所有文件
image_files = [f for f in os.listdir(baseDir) if os.path.isfile(os.path.join(baseDir, f))]

# 定义每页幻灯片中图片的数量(2、4、6 等)
images_per_slide = 4  # 可以根据需要调整此值为 2、4、6 等

# 遍历图片并将它们添加到幻灯片中
for i in range(0, len(image_files), images_per_slide):
    # 添加新的幻灯片
    slide = presentation.Slides.Append()

    # 获取本页幻灯片的图片
    add_images_to_slide(slide, image_files[i:i + images_per_slide], images_per_slide,
                        presentation.SlideSize.Size.Width, presentation.SlideSize.Size.Height)

# 保存演示文稿
presentation.SaveToFile("MultipleImagesPerSlide.pptx", FileFormat.Pptx2013)
presentation.Dispose()

输出效果:

生成的 PPT 幻灯片根据图片数量划分为相应的网格布局。每个网格中将放置一张图片,且图片自动缩放以适应网格尺寸:

关于行数和列数计算方法说明:

  1. 列数 (columns) 计算方法:
python 复制代码
columns = int(images_per_slide ** 0.5)

这里使用了平方根 images_per_slide ** 0.5,是因为如果每一列的数量相等,形成一个近似的正方形布局,平方根可以给出合适的列数。例如:

如果每张幻灯片有 4 张图片,sqrt(4) = 2,那么可以采用 2 列 2 行的布局。

如果有 6 张图片,sqrt(6) 约等于 2.45,所以 int(2.45) 将列数取为 2。

  1. 行数 (rows) 计算方法:
python 复制代码
rows = (images_per_slide + columns - 1) // columns

这行代码计算所需的行数。公式 (images_per_slide + columns - 1) // columns 之所以这样设计,是为了确保足够的行数:

images_per_slide 是总的图片数量。

columns 是已计算出的列数。

  • columns - 1 是为了向上取整,从而避免因整除导致图片数量不足的情况。例如:

如果有 6 张图片,columns 为 2,计算行数时:

rows = (6 + 2 - 1) // 2 = 7 // 2 = 3,实际上只需要 3 行来放置图片。

3. 将 SVG 图片转换为可编辑的PPT形状

与 PNG 和 JPG 等位图格式不同,SVG 文件是矢量图,因此它可以在不失真的情况下无限放大。在 PowerPoint 中,我们可以将 SVG 图片作为可编辑的形状插入,保留其清晰度并且能够随时进行修改(如组合、设置颜色、调整大小等)。

代码示例

python 复制代码
from spire.presentation import *

# 创建 PowerPoint 演示文稿对象
presentation = Presentation()

# 定义 SVG 文件路径
SvgFile = r"C:\Users\Administrator\Downloads\Images\Sample.svg"

# 将 SVG 文件插入为可编辑的 PowerPoint 形状
presentation.Slides[0].Shapes.AddFromSVGAsPicture(SvgFile)

# 保存演示文稿
presentation.SaveToFile("SVG转PPT.pptx", FileFormat.Pptx2013)
presentation.Dispose()

总结

本文详细介绍了如何使用 Python 将不同格式的图片,如 PNG、JPG 和 SVG, 批量转换为 PPT 幻灯片。文章涵盖了以下几个关键点:

  • 单张图片转换:将单张 PNG 或 JPG 图片转换为 PPT 幻灯片,保持图片原始大小,或自定义幻灯片的尺寸和图片位置。
  • 批量转换:批量将多张 PNG 或 JPG 图片转换为多个幻灯片,并根据需要调整每张幻灯片上图片的数量,例如按网格布局排列。
  • SVG 转换:将 SVG 文件转换为 PowerPoint 可编辑的图形,保留图片的高质量和可编辑性。

希望本文能帮助你更加高效地处理 PPT 中的图片插入任务,节省操作时间,提升工作效率。

感谢阅读,本文完结!

相关推荐
傲笑风4 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架4 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽8 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy9 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石0089 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王9 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子10 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步10 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
jayson.h10 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python
典典分享指南10 小时前
用飞书多维表格搭建内容管理看板
java·python·r语言·composer·symfony