图片批量PPT工具制作演示

联启 电脑工具 13

本文目录导读:

图片批量PPT工具制作演示-第1张图片-电脑手机工具软件下载 - 免费实用工具合集 | 联启科技

  1. 核心逻辑设计 (思维导图)
  2. 浏览器演示版 (HTML代码)
  3. 如何使用这个演示工具
  4. 如果需要更专业的桌面软件

这是一个很实用的工具需求,由于我无法直接为您生成一个可执行文件(.exe)或提供现成的软件代码下载,但我可以为您提供完整的思维导图、设计逻辑、以及一个可以直接在浏览器中运行的HTML/JavaScript演示版

您可以将这个演示版保存为 .html 文件,在浏览器中打开,即可体验“图片批量生成PPT”的核心逻辑。

核心逻辑设计 (思维导图)

图片批量生成PPT工具
├── 1. 输入层
│   ├── 图片导入 (支持 jpg/png/webp)
│   ├── 排序功能 (拖拽或文件名排序)
│   └── 模板选择 (固定版式: 全屏/留白/标题+图片)
├── 2. 处理层
│   ├── 图片裁剪/压缩 (统一宽高比)
│   ├── 文本覆盖 (可选项: 文件名/页码)
│   └── 幻灯片生成引擎
├── 3. 输出层
│   ├── 预览模式 (翻页查看)
│   ├── 导出为 PPTX (使用 PptxGenJS 库)
│   └── 导出为 PDF (打印/另存为)
└── 4. 辅助功能
    ├── 一键全选/反选
    └── 批量重命名

浏览器演示版 (HTML代码)

您可以将以下代码复制到一个新建的 index.html 文件中,用浏览器打开即可使用。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">批量图片 -> PPT 生成器 (演示版)</title>
    <!-- 引入 PptxGenJS 用于导出 .pptx -->
    <script src="https://cdn.jsdelivr.net/npm/pptxgenjs@3.12.0/dist/pptxgen.bundle.js">
    </script>
    <style>
        * {
            box-sizing: border-box;
            margin: 0;
            padding: 0;
        }
        body {
            font-family: 'Segoe UI', Roboto, sans-serif;
            background: #f0f2f5;
            padding: 20px;
        }
        .container {
            max-width: 1200px;
            margin: 0 auto;
        }
        h1 {
            font-size: 1.8rem;
            margin-bottom: 20px;
            color: #2c3e50;
        }
        .card {
            background: white;
            border-radius: 8px;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
            padding: 24px;
            margin-bottom: 20px;
        }
        .upload-area {
            border: 2px dashed #b0bec5;
            border-radius: 8px;
            padding: 40px;
            text-align: center;
            color: #78909c;
            transition: 0.2s;
            cursor: pointer;
            margin-bottom: 16px;
        }
        .upload-area:hover {
            border-color: #1976d2;
            background: #e3f2fd;
        }
        .upload-area input {
            display: none;
        }
        .grid {
            display: grid;
            grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
            gap: 12px;
            margin: 16px 0;
            max-height: 400px;
            overflow-y: auto;
            padding: 8px;
            border: 1px solid #e0e0e0;
            border-radius: 4px;
        }
        .grid-item {
            position: relative;
            border-radius: 4px;
            overflow: hidden;
            aspect-ratio: 16/9;
            background: #fafafa;
            border: 1px solid #ddd;
        }
        .grid-item img {
            width: 100%;
            height: 100%;
            object-fit: cover;
            display: block;
        }
        .grid-item .order-badge {
            position: absolute;
            top: 4px;
            left: 4px;
            background: rgba(0, 0, 0, 0.7);
            color: white;
            font-size: 12px;
            padding: 2px 6px;
            border-radius: 4px;
        }
        .controls {
            display: flex;
            gap: 12px;
            flex-wrap: wrap;
            align-items: center;
        }
        button {
            background: #1976d2;
            color: white;
            border: none;
            padding: 10px 18px;
            border-radius: 6px;
            font-size: 15px;
            cursor: pointer;
            transition: 0.15s;
            font-weight: 500;
        }
        button:hover {
            background: #1565c0;
            transform: scale(1.02);
        }
        button:active {
            transform: scale(0.98);
        }
        button.secondary {
            background: #546e7a;
        }
        button.secondary:hover {
            background: #455a64;
        }
        button.danger {
            background: #d32f2f;
        }
        button.danger:hover {
            background: #b71c1c;
        }
        #previewArea {
            margin-top: 16px;
            background: #263238;
            border-radius: 8px;
            padding: 20px;
            position: relative;
            min-height: 280px;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        #previewArea img {
            max-width: 100%;
            max-height: 400px;
            border-radius: 4px;
            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
        }
        #previewArea .placeholder {
            color: #90a4ae;
            font-size: 18px;
        }
        .preview-nav {
            display: flex;
            justify-content: center;
            gap: 16px;
            margin-top: 12px;
            align-items: center;
            color: #eceff1;
        }
        .preview-nav span {
            min-width: 60px;
            text-align: center;
        }
        .footer {
            margin-top: 20px;
            font-size: 14px;
            color: #78909c;
            text-align: center;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🖼️ 批量图片 → PPT生成器 (演示版)</h1>
        <!-- 上传区 -->
        <div class="card">
            <div class="upload-area" id="dropZone">
                <p style="font-size: 20px; margin-bottom: 8px;">📁 点击上传或拖拽图片到这里</p>
                <p style="font-size: 14px;">支持 JPG / PNG / WEBP</p>
                <input type="file" id="fileInput" accept="image/*" multiple>
            </div>
            <!-- 图片列表预览 -->
            <div id="imageGrid" class="grid"></div>
            <!-- 控制按钮 -->
            <div class="controls">
                <button id="clearBtn" class="secondary">🗑️ 清空图片</button>
                <button id="exportPptBtn">📊 导出为 PPTX</button>
                <button id="exportPdfBtn" class="secondary">📄 打印/导出PDF</button>
                <span style="margin-left: auto; color: #546e7a;">
                    <span id="imageCount">0</span> 张图片
                </span>
            </div>
        </div>
        <!-- 预览区 -->
        <div class="card">
            <h3 style="margin-bottom: 12px;">👁️ 幻灯片预览</h3>
            <div id="previewArea">
                <span class="placeholder">上传图片后即可预览</span>
            </div>
            <div class="preview-nav">
                <button id="prevBtn" class="secondary">◀</button>
                <span id="pageIndicator">0 / 0</span>
                <button id="nextBtn" class="secondary">▶</button>
            </div>
        </div>
        <div class="footer">
            提示:点击导出按钮将生成真正的 .pptx 文件 (每张图片为一页幻灯片,全屏填充)
        </div>
    </div>
    <script>
        // ======================= 核心数据 =======================
        let images = []; // 存储 { id, src, name }
        let currentPage = 0;
        // DOM 元素
        const fileInput = document.getElementById('fileInput');
        const dropZone = document.getElementById('dropZone');
        const imageGrid = document.getElementById('imageGrid');
        const previewArea = document.getElementById('previewArea');
        const pageIndicator = document.getElementById('pageIndicator');
        const prevBtn = document.getElementById('prevBtn');
        const nextBtn = document.getElementById('nextBtn');
        const clearBtn = document.getElementById('clearBtn');
        const exportPptBtn = document.getElementById('exportPptBtn');
        const exportPdfBtn = document.getElementById('exportPdfBtn');
        const imageCount = document.getElementById('imageCount');
        // ======================= 工具函数 =======================
        function updateUI() {
            // 更新计数
            imageCount.textContent = images.length;
            // 渲染网格
            imageGrid.innerHTML = '';
            images.forEach((img, idx) => {
                const div = document.createElement('div');
                div.className = 'grid-item';
                div.innerHTML = `
                        <img src="${img.src}" alt="${img.name}">
                        <span class="order-badge">#${idx + 1}</span>
                    `;
                // 点击网格跳转到对应页
                div.addEventListener('click', () => {
                    currentPage = idx;
                    showPreview();
                });
                imageGrid.appendChild(div);
            });
            // 重置预览页码
            if (images.length === 0) {
                currentPage = 0;
                previewArea.innerHTML = '<span class="placeholder">无图片</span>';
                pageIndicator.textContent = '0 / 0';
            } else {
                if (currentPage >= images.length) currentPage = images.length - 1;
                showPreview();
            }
        }
        function showPreview() {
            if (images.length === 0) {
                previewArea.innerHTML = '<span class="placeholder">无图片</span>';
                pageIndicator.textContent = '0 / 0';
                return;
            }
            const img = images[currentPage];
            previewArea.innerHTML = `<img src="${img.src}" alt="${img.name}">`;
            pageIndicator.textContent = `${currentPage + 1} / ${images.length}`;
        }
        // ======================= 添加图片处理 =======================
        function handleFiles(files) {
            const allowedTypes = ['image/jpeg', 'image/png', 'image/webp'];
            for (let file of files) {
                if (!allowedTypes.includes(file.type)) continue;
                const reader = new FileReader();
                reader.onload = (e) => {
                    images.push({
                        id: Date.now() + Math.random(),
                        src: e.target.result,
                        name: file.name
                    });
                    // 每次加载完一张刷新UI (小批量)
                    updateUI();
                    // 自动跳转到最新一张
                    currentPage = images.length - 1;
                    showPreview();
                };
                reader.readAsDataURL(file);
            }
        }
        // ======================= 事件绑定 =======================
        // 点击上传区域触发文件选择
        dropZone.addEventListener('click', () => fileInput.click());
        fileInput.addEventListener('change', (e) => {
            handleFiles(e.target.files);
            fileInput.value = ''; // 允许重复选择相同文件
        });
        // 拖拽
        dropZone.addEventListener('dragover', (e) => {
            e.preventDefault();
            dropZone.style.borderColor = '#1976d2';
            dropZone.style.background = '#e3f2fd';
        });
        dropZone.addEventListener('dragleave', () => {
            dropZone.style.borderColor = '#b0bec5';
            dropZone.style.background = 'transparent';
        });
        dropZone.addEventListener('drop', (e) => {
            e.preventDefault();
            dropZone.style.borderColor = '#b0bec5';
            dropZone.style.background = 'transparent';
            if (e.dataTransfer.files.length > 0) {
                handleFiles(e.dataTransfer.files);
            }
        });
        // 清空
        clearBtn.addEventListener('click', () => {
            images = [];
            currentPage = 0;
            updateUI();
        });
        // 导航
        prevBtn.addEventListener('click', () => {
            if (images.length === 0) return;
            currentPage = (currentPage - 1 + images.length) % images.length;
            showPreview();
        });
        nextBtn.addEventListener('click', () => {
            if (images.length === 0) return;
            currentPage = (currentPage + 1) % images.length;
            showPreview();
        });
        // ======================= 导出 PPTX (核心功能) =======================
        exportPptBtn.addEventListener('click', () => {
            if (images.length === 0) {
                alert('请先上传图片!');
                return;
            }
            // 使用 PptxGenJS 库
            const pptx = new PptxGenJS();
            pptx.defineLayout({ name: 'WIDE', width: 13.33, height: 7.5 }); // 16:9
            pptx.layout = 'WIDE';
            // 遍历每张图片,创建幻灯片
            images.forEach((imgData, idx) => {
                const slide = pptx.addSlide();
                // 添加图片,拉伸至全屏 (x=0, y=0, w=100%, h=100%)
                slide.addImage({
                    path: imgData.src,
                    x: 0,
                    y: 0,
                    w: 13.33,
                    h: 7.5,
                    // 裁切保证填充 (cover效果)
                    sizing: { type: 'cover', w: 13.33, h: 7.5 }
                });
                // 可选:在右下角加页码 (浅色文字)
                slide.addText(`${idx + 1} / ${images.length}`, {
                    x: 11.5,
                    y: 6.8,
                    w: 1.5,
                    h: 0.5,
                    fontSize: 10,
                    color: 'FFFFFF',
                    align: 'right',
                    transparency: 50
                });
            });
            // 导出下载
            pptx.writeFile({ fileName: '批量图片演示.pptx' })
                .then(() => console.log('PPTX 导出成功'))
                .catch(err => alert('导出失败: ' + err));
        });
        // ======================= 打印 / PDF (浏览器自带) =======================
        exportPdfBtn.addEventListener('click', () => {
            if (images.length === 0) {
                alert('请先上传图片!');
                return;
            }
            // 创建新窗口,用大图打印 (每一页显示一张图)
            const win = window.open('', '_blank');
            win.document.write(`
                    <html>
                    <head><title>打印预览 - 批量图片</title>
                    <style>
                        @page { margin: 0; }
                        body { margin: 0; background: #fff; }
                        .page { 
                            page-break-after: always; 
                            display: flex; 
                            justify-content: center; 
                            align-items: center; 
                            height: 100vh; 
                            overflow: hidden;
                        }
                        .page img { 
                            max-width: 100%; 
                            max-height: 100%; 
                            object-fit: contain; 
                        }
                        .page:last-child { page-break-after: avoid; }
                    </style>
                    </head>
                    <body>
                `);
            images.forEach((imgData) => {
                win.document.write(`
                        <div class="page">
                            <img src="${imgData.src}" alt="page">
                        </div>
                    `);
            });
            win.document.write('</body></html>');
            win.document.close();
            setTimeout(() => {
                win.focus();
                win.print();
            }, 300);
        });
        // 初始化
        updateUI();
    </script>
</body>
</html>

如何使用这个演示工具

  1. 复制代码:将上面的 HTML 代码复制到记事本,保存为 图片转PPT.html
  2. 运行:双击该文件,在浏览器中打开。
  3. 操作步骤
    • 上传:点击虚线框或拖拽图片进去(支持 JPG/PNG/WEBP)。
    • 查看:下方网格显示缩略图,点击可跳转;右侧是预览区,可翻页。
    • 导出 PPTX:点击“导出为 PPTX”,浏览器会自动下载一个 批量图片演示.pptx 文件,每张图片占一页,自动铺满(类似 PPT 的“全屏填充”效果)。
    • 导出 PDF:点击“打印/导出PDF”,会打开新标签页并弹出打印对话框,选择“另存为 PDF”即可。

如果需要更专业的桌面软件

这个 HTML 工具适合快速演示,如果您需要功能更完整(如:自定义版式、编辑文字、拖拽排序、批量压缩)的桌面版本,建议您使用以下方案之一(都有免费版):

  1. LibreOffice Impress + 宏 (免费)

    • 安装 LibreOffice,编写宏批量插入图片。
    • 优点:完全免费、开源,支持 Windows/Mac/Linux。
  2. Python + python-pptx 库 (免费, 需简单编码)

    • pip install python-pptx
    • 写一个小脚本,几十行代码就能实现:遍历文件夹中的所有图片,生成 PPTX。
    • 灵活性最高,可以自定义大小、位置、文字。
  3. 在线工具 (如 Canva、iLoveIMG)

    • 直接上传图片,下载 PDF 或 PPT。
    • 优点:无需安装;缺点:图片多了可能收费或限速。

如果您需要 Python 脚本的代码示例(一键生成 PPTX),我可以为您提供另一段代码,直接复制到本地运行即可。

标签: 自动化演示

抱歉,评论功能暂时关闭!