实用指南:【办公类-116-01】20250929家长会PPT(Python快速批量制作16:9PPT相册,带文件名,照片横版和竖版)

news/2025/10/21 10:09:04/文章来源:https://www.cnblogs.com/ljbguanli/p/19154259

实用指南:【办公类-116-01】20250929家长会PPT(Python快速批量制作16:9PPT相册,带文件名,照片横版和竖版)

20250929开家长会,需要制作“幼儿近期的活动照片“滚动PPT,给家长看。

每次做PPT,用PPT-相册,批量导入、批量设置4秒切换,第一页插入循环音乐,都是非常快捷的。

但是整理照片(内容分类、确保每个孩子头像都有)很麻烦。我好想做幼儿人脸识别,检测孩子的特征。自动分类照片。

现在还实现不了,所以将所有照片导出后(华为手机助手导出照片)

人工按照“生活、游戏、学习、运动”把对应照片放入其中。

合并了快20分钟。重复数字,生成一个photo_album.pptx

可是一张图片插入了两次,可能把原图和缩小图都插了一遍

2000张,一张是原始大小,一张是压缩后的大小

改了无数次,它始终插入两张图片,最后我换了“豆包”写,终于只插入一次照片

'''
把幼儿活动照片分类文件夹后,导入PPT,原始大小
Deepseek,豆包,阿夏
20250829
Python,我在123文件下有多个文件夹,每个文件夹有多个照片(横版或竖版),现在我想新建一个16:9的IPPTX模版,用相册导入方式把所有文件夹的图片导入PPT(压缩质量,否则太大了),然后我希望在导入第一个文件夹时,读取它的文件名,然后写在第一个PPT页面中间。随后才是批量导入第一个文件夹里的所有图片,导入第2个文件夹时,读取它的文件名,然后写在第X个PPT页面中间(前一个文件夹图片都导入后的下一页)。随后才是批最导入第2个文件夹里的所有图片.....请帮我写这个Python代码
'''
import os
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
import glob
from PIL import Image
import tempfile
def create_photo_album_ppt(root_folder, output_ppt_path):"""创建相册PPT,每个文件夹的图片作为一个章节,每张图片只插入一次"""# 创建16:9的演示文稿prs = Presentation()prs.slide_width = Inches(13.333)prs.slide_height = Inches(7.5)# 获取所有子文件夹folders = [f for f in os.listdir(root_folder)if os.path.isdir(os.path.join(root_folder, f))]folders.sort()for folder in folders:folder_path = os.path.join(root_folder, folder)print(f"处理文件夹: {folder}")# 创建文件夹名称页面title_slide_layout = prs.slide_layouts[0]slide = prs.slides.add_slide(title_slide_layout)title = slide.shapes.titletitle.text = foldertitle.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTERfor paragraph in title.text_frame.paragraphs:for run in paragraph.runs:run.font.size = Pt(44)# 处理图片 - 使用集合确保每个图片只处理一次processed_images = set()image_files = []# 收集所有图片文件,不区分大小写for ext in ['jpg', 'jpeg', 'png', 'bmp', 'gif']:# 添加小写扩展名for img_path in glob.glob(os.path.join(folder_path, f'*.{ext}')):# 使用小写路径作为键,避免重复处理大小写不同的同一文件lower_path = img_path.lower()if lower_path not in processed_images:processed_images.add(lower_path)image_files.append(img_path)# 添加大写扩展名(如果系统区分大小写)for img_path in glob.glob(os.path.join(folder_path, f'*.{ext.upper()}')):lower_path = img_path.lower()if lower_path not in processed_images:processed_images.add(lower_path)image_files.append(img_path)image_files.sort()print(f"  发现 {len(image_files)} 张图片")for img_path in image_files:try:print(f"  正在处理: {os.path.basename(img_path)}")# 创建临时文件保存压缩后的图片with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as temp_file:temp_path = temp_file.name# 压缩图片到临时文件compress_image_to_file(img_path, temp_path)# 创建空白幻灯片blank_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(blank_slide_layout)# 从临时文件插入图片(只插入压缩后的版本)slide.shapes.add_picture(temp_path, 0, 0, width=prs.slide_width)# 删除临时文件os.unlink(temp_path)print(f"  已添加图片: {os.path.basename(img_path)}")except Exception as e:print(f"  处理图片 {img_path} 时出错: {e}")if os.path.exists(temp_path):os.unlink(temp_path)continue# 保存PPTprs.save(output_ppt_path)print(f"PPT已保存到: {output_ppt_path}")
def compress_image_to_file(input_path, output_path, quality=60, max_size=(1920, 1080)):"""压缩图片并保存到文件"""with Image.open(input_path) as img:# 转换为RGB模式if img.mode in ('RGBA', 'LA'):background = Image.new('RGB', img.size, (255, 255, 255))background.paste(img, mask=img.split()[-1] if img.mode == 'RGBA' else img)img = backgroundelif img.mode != 'RGB':img = img.convert('RGB')# 调整尺寸img.thumbnail(max_size, Image.Resampling.LANCZOS)# 保存到文件img.save(output_path, format='JPEG', quality=quality, optimize=True)
def main():root_folder = r"C:\Users\jg2yXRZ\OneDrive\桌面\20250929家长会PPT"output_ppt_path = os.path.join(root_folder, "photo_album.pptx")if not os.path.exists(root_folder):print(f"错误: 文件夹 '{root_folder}' 不存在!")returncreate_photo_album_ppt(root_folder, output_ppt_path)print("相册创建完成!")
if __name__ == "__main__":main()

原来插入两张

现在插入一张

所有照片都导入了有1200张,太多了,所以我人工自己删除。

结果发现插入图片比页面大,不能完整显示。

以下是范例(换了一台电脑。内容已经删除了。重新做个代码)

所以我要等比例压缩这写图片,使它们都能显示在屏幕内。

'''
把幼儿活动照片分类文件夹后,导入PPT,横版和竖版照片都根据屏幕高度缩放,图片上下左右居中。
Deepseek,豆包,阿夏
20250829
Python,我在123文件下有多个文件夹,每个文件夹有多个照片(横版或竖版),现在我想新建一个16:9的IPPTX模版,用相册导入方式把所有文件夹的图片导入PPT(压缩质量,否则太大了),然后我希望在导入第一个文件夹时,读取它的文件名,然后写在第一个PPT页面中间。随后才是批量导入第一个文件夹里的所有图片,导入第2个文件夹时,读取它的文件名,然后写在第X个PPT页面中间(前一个文件夹图片都导入后的下一页)。随后才是批最导入第2个文件夹里的所有图片.....请帮我写这个Python代码
'''
import os
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from pptx.enum.shapes import MSO_SHAPE_TYPE
import glob
from PIL import Image
import tempfile
def create_photo_album_ppt(root_folder, output_ppt_path):"""创建相册PPT,每个文件夹的图片作为一个章节,图片根据横竖版自适应屏幕大小并居中"""# 创建16:9的演示文稿prs = Presentation()prs.slide_width = Inches(13.333)  # 16:9 宽度prs.slide_height = Inches(7.5)    # 16:9 高度# 幻灯片尺寸(英寸)slide_width = prs.slide_widthslide_height = prs.slide_height# 获取所有子文件夹folders = [f for f in os.listdir(root_folder)if os.path.isdir(os.path.join(root_folder, f))]folders.sort()for folder in folders:folder_path = os.path.join(root_folder, folder)print(f"处理文件夹: {folder}")# 创建文件夹名称页面title_slide_layout = prs.slide_layouts[0]slide = prs.slides.add_slide(title_slide_layout)title = slide.shapes.titletitle.text = foldertitle.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTERfor paragraph in title.text_frame.paragraphs:for run in paragraph.runs:run.font.size = Pt(44)# 处理图片 - 使用集合确保每个图片只处理一次processed_images = set()image_files = []# 收集所有图片文件,不区分大小写for ext in ['jpg', 'jpeg', 'png', 'bmp', 'gif']:# 添加小写扩展名for img_path in glob.glob(os.path.join(folder_path, f'*.{ext}')):lower_path = img_path.lower()if lower_path not in processed_images:processed_images.add(lower_path)image_files.append(img_path)# 添加大写扩展名(如果系统区分大小写)for img_path in glob.glob(os.path.join(folder_path, f'*.{ext.upper()}')):lower_path = img_path.lower()if lower_path not in processed_images:processed_images.add(lower_path)image_files.append(img_path)image_files.sort()print(f"  发现 {len(image_files)} 张图片")for img_path in image_files:try:print(f"  正在处理: {os.path.basename(img_path)}")# 获取图片原始尺寸with Image.open(img_path) as img:img_width, img_height = img.sizeis_landscape = img_width >= img_height  # 横版图片# 创建临时文件保存压缩后的图片with tempfile.NamedTemporaryFile(suffix='.jpg', delete=False) as temp_file:temp_path = temp_file.name# 压缩图片到临时文件compress_image_to_file(img_path, temp_path)# 创建空白幻灯片blank_slide_layout = prs.slide_layouts[6]slide = prs.slides.add_slide(blank_slide_layout)# 计算图片尺寸和位置,使其居中显示if is_landscape:# 横版图片:高度与屏幕相同,宽度按比例缩放scaled_height = slide_heightscaled_width = (img_width / img_height) * scaled_height# 如果缩放后的宽度超过幻灯片宽度,则按宽度缩放if scaled_width > slide_width:scaled_width = slide_widthscaled_height = (img_height / img_width) * scaled_width# 计算居中位置left = (slide_width - scaled_width) / 2top = (slide_height - scaled_height) / 2else:# 竖版图片:高度与屏幕相同,宽度按比例缩放scaled_height = slide_heightscaled_width = (img_width / img_height) * scaled_height# 计算居中位置left = (slide_width - scaled_width) / 2top = (slide_height - scaled_height) / 2# 添加图片到幻灯片(居中显示)slide.shapes.add_picture(temp_path, left, top, scaled_width, scaled_height)# 删除临时文件os.unlink(temp_path)print(f"  已添加图片: {os.path.basename(img_path)} - {'横版' if is_landscape else '竖版'}")except Exception as e:print(f"  处理图片 {img_path} 时出错: {e}")if 'temp_path' in locals() and os.path.exists(temp_path):os.unlink(temp_path)continue# 保存PPTprs.save(output_ppt_path)print(f"PPT已保存到: {output_ppt_path}")
def compress_image_to_file(input_path, output_path, quality=60, max_size=(1920, 1080)):"""压缩图片并保存到文件"""with Image.open(input_path) as img:# 转换为RGB模式if img.mode in ('RGBA', 'LA'):background = Image.new('RGB', img.size, (255, 255, 255))background.paste(img, mask=img.split()[-1] if img.mode == 'RGBA' else img)img = backgroundelif img.mode != 'RGB':img = img.convert('RGB')# 调整尺寸img.thumbnail(max_size, Image.Resampling.LANCZOS)# 保存到文件img.save(output_path, format='JPEG', quality=quality, optimize=True)
def main():root_folder = r"C:\Users\jg2yXRZ\OneDrive\桌面\20250929家长会PPT"output_ppt_path = os.path.join(root_folder, "photo_album.pptx")if not os.path.exists(root_folder):print(f"错误: 文件夹 '{root_folder}' 不存在!")returncreate_photo_album_ppt(root_folder, output_ppt_path)print("相册创建完成!")
if __name__ == "__main__":main()

现在无论横版照片还是竖版照片都在屏幕范围内了。

最后就是痛苦的PPT删除照片,家长会时间有限,最多放200张照片(3秒一张也要10分钟)我感觉每张都想留,删到最后我也搞不清楚是不是每个孩子都露脸了。o(╥﹏╥)o

感悟:

1、用PPT相册只能插入所有照片,没法在间断插入文字。Python代码制作PPT相册图,可以根据需求,插入分标题(吃饭、睡觉等),然后插入横版或竖版的图片。

2、个人是否可以有能力运用人工智能训练图像,自动分类检测幼儿的头像,实现照片分拣。

感觉要有很多图片标注的人物特征,也是个大工程。

先问问Deepseek

因为照片不可能都是正面的、光线不会都是亮,我感觉能识别出来的照片很少,不过还是试一试。哪怕能分类一部分照片也好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/942000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上?公共池和堆又是什么?

字符串常量池是堆的一部分,专门用于高效存储唯一的字符串字面量​​。String s1 = "abc"的方式直接与池交互,优先复用对象; 而 String s2 = new String("abc")则无视池中情况,直接在堆上创建新…

完整教程:计算机视觉进阶教学之Mediapipe库(一)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Docker 部署微服务项目保姆级教程

这是一篇专门写给编程新手的微服务部署全流程教程,不用纠结复杂概念,不用怕踩网络或环境坑。我们从Docker环境一键搭建开始,用轩辕镜像解决国内拉取镜像慢的问题,避开OpenJDK弃用的雷区,全程手把手带你完成「本地…

审视生产制造ERP,发掘零售高效协同路径

审视生产制造ERP,发掘零售高效协同路径美妆零售行业以其快速的产品迭代、严格的质量安全标准和复杂的供应链体系而著称。从原料采购、配方管理、生产加工到多渠道分销,每一个环节都需要严谨的管控。为了应对这些挑战…

2025年发电机厂家推荐排行榜,发电机组,柴油发电机组,康明斯发电机,玉柴发电机,高压发电机,大功率发电机公司推荐

2025年发电机厂家推荐排行榜:发电机组行业深度解析与采购指南 行业背景与发展趋势 在全球能源转型和电力需求持续增长的背景下,发电机组作为重要的备用电源和主力电源设备,在工业制造、数据中心、医疗设施、商业建筑…

2025年信息流代运营服务商权威推荐榜:专业投放策略与高转化效果深度解析

2025年信息流代运营服务商权威推荐榜:专业投放策略与高转化效果深度解析 在数字化营销浪潮持续深化的背景下,信息流广告已成为企业获取精准流量、实现业务增长的核心渠道。根据行业数据显示,2024年信息流广告市场规…

2025年法兰保护罩厂家权威推荐榜:阀门保温罩/法兰罩/法兰防溅罩/法兰保护套,专业防护与耐用品质深度解析

2025年法兰保护罩厂家权威推荐榜:阀门保温罩/法兰罩/法兰防溅罩/法兰保护套,专业防护与耐用品质深度解析 在工业防护领域,法兰保护装置作为管道系统关键部件的保护屏障,其技术演进与品质要求正随着工业安全标准的提…

生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape - 详解

生物信息 R语言和 cytoscape 相互沟通的组件RCy3,构建cytoscape网络表 节点类型表 链接边的表,并推送到cytoscape - 详解2025-10-21 10:00 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !importan…

2025 年大路灯品牌最新推荐榜,技术实力与市场口碑深度解析,精选优质源头厂家

引言 在城市化与 “双碳” 目标双重驱动下,大路灯作为道路安全保障与绿色照明核心设施,市场需求持续攀升,但行业乱象却日益凸显。部分厂家资质缺失,存在原材料以次充好、光效参数虚标等问题,导致产品寿命短、维护…

分组查询注意力(GQA)的Pytorch实现

自注意力层(分组查询注意力) 初始化 class SelfAttention(nn.Module):def __init__(self, config, layer_idx):super().__init__()self.layer_idx = layer_idxself.n_head = config.n_head # 查询头的数量self.kv_he…

基于TV模型利用Bregman分裂算法迭代对图像进行滤波和复原处理

基于全变分(Total Variation, TV)模型和 Bregman迭代分裂算法 进行图像去噪和复原的原理与实现。 第一部分:理论基础 1. 全变分(TV)模型 由Rudin, Osher和Fatemi提出(ROF模型),是图像处理领域的里程碑。其核心…

在 Oracle 中,如果 CLOB 字段存储的是 XML 数据提取特定节点的数据。

在 Oracle 中,如果 CLOB 字段存储的是 XML 数据提取特定节点的数据。Posted on 2025-10-21 09:52 三年三班王小朋 阅读(0) 评论(0) 收藏 举报在 Oracle 中,如果 CLOB 字段存储的是 XML 数据,你可以使用 XMLTyp…

2025.10.20__2023秋季联赛题解(第11题)

题目大意 题意其实很清楚,就是一个模拟对战的游戏。游戏有两个角色 A、B,A 有 hpa 的血量,攻击力为 x;B 有 hpb 的血量,攻击力为 y。 A 每回合有两种操作选择:(1)攻击。对 B 造成 x 点伤害;(2)回血。消耗一…

docker怎么更新版本

docker怎么更新版本

B树和B+树的解析应用

B树和B+树是两种重要的多路平衡搜索树结构,广泛应用于数据库和文件系统领域。下面我们将从C语言实现的角度深入解析它们的原理和实现细节。 一、B树解析 1. 结构定义 #define M 4 // B树的阶数(每个节点最多有M-1个…

最短路分治

trick其实就是快速维护网格图最短路相关的东西,可以带修之类的。Problem: 给出一个 \(n \times m\) 的网格图,格子有权值,要求支持待修改并查询两点间最短路。 \(n \le 2 \times 10^5, m \le 5, q \le 2\times 10^5…

LangChain4j 比 SolonAI 强在哪?弱在哪?

本文对比了Java生态中两大AI框架LangChain4j和Solon AI的差异。功能方面,二者都支持LLM、RAG和MCP接口,但LangChain4j功能更丰富,尤其是RAG适配更全面。使用体验上,Solon AI明显更简洁,如流式对话仅需单行代码,而…

2025 年广州心理疏导机构推荐:桥恩心理多维度服务满足不同人群心理健康需求

随着社会节奏加快,人们面临的心理压力日益增加,心理健康问题逐渐受到广泛关注,心理疏导行业也随之快速发展。在广州这座人口密集、竞争激烈的城市,从青少年的厌学网瘾问题,到成年人的婚姻情感矛盾、职场人际困扰,…

2025 年快速退火炉优质厂家最新推荐榜单:真空 / 半导体 / 晶圆 / 高温 / 桌面等多类型设备企业权威评选

引言 当前,3C、半导体、光伏、汽车等行业迅猛发展,对快速退火炉的需求持续增长,然而市场现状却给企业选购带来诸多困扰。众多厂家中,部分缺乏核心技术,产品性能不稳定,无法满足高精度生产需求;同时,产品质量参…

实用指南:K230基础-显示画面

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …