$npx -y skills add isjiamu/jiamu-skills --skill gif-splitterGIF动图切分工具,将超过指定帧数的GIF文件自动拆分成多个小文件。适用于微信公众号等平台上传GIF时遇到"帧数超限"的问题。
| 1 | # GIF 动图切分工具 |
| 2 | |
| 3 | ## 概述 |
| 4 | |
| 5 | 这个技能用于解决上传GIF到微信公众号等平台时遇到的"图片帧数超过300帧"限制问题。它会自动检测GIF帧数,并将超限的GIF智能切分成多个符合要求的小文件。 |
| 6 | |
| 7 | ## 使用场景 |
| 8 | |
| 9 | 当用户遇到以下情况时触发此技能: |
| 10 | - 上传GIF到微信公众号提示"帧数超过300帧" |
| 11 | - 需要将大GIF拆分成多个小GIF |
| 12 | - 需要检查GIF文件的帧数信息 |
| 13 | - 需要将GIF拆分后确保每个文件不超过指定大小 |
| 14 | |
| 15 | ## 快速开始 |
| 16 | |
| 17 | 当用户需要切分GIF时,运行以下脚本: |
| 18 | |
| 19 | ```bash |
| 20 | # 切分单个GIF文件(默认最大280帧) |
| 21 | python3 ~/.claude/skills/jiamu-skills/gif-splitter/scripts/split_gif.py "GIF文件路径" |
| 22 | |
| 23 | # 切分文件夹中所有GIF |
| 24 | python3 ~/.claude/skills/jiamu-skills/gif-splitter/scripts/split_gif.py "文件夹路径" |
| 25 | ``` |
| 26 | |
| 27 | 输出目录:原文件所在目录下的 `split_output/` 文件夹 |
| 28 | |
| 29 | ## 依赖环境 |
| 30 | |
| 31 | ### 安装 Pillow |
| 32 | |
| 33 | ```bash |
| 34 | pip3 install Pillow |
| 35 | ``` |
| 36 | |
| 37 | ### 验证安装 |
| 38 | |
| 39 | ```bash |
| 40 | python3 -c "from PIL import Image; print('Pillow 安装成功')" |
| 41 | ``` |
| 42 | |
| 43 | ## 使用命令 |
| 44 | |
| 45 | ### 基础用法 |
| 46 | |
| 47 | ```bash |
| 48 | # 切分单个文件 |
| 49 | python3 scripts/split_gif.py "动图.gif" |
| 50 | |
| 51 | # 切分整个文件夹 |
| 52 | python3 scripts/split_gif.py ~/Desktop/gif文件夹/ |
| 53 | ``` |
| 54 | |
| 55 | ### 自定义参数 |
| 56 | |
| 57 | ```bash |
| 58 | # 指定最大帧数(默认280帧,微信限制300帧) |
| 59 | python3 scripts/split_gif.py "动图.gif" --max-frames 200 |
| 60 | |
| 61 | # 指定输出目录 |
| 62 | python3 scripts/split_gif.py "动图.gif" -o ~/Desktop/output |
| 63 | |
| 64 | # 仅查看GIF信息,不切分 |
| 65 | python3 scripts/split_gif.py "动图.gif" --info |
| 66 | |
| 67 | # 组合使用 |
| 68 | python3 scripts/split_gif.py ~/gifs/ --max-frames 250 -o ~/output --info |
| 69 | ``` |
| 70 | |
| 71 | ## 参数说明 |
| 72 | |
| 73 | | 参数 | 说明 | 默认值 | |
| 74 | |------|------|--------| |
| 75 | | `path` | GIF文件或文件夹路径 | 必填 | |
| 76 | | `--max-frames`, `-m` | 每个输出文件的最大帧数 | 280 | |
| 77 | | `-o`, `--output` | 输出目录 | 原目录下的 `split_output/` | |
| 78 | | `--info` | 仅显示GIF信息,不执行切分 | False | |
| 79 | |
| 80 | ## 工作原理 |
| 81 | |
| 82 | ### 切分算法 |
| 83 | |
| 84 | 1. **读取GIF**:使用Pillow库读取GIF的所有帧和每帧的持续时间 |
| 85 | 2. **计算分片**:根据总帧数和最大帧数限制,计算需要切分的文件数量 |
| 86 | 3. **均匀分配**:将帧数均匀分配到各个输出文件,避免最后一个文件帧数过少 |
| 87 | 4. **保存输出**:保留原始帧率和循环设置,生成优化后的GIF文件 |
| 88 | |
| 89 | ### 示例 |
| 90 | |
| 91 | 原文件:`演示动画.gif`(740帧,5.7MB) |
| 92 | |
| 93 | 切分结果: |
| 94 | ``` |
| 95 | 演示动画_第1部分.gif (247帧, 约2MB) |
| 96 | 演示动画_第2部分.gif (247帧, 约2MB) |
| 97 | 演示动画_第3部分.gif (246帧, 约2MB) |
| 98 | ``` |
| 99 | |
| 100 | ## 平台限制参考 |
| 101 | |
| 102 | | 平台 | 帧数限制 | 文件大小限制 | 建议 `--max-frames` | |
| 103 | |------|----------|--------------|---------------------| |
| 104 | | 微信公众号 | 300帧 | 10MB | 280(默认) | |
| 105 | | 微信聊天 | 无明确限制 | 25MB | 根据需要 | |
| 106 | | 微博 | 无明确限制 | 20MB | 根据需要 | |
| 107 | |
| 108 | ## 常见问题 |
| 109 | |
| 110 | ### 切分后文件比原文件大? |
| 111 | |
| 112 | 这是正常现象。原因: |
| 113 | 1. 原GIF可能使用了全局调色板优化 |
| 114 | 2. 切分后每个文件需要独立的调色板 |
| 115 | 3. 帧间压缩效果降低 |
| 116 | |
| 117 | 解决方案:适当增加 `--max-frames` 减少切分数量 |
| 118 | |
| 119 | ### 切分后动画速度变了? |
| 120 | |
| 121 | 脚本会保留原始帧率。如果发现速度异常,可能是原GIF的帧时间信息不完整。 |
| 122 | |
| 123 | ### 如何只查看GIF信息不切分? |
| 124 | |
| 125 | ```bash |
| 126 | python3 scripts/split_gif.py "动图.gif" --info |
| 127 | ``` |
| 128 | |
| 129 | 输出示例: |
| 130 | ``` |
| 131 | 文件: 演示动画.gif |
| 132 | 帧数: 740 帧 |
| 133 | 大小: 5.70 MB |
| 134 | 尺寸: 800x600 |
| 135 | 状态: 需要切分(超过 280 帧) |
| 136 | ``` |
| 137 | |
| 138 | ## 输出格式 |
| 139 | |
| 140 | 输出文件命名规则:`{原文件名}_第{序号}部分.gif` |
| 141 | |
| 142 | 例如: |
| 143 | - `演示.gif` → `演示_第1部分.gif`, `演示_第2部分.gif` |
| 144 | |
| 145 | ## 技术细节 |
| 146 | |
| 147 | - **库依赖**:Pillow (PIL) |
| 148 | - **Python版本**:3.6+ |
| 149 | - **支持格式**:GIF(动态/静态) |
| 150 | - **输出优化**:启用GIF优化压缩 |