从图片到PPT:用Python实现多图片格式(PNG/JPG/SVG)到幻灯片的批量转换
目录
引言
安装必要的库
1. 将单个 PNG 或 JPG 图片转换为 PPT 幻灯片
1.1 生成与图片尺寸匹配的幻灯片
1.2 自定义幻灯片大小和图片位置
2. 批量将多张 PNG 或 JPG 图片转换为 PPT 幻灯片
2.1 为每张图片生成单独的幻灯片
2.2 自定义每页幻灯片中的图片数量
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。
安装方法
在程序终端中运行以下命令,即可安装该库:
pip install Spire.Presentation
安装完成后,就可以使用该库提供的接口来实现各种图片转PPT需求了。
1. 将单个 PNG 或 JPG 图片转换为 PPT 幻灯片
1.1 生成与图片尺寸匹配的幻灯片
将图片转换为 PPT 幻灯片时,保持图片的原始分辨率和比例非常重要。为了避免图片被拉伸或失真,我们可以通过设置幻灯片的尺寸与图片尺寸一致来实现这一点。
代码示例:
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 比例),而不是完全匹配图片的尺寸。这种方法有助于保持演示文稿的统一风格。同时你还可以控制图片的位置,例如,将图片居中或放在指定的边距内。
以下示例展示了如何:
- 设置固定的幻灯片大小
- 在图片周围添加边距
- 将图片居中显示
代码示例:
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,每张图片对应一张幻灯片,且每张幻灯片的尺寸自动与图片的尺寸匹配,确保图片保留原始比例。
代码示例:
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.Custompresentation.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张)将图片放置到每个网格单元格中。图片会自动缩放以适应分配的单元格,并且幻灯片的布局会相应调整。
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) / columnscell_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 * scalescaled_height = image_height * scale# 计算图片在网格中的位置(x, y)row = i // columnscol = i % columnsx = 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) 计算方法:
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。
2. 行数 (rows) 计算方法:
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 图片作为可编辑的形状插入,保留其清晰度并且能够随时进行修改(如组合、设置颜色、调整大小等)。
代码示例:
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 中的图片插入任务,节省操作时间,提升工作效率。
感谢阅读,本文完结!
