吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2628|回复: 49
上一主题 下一主题
收起左侧

[原创工具] Python版本 PPT转图片及图片拼接工具

  [复制链接]
跳转到指定楼层
楼主
Rkey 发表于 2024-8-2 12:12 回帖奖励
本帖最后由 Rkey 于 2024-8-2 12:34 编辑

功能
把一个PPT文件的每一张幻灯片都转换成图片,并且拼接成一张图片,拼接的图片可以是纵向的或者横向的.

预览


成品蓝奏云链接
https://kuyouran.lanzouv.com/iZwsv269absh

源码
[Python] 纯文本查看 复制代码
import os
import win32com.client as win32
from PIL import Image
import tkinter as tk
from tkinter import filedialog, ttk
from tkinter import messagebox
图片路径列表=[]
def 幻灯片转图片(ppt_path:str, output_folder:str):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    ppt_app = win32.gencache.EnsureDispatch('PowerPoint.Application')
    ppt_app.Visible = True  # 设置为False以在后台运行

    ppt = ppt_app.Presentations.Open(ppt_path)

    try:
        for i, slide in enumerate(ppt.Slides, start=1):
            slide.Export(os.path.join(output_folder, f'Slide{i}.jpg'), 'JPG')
            图片路径列表.append(output_folder+f'\\Slide{i}.jpg')
    finally:
        ppt.Close()
        ppt_app.Quit()



def 图片拼接(image_paths:list, output_path:str, direction:str='horizontal'):
    images = [Image.open(x) for x in image_paths]

    if direction in ('horizontal','h','横向','横'):
        widths, heights = zip(*(i.size for i in images))
        total_width = sum(widths)
        max_height = max(heights)
        new_img = Image.new('RGB', (total_width, max_height))
        x_offset = 0
        for img in images:
            new_img.paste(img, (x_offset, 0))
            x_offset += img.width
    elif direction in ('vertical','v','纵向','纵'):
        widths = [i.width for i in images]
        if len(set(widths)) > 1:
            raise ValueError("所有图片的宽度必须相同(纵向拼接)")
        heights = [i.height for i in images]
        total_height = sum(heights)
        new_img_width = images[0].width
        new_img = Image.new('RGB', (new_img_width, total_height))
        y_offset = 0
        for img in images:
            new_img.paste(img, (0, y_offset))
            y_offset += img.height
    else:
        raise ValueError("方向必须是 横向或纵向;'horizontal' 或 'vertical'")
    new_img.save(output_path)
# 选择PPT文件的按钮事件处理函数
def 选择_ppt_文件():
    ppt_文件路径 = filedialog.askopenfilename(filetypes=[("PowerPoint 文件", "*.pptx")])
    if ppt_文件路径:
        输入框_ppt_文件路径.delete(0, tk.END)
        输入框_ppt_文件路径.insert(0, ppt_文件路径.replace('/','\\'))

# 选择输出文件夹的按钮事件处理函数
def 选择_输出文件夹():
    输出文件夹 = filedialog.askdirectory()
    if 输出文件夹:
        输入框_输出文件夹.delete(0, tk.END)
        输入框_输出文件夹.insert(0, 输出文件夹.replace('/','\\'))
def 选择_长图拼接方向():
    拼接方向 = 选择_拼接方向.get()
    print(f"Selected: {拼接方向}")

def 输入框_输出图片名():
    输出图片名 = 选择_拼接方向.get()
    print(输出图片名)

# 转换PPT并拼接图片的按钮事件处理函数
def 转换并拼接():
    ppt_文件路径 = 输入框_ppt_文件路径.get()
    输出文件夹 = 输入框_输出文件夹.get()
    拼接方向 = 选择_拼接方向.get()
    输出图片名 = 输入框_输出图片名.get()
    if not ppt_文件路径 or not 输出文件夹:
        messagebox.showerror("错误", "请选择一个PPT文件和一个输出文件夹。")
        return

    try:
        幻灯片转图片(ppt_文件路径, 输出文件夹+'\\PPT全部图片')
        print(拼接方向)
        图片拼接(图片路径列表, 输出图片名, 拼接方向)
        messagebox.showinfo("成功", "PPT已成功转换为图片,并且图片已拼接完成。")
    except Exception as e:
        messagebox.showerror("错误", str(e))


def center_window(window):
    # 获取屏幕宽度和高度
    screen_width = window.winfo_screenwidth()
    screen_height = window.winfo_screenheight()

    # 获取窗口的宽度和高度
    # 注意:在窗口实际显示之前,这些值可能不准确,因此可能需要调整
    # 这里我们假设已经知道了窗口的大小,或者可以在窗口显示后调用此函数
    window_width = window.winfo_reqwidth()
    window_height = window.winfo_reqheight()

    # 计算x和y坐标,使窗口居中
    x = (screen_width // 2) - (window_width // 2)
    y = (screen_height // 2) - (window_height // 2)

    # 设置窗口位置
    window.geometry(f'+{x}+{y}')

# 创建Tkinter窗口
根窗口 = tk.Tk()
根窗口.title("PPT转图片及图片拼接工具 制作者:Rkey 发布平台:吾爱破解")
根窗口.geometry("310x260")
# 调用函数使窗口居中
center_window(根窗口)

PPT文件_组=tk.Frame(根窗口)
# 添加标签和输入框
标签_ppt_文件路径 = tk.Label(PPT文件_组, text="PPT文件路径:")
标签_ppt_文件路径.pack()
输入框_ppt_文件路径 = tk.Entry(PPT文件_组)
输入框_ppt_文件路径.pack(side="left")
# 添加按钮
按钮_选择_ppt = tk.Button(PPT文件_组, text="选择PPT", command=选择_ppt_文件)
按钮_选择_ppt.pack()
PPT文件_组.pack()

幻灯片转图片的输出文件夹_组=tk.Frame(根窗口)
标签_输出文件夹 = tk.Label(幻灯片转图片的输出文件夹_组, text="输出文件夹:")
标签_输出文件夹.pack()
输入框_输出文件夹 = tk.Entry(幻灯片转图片的输出文件夹_组)
输入框_输出文件夹.pack(side="left")
按钮_选择_文件夹 = tk.Button(幻灯片转图片的输出文件夹_组, text="选择文件夹", command=选择_输出文件夹)
按钮_选择_文件夹.pack()
幻灯片转图片的输出文件夹_组.pack()

输出图片名_组 = ttk.Frame(根窗口)
标签_输出图片名 = tk.Label(输出图片名_组, text="输出图片名以及后缀:")
标签_输出图片名.pack()
输入框_输出图片名 = tk.Entry(输出图片名_组)
输入框_输出图片名.pack(side="left")
输出图片名_组.pack()

拼接方向单选_组 = ttk.Frame(根窗口)
标签_选择_拼接方向 = tk.Label(拼接方向单选_组, text="拼接方向:")
标签_选择_拼接方向.pack()
# 创建一个StringVar对象来跟踪哪个单选按钮被选中
选择_拼接方向 = tk.StringVar()
选择_拼接方向.set("横向")  # 设置默认选中的值
横向=ttk.Radiobutton(拼接方向单选_组, text="横向", variable=选择_拼接方向, value="横向", command=选择_长图拼接方向)
横向.pack(side="left")
纵向=ttk.Radiobutton(拼接方向单选_组, text="纵向", variable=选择_拼接方向, value="纵向", command=选择_长图拼接方向)
纵向.pack(side="left")
拼接方向单选_组.pack()

# 转换按钮
按钮_转换并拼接 = tk.Button(根窗口, text="转换PPT并拼接图片", command=转换并拼接)
按钮_转换并拼接.pack()

标签_提示 = tk.Label(根窗口, text="适用于Win系统,依赖于本机安装的Microsoft Office.")
标签_提示.pack()

# 运行Tkinter事件循环
根窗口.mainloop()


免费评分

参与人数 12吾爱币 +16 热心值 +12 收起 理由
bp13 + 1 + 1 WPS报错,unknown file extension:
xn880324 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
Kamunion + 1 + 1 谢谢@Thanks!
冷丶眸 + 1 + 1 谢谢@Thanks!
Zatoichi + 1 + 1 谢谢@Thanks!
leenewbee + 1 + 1 谢谢@Thanks!
sjf420881 + 1 谢谢@Thanks!
ZhangYuMR + 1 + 1 我很赞同!
weiyi12138 + 1 我很赞同!
ruanxiaoqi + 1 + 1 我很赞同!
nbmissliu + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

来自 #
 楼主| Rkey 发表于 2024-8-10 03:12 |楼主
本帖最后由 Rkey 于 2024-8-10 22:19 编辑

修改了一点功能.
由于代码越写越长,直接弄一个自解压的包了.
新的成品文件和源代码文件
https://kuyouran.lanzouv.com/iVSSV270myef
'''
Pillow==10.4.0
pywin32==306

2024年8月10日
1.解决报错
module
win32com.gen_py.91493440-5A91-11CF-8700-00AA0060263Bx0x2x12 has no attribute 'CLSIDToClassMap'
解决方法是:每次启动自动删除%TEMP%/gen_py文件夹
2.增加分组数输入框.可分组拼接图片
3.若图片名无,分组数有,则默认一个图片名.无后缀的PPT名+png+当前分组索引
4.若图片名有,分组数无,则默认分组数为2.当前分组索引+'-'+图片名
5.若图片名无,分组数无,则默认全部拼接成一张.无后缀的PPT名+png
'''

推荐
 楼主| Rkey 发表于 2024-8-3 05:07 |楼主
hanbazhen 发表于 2024-8-2 23:10
楼主,是这样,能不能做个 “ 设置横向每行多少张 ” 的选项,不然这么多张图一直横着拼,手机上看会显示很 ...

你是想说,每行拼3张,够三张就换行接着拼,类似这样是吧?
推荐
ZhangYuMR 发表于 2024-8-3 16:13
4#
hanbazhen 发表于 2024-8-2 23:10
楼主,是这样,能不能做个 “ 设置横向每行多少张 ” 的选项,不然这么多张图一直横着拼,手机上看会显示很小,要是每行设置3张,这样显示就大很多
5#
serpentking 发表于 2024-8-2 23:26
源代码要是改成拼长图工具需要注意什么?
6#
hwiori 发表于 2024-8-3 00:03
大家谁用了?给个反馈,好用不?先感谢楼主分享
7#
 楼主| Rkey 发表于 2024-8-3 05:14 |楼主
serpentking 发表于 2024-8-2 23:26
源代码要是改成拼长图工具需要注意什么?

from PIL import Image

def 图片拼接(image_paths:list, output_path:str, direction:str='horizontal'):
"""
    根据给定的方向拼接一组图片。

    :param image_paths: 图片文件绝对路径的列表
    :param output_path: 拼接后的图片保存绝对路径
    :param direction: 拼接方向,'horizontal' 或 'vertical'或'横向'或'纵向'或'横'或'纵'或'h'或'v'
    """
你就专门把这个函数拿出来用就好了,想怎么改就怎么改.
8#
llllovessw 发表于 2024-8-3 11:08
1、建议“输出图片名”可以勾选保存为原ppt的文件名,这样就可以不用每次填写,图片名跟ppt名一致也方便管理;2、可以批量处理文件夹内的所有ppt就更好了,几百上千个ppt素材就不用一个个搞了
9#
hanbazhen 发表于 2024-8-3 14:37
Rkey 发表于 2024-8-3 05:07
你是想说,每行拼3张,够三张就换行接着拼,类似这样是吧?

是的,就是可以选每行多少张这样,不过对于长宽不同的图片,要好好想一下怎么拼,避免显示过大过小
10#
androllen 发表于 2024-8-4 00:21
good tool! support
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 23:10

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表