![ScreenToGIF Logo]
作者:杜玛
版权:永久 © 杜玛 保留所有权利
版本:1.0.4
发布日期:2026-03-11
GitHub:https://github.com/duma520
项目地址:https://github.com/duma520/ScreenToGIF
简单来说:ScreenToGIF 是一款能将你在电脑屏幕上的操作录制下来,并转换成GIF动图的工具。
打个比方:就像你用手机录制一段小视频,但最后得到的不是视频文件,而是一张会动的图片。这种动图可以在不点击播放的情况下自动展示内容,非常适合制作教程、展示操作步骤、分享有趣瞬间等。
专业定义:ScreenToGIF 是一款基于Python和PySide6开发的跨平台屏幕录制工具,能够捕获指定屏幕区域的画面,并以多线程方式高效处理图像数据,最终输出为优化后的GIF动画文件。软件支持实时预览、帧编辑、播放控制等高级功能。
适用人群:
- 👨🏫 教师:制作教学演示
- 👩💻 程序员:展示代码操作和Bug复现
- 🎨 设计师:展示设计过程和作品预览
- 📱 社交媒体运营:制作趣味动图
- 🎮 游戏玩家:分享游戏精彩瞬间
- 📝 文档编写者:制作操作说明文档
如果你是第一次使用,跟着以下步骤,3分钟内就能制作出你的第一个GIF:
步骤1:启动软件
- 双击
ScreenToGIF.exe启动程序 - 你会看到一个分为左右两部分的窗口(左侧是控制面板,右侧是预览区域)
步骤2:选择录制区域
- 点击左侧的 "选择录制区域" 按钮(蓝色)
- 整个屏幕会变成半透明遮罩
- 按住鼠标左键,拖动选择你要录制的区域(比如一个浏览器窗口、一个软件界面)
- 松开鼠标,自动返回主窗口
步骤3:开始录制
- 点击 "开始录制" 按钮(绿色)
- 程序开始捕获你选择的区域
- 此时你可以进行想要录制的操作(比如点击菜单、输入文字等)
步骤4:停止录制
- 操作完成后,点击 "停止录制" 按钮(红色)
- 录制结束,右侧预览区会显示你录制的画面
步骤5:保存GIF
- 点击 "生成GIF" 按钮(蓝色)
- 选择保存位置和文件名
- 点击"保存"
- 等待进度条走完,你的GIF就制作完成啦!
完成! 🎉 现在去你保存的位置看看你的第一个GIF作品吧!
下载预编译版本:
- 访问项目GitHub页面:https://github.com/duma520/ScreenToGIF
- 在"Releases"或"发布"页面找到最新版本
- 下载
ScreenToGIF-v1.0.4.zip或.exe安装包 - 解压压缩包(如果是zip格式)或双击安装
- 双击
ScreenToGIF.exe即可运行
系统要求:
- Windows 7/8/10/11(64位)
- macOS 10.14+(需自行编译)
- Linux(需自行编译)
- 内存:至少2GB(推荐4GB以上)
- 硬盘空间:100MB以上
环境要求:
- Python 3.8 或更高版本
- pip(Python包管理器)
- Git(可选,用于克隆代码)
安装步骤:
# 1. 克隆代码库
git clone https://github.com/duma520/ScreenToGIF.git
cd ScreenToGIF
# 2. 创建虚拟环境(推荐)
python -m venv venv
# 3. 激活虚拟环境
# Windows:
venv\Scripts\activate
# macOS/Linux:
source venv/bin/activate
# 4. 安装依赖
pip install -r requirements.txt
# 5. 运行程序
python ScreenToGIF.pyrequirements.txt 内容:
PySide6>=6.4.0
opencv-python>=4.8.0
numpy>=1.24.0
Pillow>=10.0.0
项目提供了多个批处理文件用于打包:
0_nuitka_pyside6_msvc.bat:使用Nuitka打包(生成更小的可执行文件)0_pyinstaller.bat:使用PyInstaller打包(更快的打包速度)9_spec.bat:使用spec文件打包(自定义配置)
![界面布局示意图]
ScreenToGIF的主界面分为以下几个主要区域:
① 录制控制组
- 选择录制区域(蓝色按钮):点击后进入区域选择模式
- 开始录制(绿色按钮):开始捕获屏幕
- 停止录制(红色按钮):结束录制
- 区域信息:显示当前选择的区域尺寸(如"区域: 800 × 600")
② 录制设置组
- 帧率 (FPS):设置每秒捕获的帧数(1-30)
- 缩放比例:输出GIF的尺寸百分比(10-200%)
- GIF质量:压缩质量设置(1-100%)
- 颜色数:使用的颜色数量(2-256色)
- 自动开始录制:勾选后,选择区域自动开始录制
- 显示实时预览:勾选后,录制时右侧会实时显示画面
③ 输出设置组
- 输出目录:显示GIF文件保存的文件夹路径
- 打开文件夹:快速打开输出目录
④ 录制后操作组
- 播放录制(青色):预览录制的帧序列
- 编辑帧(黄色):进入帧编辑器(删除、调整顺序)
- 生成GIF(蓝色):将录制的帧保存为GIF文件
⑤ 处理进度组
- 状态标签:显示当前操作状态
- 进度条:显示GIF生成进度
⑥ 实时预览区
- 显示当前录制的画面(仅录制时有效)
- 可缩放适应窗口大小
⑦ 帧信息
- 显示已捕获的帧数(如"已捕获: 150 帧")
⑧ 录制历史
- 显示最近生成的GIF文件列表
- 双击可打开文件所在位置
- 文件:打开输出文件夹、退出程序
- 编辑:清除所有帧
- 视图:窗口置顶切换
- 帮助:关于信息
- 显示当前操作状态信息
- 点击主界面的 "选择录制区域" 按钮
- 屏幕变为半透明遮罩,鼠标变为十字光标
- 按住左键并拖动,框选要录制的区域
- 松开鼠标,自动返回主窗口
技巧:
- 框选时,角落会显示当前尺寸(如"800 × 600")
- 如果选错了,按 ESC键 取消选择
场景1:录制整个窗口
- 打开目标窗口(如浏览器)
- 进入选择模式后,从窗口左上角拉到右下角
- 或者使用窗口截图工具先测量尺寸
场景2:录制固定区域(如软件工具栏)
- 测量目标区域的大致尺寸
- 在选择时留意角落显示的尺寸信息
- 可以多次尝试直到选中精确区域
场景3:录制多个屏幕
- 程序支持多显示器
- 选择区域可以跨越多个屏幕
- 所有屏幕会合并为一个虚拟桌面
程序会自动保存你上次选择的区域。下次启动时:
- 区域信息会显示上次的尺寸
- "开始录制"按钮会自动启用
- 点击即可开始录制相同区域
场景示例:录制一个简单的菜单操作
目标:录制"打开记事本→输入文字→保存文件"的过程
步骤详解:
-
准备阶段
- 打开ScreenToGIF
- 点击"选择录制区域"
- 框选包含"开始菜单"和记事本窗口的区域
- 确认区域信息显示正确
-
开始录制
- 点击"开始录制"(绿色按钮)
- 注意右上角开始计时
-
执行操作
- 点击"开始菜单"
- 输入"记事本"并打开
- 在记事本中输入"Hello World"
- 点击"文件→保存"
- 选择保存位置(这个过程也会被录制)
-
停止录制
- 点击"停止录制"(红色按钮)
- 右侧预览区显示刚才的操作
-
保存GIF
- 点击"生成GIF"
- 选择文件名(如"记事本教程.gif")
- 点击"保存"
- 等待进度条完成
完成! 现在你有了一个完整的操作教程GIF。
| 注意事项 | 说明 | 建议 |
|---|---|---|
| 录制时长 | 录制时间越长,帧数越多,GIF文件越大 | 控制在30秒内最佳 |
| 操作速度 | 操作太快可能导致关键步骤丢失 | 放慢操作,每一步停顿1-2秒 |
| 鼠标移动 | 鼠标轨迹也会被录制 | 尽量保持鼠标稳定 |
| 窗口变化 | 如果窗口移动出录制区域,内容会丢失 | 固定窗口位置 |
场景1:软件操作教程
适合:教学、培训
建议设置:
- FPS: 8-10(平衡流畅和文件大小)
- 缩放: 100%(保持清晰度)
- 颜色: 256色(最佳画质)
场景2:游戏精彩瞬间
适合:游戏分享、攻略
建议设置:
- FPS: 15-20(捕捉流畅动作)
- 缩放: 100%或150%(放大细节)
- 颜色: 256色(保持色彩)
场景3:UI/UX演示
适合:设计师展示交互
建议设置:
- FPS: 12-15(展示过渡动画)
- 缩放: 100%(原始尺寸)
- 颜色: 256色(保证色彩准确)
程序默认将GIF文件保存在:
程序所在目录\ScreenToGIF_Recordings\
例如:
- 如果程序在
D:\Tools\ScreenToGIF\ - 输出目录为
D:\Tools\ScreenToGIF\ScreenToGIF_Recordings\
为什么这样设计?
- 便于管理:所有录制文件集中存放
- 便于携带:移动整个文件夹时,录制文件一起移动
- 避免权限问题:不需要管理员权限即可写入
默认文件名格式:
screen_recording_YYYYMMDD_HHMMSS.gif
示例:
screen_recording_20260311_143025.gif(2026年3月11日 14:30:25)
建议的自定义命名方式:
软件名_功能_日期.gif(如:photoshop_抠图教程_20260311.gif)项目_版本_操作.gif(如:app_v1.2_登录流程.gif)
帧率 (FPS) 设置建议:
| 使用场景 | 推荐FPS | 理由 |
|---|---|---|
| 简单的界面截图(点击按钮) | 5-8 | 足够捕捉关键动作,文件小 |
| 软件操作教程 | 8-12 | 平衡流畅度和文件大小 |
| UI动画演示 | 12-15 | 捕捉过渡动画细节 |
| 快速动作(游戏、鼠标移动) | 15-20 | 保证动作流畅 |
| 极限情况 | 20-30 | 文件极大,慎用 |
缩放比例设置建议:
| 使用场景 | 推荐缩放 | 理由 |
|---|---|---|
| 全高清录制(1920×1080) | 50-70% | 减小文件大小,同时保持可读性 |
| 细节展示(小图标、文字) | 100-150% | 保持细节清晰 |
| 长文档滚动 | 80-100% | 平衡可视范围和文件大小 |
| 手机屏幕录制 | 100% | 原始尺寸最合适 |
颜色数设置建议:
| 颜色数 | 适用场景 | 文件大小 | 画质 |
|---|---|---|---|
| 256色 | 色彩丰富的界面、游戏 | 大 | 极好 |
| 128色 | 普通软件界面 | 中 | 好 |
| 64色 | 简单界面、文字教程 | 小 | 一般 |
| 32色 | 图标、简单图形 | 很小 | 可接受 |
| 16色以下 | 极简黑白内容 | 极小 | 差 |
质量设置建议:
| 质量 | 适用场景 | 文件大小 | 说明 |
|---|---|---|---|
| 90-100% | 最终成品、重要内容 | 最大 | 几乎无损 |
| 70-90% | 普通分享 | 大 | 视觉无损 |
| 50-70% | 网络发布、邮件附件 | 中 | 可接受压缩 |
| 30-50% | 预览、草稿 | 小 | 明显压缩 |
| 30%以下 | 极简需求 | 极小 | 画质损失严重 |
目前版本不支持批量导出,但你可以:
- 多次录制,分别保存
- 使用外部工具合并GIF(如:FFmpeg、GIMP)
问题现象:双击程序没反应,或闪退
解决方法:
- 检查Python环境(源码运行):
python --version # 确保是3.8+
pip list | findstr PySide6 # 检查依赖- 检查依赖库:
pip install -r requirements.txt --upgrade- 查看错误日志:
- 在命令行中运行程序,查看错误信息
- 错误信息通常会指出缺失的模块
- 管理员权限运行:
- 右键点击程序,选择"以管理员身份运行"
问题1:选择区域时看不到遮罩
- 确保没有其他全屏程序覆盖
- 尝试按
Win+D显示桌面后再试
问题2:选择的区域不是我想要的
- 按
ESC取消选择,重新框选 - 注意鼠标拖动时要精确
问题3:无法选择多显示器区域
- 程序自动支持多显示器
- 确保显示器设置为"扩展"模式
问题现象:录制时画面不流畅,鼠标移动卡顿
原因和解决方法:
| 原因 | 解决方法 |
|---|---|
| FPS设置过高 | 降低FPS到8-10 |
| 录制区域太大 | 缩小录制区域,或降低缩放比例 |
| 电脑性能不足 | 关闭其他程序,释放CPU/内存 |
| 磁盘写入慢 | 更换保存位置到SSD |
优化方法:
- 降低FPS:从15降到8,文件大小可减少40%
- 减少颜色数:从256降到128,文件大小可减少30%
- 降低缩放:从100%降到80%,文件大小可减少36%
- 缩短录制时间:尽量控制在15秒内
- 降低质量:从90%降到70%,文件大小可减少25%
组合优化示例:
原始:FPS 15, 颜色256, 缩放100%, 质量90% → 文件 5.2MB
优化后:FPS 10, 颜色128, 缩放80%, 质量70% → 文件 1.8MB (减小65%)
问题现象:GIF中的颜色和原始屏幕不一样
原因:
- GIF格式限制最多256色
- 颜色量化过程会丢失部分颜色
解决方法:
- 保持颜色数为256(最大)
- 对于渐变色多的内容,考虑使用视频格式
- 或者使用其他工具转成视频(如MP4)
问题现象:无法保存文件,提示权限不足
解决方法:
- 检查输出目录是否存在,是否有写入权限
- 尝试以管理员身份运行程序
- 更改保存位置到用户文件夹(如
C:\Users\用户名\Videos\)
通俗解释: 帧率(FPS,Frames Per Second)就是每秒钟捕获多少张图片。就像翻书动画一样,图片越多,动画越流畅。
类比:
- 5 FPS:每秒5张图 → 像幻灯片,卡顿感明显
- 10 FPS:每秒10张图 → 基本流畅,适合教程
- 15 FPS:每秒15张图 → 很流畅,适合动画
- 24 FPS:每秒24张图 → 电影级流畅
- 30 FPS:每秒30张图 → 超高流畅,文件巨大
视觉流畅度:
卡顿 ←──────────→ 流畅
5fps 10fps 15fps 24fps 30fps
文件大小(相同内容下):
- 10秒录制,100%缩放,256色
| FPS | 帧数 | 估算文件大小 | 流畅度 |
|---|---|---|---|
| 5 | 50帧 | 1.5MB | 卡顿,适合极简操作 |
| 8 | 80帧 | 2.4MB | 可接受,适合教程 |
| 10 | 100帧 | 3.0MB | 基本流畅,推荐 |
| 12 | 120帧 | 3.6MB | 流畅,适合UI演示 |
| 15 | 150帧 | 4.5MB | 很流畅,适合动画 |
| 20 | 200帧 | 6.0MB | 非常流畅,文件大 |
| 30 | 300帧 | 9.0MB | 极流畅,文件巨大 |
场景1:软件操作教程
目标:展示点击按钮、输入文字等操作
推荐FPS:8-10
理由:
- 用户需要看清每一步操作
- 操作本身不快,高FPS浪费
- 文件大小适中,便于分享
示例:展示Excel表格操作
场景2:UI交互动画
目标:展示菜单展开、页面切换等动画效果
推荐FPS:12-15
理由:
- 动画需要流畅才能体现设计
- 15fps足以捕捉大部分UI动画
- 文件大小仍在可接受范围
示例:展示手机App的滑动效果
场景3:游戏精彩瞬间
目标:捕捉快速动作(跳跃、射击、技能释放)
推荐FPS:15-20
理由:
- 游戏动作快,需要高FPS捕捉细节
- 20fps基本能满足需求
- 权衡画质和文件大小
示例:展示《英雄联盟》的团战瞬间
场景4:代码编写演示
目标:展示代码输入过程
推荐FPS:5-8
理由:
- 代码输入速度不快
- 低FPS足够看清每个字符
- 文件小,便于嵌入文档
示例:演示Python函数编写
场景5:长时间过程监控
目标:监控程序运行、下载进度等
推荐FPS:1-3
理由:
- 变化缓慢,不需要高帧率
- 极大减小文件大小
- 可以录制更长时间
示例:展示文件解压过程(30秒→90帧)
方法:使用"播放录制"功能测试
- 先用15 FPS录制一段操作
- 录制完成后,点击"播放录制"
- 观察播放流畅度
- 如果觉得太快,下次降低FPS
- 如果觉得卡顿,下次提高FPS
通俗解释: 缩放比例就是输出GIF的尺寸是原始录制区域的百分之多少。
- 100% = 原始大小
- 50% = 宽度和高度都缩小一半
- 200% = 宽度和高度都放大一倍
计算公式:
输出宽度 = 录制区域宽度 × (缩放比例 ÷ 100)
输出高度 = 录制区域高度 × (缩放比例 ÷ 100)
示例: 录制区域 1920×1080
- 缩放50% → 输出 960×540
- 缩放100% → 输出 1920×1080
- 缩放150% → 输出 2880×1620
文件大小与像素数量成正比。像素数量变化公式:
新像素数 = 原像素数 × (缩放比例 ÷ 100)²
示例(1920×1080 = 约207万像素):
| 缩放比例 | 输出尺寸 | 像素数 | 文件大小估算 |
|---|---|---|---|
| 50% | 960×540 | 约52万 | 25%(减少75%) |
| 70% | 1344×756 | 约102万 | 49%(减少51%) |
| 80% | 1536×864 | 约133万 | 64%(减少36%) |
| 90% | 1728×972 | 约168万 | 81%(减少19%) |
| 100% | 1920×1080 | 约207万 | 100%(基准) |
| 120% | 2304×1296 | 约299万 | 144%(增加44%) |
| 150% | 2880×1620 | 约466万 | 225%(增加125%) |
场景1:社交媒体分享
平台限制:Twitter最大5MB,微信限制2-5MB
推荐缩放:50-70%
理由:
- 手机屏幕小,大尺寸浪费
- 减小文件便于上传
- 文字仍可辨认
示例:1920×1080 → 缩放60% → 1152×648
场景2:技术文档嵌入
需求:文字清晰,图标可辨
推荐缩放:80-100%
理由:
- 文档可能被放大查看
- 代码和文字需要清晰
- 文件大小不是首要考虑
示例:IDE操作教程,保持文字可读
场景3:展示精细设计
需求:展示UI细节、图标细节
推荐缩放:100-150%
理由:
- 放大可以看清像素级细节
- 设计师需要展示精确效果
- 文件大小可以接受
示例:展示App图标设计过程
场景4:邮件附件
限制:多数邮件系统限制附件10-20MB
推荐缩放:50-70%
理由:
- 邮件附件需要控制大小
- 收件人可能不会放大查看
- 确保能被正常接收
示例:发送操作教程给客户
重要原则:缩放后文字必须保持可读
测试标准:
- 中文字体:至少12px
- 英文字体:至少10px
示例:
录制区域:2560×1440(高分屏)
- 系统字体通常较大
- 缩放50%后:1280×720
- 字体大小也缩小50%
- 需要检查文字是否可读
建议:
- 高分屏录制时,缩放不低于70%
- 如果内容包含小字,保持80%以上
技巧1:只缩放不必要的区域
- 录制时包含操作区域和周边空白
- 通过缩放裁剪掉空白区域
- 既减小文件,又保持核心区域清晰
技巧2:针对重点区域放大
- 录制整体操作,但在编辑时裁剪重点
- 或者分两次录制:整体和细节
技巧3:使用固定输出尺寸
- 如统一输出 800×600
- 根据录制区域计算最佳缩放
- 保持所有教程统一尺寸
通俗解释: GIF是一种古老的图片格式,最多只能存储256种颜色。如果原始画面颜色超过256种,就需要通过"颜色量化"算法选择最重要的256种颜色。
颜色量化过程:
- 分析每一帧的所有颜色
- 找出出现频率最高的颜色
- 创建包含这些颜色的调色板
- 用调色板中的颜色近似表示其他颜色
理论关系:
- 颜色数越少,调色板越小
- 每个像素需要的位数越少
- 文件大小相应减小
实际测试数据(10秒录制,10fps,800×600):
| 颜色数 | 调色板大小 | 文件大小 | 画质 | 适用场景 |
|---|---|---|---|---|
| 256色 | 768字节 | 4.2MB | 最佳 | 照片级内容 |
| 128色 | 384字节 | 3.6MB | 优秀 | 彩色界面 |
| 64色 | 192字节 | 2.9MB | 良好 | 普通软件 |
| 32色 | 96字节 | 2.3MB | 一般 | 图标为主 |
| 16色 | 48字节 | 1.8MB | 较差 | 黑白内容 |
| 8色 | 24字节 | 1.4MB | 很差 | 极简图形 |
| 4色 | 12字节 | 1.1MB | 极差 | 特殊用途 |
场景1:照片/游戏画面
内容特点:色彩丰富,渐变多
推荐颜色:256色
理由:
- 需要尽可能保留原色
- 减少颜色数会导致色块
- 画质优先
示例:游戏精彩片段、摄影教程
场景2:软件界面
内容特点:固定配色,颜色有限
推荐颜色:128色或64色
理由:
- 大多数软件界面颜色少于64色
- 128色足够保留所有界面颜色
- 可以减小文件大小
示例:Windows设置界面、Word操作
场景3:代码编辑器
内容特点:背景单一,语法高亮
推荐颜色:32色或16色
理由:
- 编辑器通常只有几种颜色
- 语法高亮一般不超过10种颜色
- 可以用很少颜色完美还原
示例:VS Code编写代码过程
场景4:黑白/灰度内容
内容特点:只有黑白灰
推荐颜色:8色或4色
理由:
- 灰度可以用很少的色阶表示
- 文件极小,画质影响小
- 适合打印文档演示
示例:终端命令行操作
肉眼观察效果:
| 颜色数 | 效果描述 |
|---|---|
| 256色 | 基本看不出损失,渐变可能有轻微条纹 |
| 128色 | 仔细看能发现颜色过渡不平滑 |
| 64色 | 明显色块,尤其是渐变区域 |
| 32色 | 严重色块,颜色失真明显 |
| 16色 | 卡通化效果,颜色跳跃 |
测试方法:
- 用不同颜色数生成同一个GIF
- 在屏幕上同时对比
- 选择"刚好满意"的最低颜色数
技巧1:自适应调色板
程序使用 Image.ADAPTIVE 模式,会为每帧优化调色板。这意味着:
- 每帧可以使用不同的颜色集
- 更准确地表现每帧的内容
- 但会增加处理时间
技巧2:抖动效果(当前版本未实现)
- 通过像素排列模拟更多颜色
- 视觉效果更好
- 但文件会略微增大
技巧3:颜色限制策略
如果画面变化不大:
- 可以使用全局调色板
- 颜色数可以减少到32色
- 文件可减小40%
如果画面变化剧烈:
- 必须使用每帧调色板
- 颜色数保持在128以上
- 文件可能增大
帧编辑器是ScreenToGIF的核心功能之一,允许你在生成GIF之前,对录制的帧进行修改和调整。
可以做什么:
- ✅ 删除不需要的帧
- ✅ 调整帧的顺序
- ✅ 批量删除选定帧
- ✅ 预览播放效果
- ✅ 重置到原始状态
不能做什么(当前版本):
- ❌ 裁剪单帧画面
- ❌ 添加文字/标注
- ❌ 调整单帧亮度/对比度
- ❌ 合并多个录制
- 录制完成后(或打开已有录制)
- 点击 "编辑帧" 按钮(黄色)
- 等待编辑器窗口打开
① 工具栏
- 播放/暂停:预览编辑效果
- 删除当前帧:删除当前选中的帧
- 删除选定范围:批量删除多帧
- 上移/下移:调整帧顺序
- 裁剪帧:(预留功能)
- 重置:放弃所有编辑
② 左侧帧列表
- 显示所有帧的缩略图
- 每帧有编号(帧1, 帧2...)
- 可以单选或多选(按住Ctrl)
- 双击选中帧可在右侧预览
③ 右侧预览区
- 显示当前选中帧的大图
- 滑块可快速跳转
- 显示当前帧/总帧数
④ 底部按钮
- 确定:保存编辑并返回主界面
- 取消:放弃所有编辑
示例1:删除开头和结尾的冗余帧
场景:录制了打开程序的过程,但开头有5秒等待
目标:删除前30帧(约3秒)
操作步骤:
1. 在左侧帧列表,点击第一帧
2. 按住Shift,点击第30帧(全选1-30)
3. 点击"删除选定范围"
4. 预览检查效果
5. 点击"确定"保存
示例2:删除中间的失误操作
场景:操作中不小心点错了菜单,马上改正
目标:删除包含失误的帧(第50-60帧)
操作步骤:
1. 播放预览,找到失误开始的帧(第50)
2. 在左侧找到第50帧,单击选中
3. 按住Ctrl,点击第51-60帧(逐帧选择)
4. 点击"删除选定范围"
5. 播放检查是否还有失误
6. 确定保存
示例3:调整帧顺序(纠正操作顺序)
场景:先保存了文件,然后才输入内容(顺序错了)
目标:将输入内容的帧移到保存之前
操作步骤:
1. 找到输入内容的帧(第30-50帧)
2. 按住Ctrl,选中这些帧
3. 点击"上移",逐次移动到保存操作之前
4. 播放检查逻辑是否正确
5. 确定保存
示例4:从长录制中提取精彩片段
场景:录制了5分钟的游戏过程,只想保留最后的团战
目标:删除所有帧,只保留第400-500帧
操作步骤:
1. 点击"全选"按钮
2. 按住Ctrl,点击第400-500帧(取消它们的选中)
3. 点击"删除选定范围"(删除其他所有帧)
4. 检查是否只剩目标帧
5. 确定保存
技巧1:使用滑块快速定位
- 拖动右侧的滑块可以快速跳转
- 适合在长录制中寻找特定位置
技巧2:播放时实时编辑
- 先点击"播放"预览
- 看到需要删除的帧时,立即点击"暂停"
- 记录帧号,然后进行删除
技巧3:批量选择的技巧
| 选择模式 | 操作 | 用途 |
|---|---|---|
| 单击 | 选择单帧 | 删除或移动单帧 |
| Ctrl+单击 | 选择/取消多帧 | 选择不连续的帧 |
| Shift+单击 | 选择连续范围 | 选择一段连续帧 |
| 全选按钮 | 选择所有帧 | 重置或全删除 |
技巧4:编辑前后对比
- 编辑过程中随时点击"播放"查看效果
- 如果效果不理想,可以点击"重置"
- 或者先取消所有选择,重新开始
帧数限制:
- 编辑器最多支持显示500帧(性能考虑)
- 如果录制超过500帧,建议分段处理
内存使用:
- 编辑大量帧时会占用较多内存
- 如果电脑内存小于4GB,建议录制控制在200帧以内
撤销限制:
- 当前版本不支持撤销(Ctrl+Z)
- 重要操作前建议先预览
- 误操作可以使用"重置"功能
播放器是ScreenToGIF内置的预览工具,可以在生成GIF前,以接近最终效果的方式播放录制的帧序列。
作用:
- 预览录制效果
- 检查是否需要编辑
- 测试不同播放速度的效果
- 在生成前发现问题
- 录制完成后
- 点击 "播放录制" 按钮(青色)
- 播放器窗口自动打开
① 预览区域
- 显示当前播放的帧
- 自动适应窗口大小
- 显示实际画面比例
② 控制栏
- 播放/暂停:开始或暂停播放
- 停止:回到第一帧并停止
- 速度选择:0.5x、1.0x、1.5x、2.0x
- 帧滑块:手动拖动到任意帧
- 帧计数:显示当前帧/总帧数
③ 信息栏
- 总帧数
- 设置的FPS
- 原始尺寸
技巧1:检查操作逻辑
用1.0x速度正常播放
注意观察:
- 操作顺序是否正确
- 有没有漏掉关键步骤
- 有没有多余的等待
技巧2:检查流畅度
切换不同速度:
- 0.5x:检查细节,适合复杂操作
- 1.0x:正常观看效果
- 1.5x/2.0x:检查是否太快看不清
技巧3:定位问题帧
发现问题时:
1. 点击"暂停"
2. 用滑块前后拖动
3. 找到问题的开始和结束帧
4. 记下帧号,在编辑器中处理
技巧4:模拟最终效果
播放器使用和GIF相同的帧率
可以通过播放器预估:
- GIF的流畅度
- 是否需要调整FPS
- 是否需要缩放
场景1:教程类内容
测试重点:
- 文字是否清晰可读
- 操作速度是否适合新手
- 关键步骤是否足够明显
推荐速度:
- 1.0x测试正常观看
- 0.5x检查细节
场景2:动画演示
测试重点:
- 动画是否流畅
- 有无卡顿或跳帧
- 色彩过渡是否自然
推荐速度:
- 1.0x和1.5x对比
- 注意有没有丢帧
场景3:快速操作
测试重点:
- 能否看清所有操作
- 会不会太快看不清
- 是否需要降低FPS
推荐速度:
- 0.5x慢放检查
- 1.0x决定是否合格
ScreenToGIF采用MVC(Model-View-Controller)模式的变体,结合多线程技术实现流畅的录制体验。
┌─────────────────────────────────────┐
│ 用户界面 (View) │
│ QMainWindow, QDialog, QWidget │
└───────────────┬─────────────────────┘
│ 信号/槽
┌───────────────▼─────────────────────┐
│ 控制器 (Controller) │
│ 事件处理、状态管理、线程协调 │
└───────────────┬─────────────────────┘
│ 数据流
┌───────────────▼─────────────────────┐
│ 模型 (Model) │
│ AppConfig, 帧数据, 录制历史 │
└───────────────┬─────────────────────┘
│ 线程管理
┌───────────┴───────────┐
│ │
┌───▼───┐ ┌───▼───┐
│捕获线程│ │编码线程│
└───────┘ └───────┘
模块1:配置管理(AppConfig)
@dataclass
class AppConfig:
"""使用dataclass管理配置,支持JSON序列化"""
output_directory: str
fps: int
scale_percent: int
# ... 其他配置项
def save_to_file(self, filepath):
"""保存为JSON格式"""
@classmethod
def load_from_file(cls, filepath):
"""从JSON加载"""模块2:屏幕捕获(ScreenCaptureThread)
class ScreenCaptureThread(QThread):
"""继承QThread实现异步捕获"""
frame_captured = Signal(np.ndarray) # 信号传递帧数据
def run(self):
"""主循环,控制捕获频率"""
while self.is_running:
if time_check(): # FPS控制
pixmap = screen.grabWindow() # 捕获屏幕
frame = self.pixmap_to_cv2(pixmap) # 格式转换
self.frames.append(frame)
self.frame_captured.emit(frame) # 发送预览模块3:GIF编码(GIFEncodingThread)
class GIFEncodingThread(QThread):
"""独立的编码线程,不阻塞UI"""
def run(self):
# 1. 缩放处理
# 2. BGR→RGB转换
# 3. 使用PIL生成GIF
# 4. 进度报告
# 5. 完成/错误信号模块4:区域选择(RegionSelectionWindow)
class RegionSelectionWindow(QWidget):
"""无边框半透明窗口,实现区域选择"""
def paintEvent(self, event):
# 绘制半透明遮罩
# 绘制选择框
# 显示尺寸信息
def mousePressEvent(self, event):
# 记录开始点
def mouseMoveEvent(self, event):
# 实时更新选择框┌──────────┐ ┌──────────┐ ┌──────────┐
│ 屏幕捕获 │───>│ 帧队列 │───>│ GIF编码 │
└──────────┘ └──────────┘ └──────────┘
│ │ │
│ ▼ │
│ ┌──────────┐ │
└─────────>│ 实时预览 │<─────────┘
└──────────┘
│
▼
┌──────────┐
│ 帧编辑器 │
└──────────┘
1. QImage到OpenCV的转换
# ARGB32格式处理
if qimage.format() == QImage.Format_ARGB32:
arr = np.array(ptr, copy=True).reshape(height, width, 4)
frame = cv2.cvtColor(arr, cv2.COLOR_RGBA2BGR)
else:
# 其他格式,先转换到RGB888
qimage_rgb = qimage.convertToFormat(QImage.Format_RGB888)
# ... 转换逻辑2. 多线程安全
# 使用Event控制线程生命周期
self.capture_event = Event()
self.capture_event.set() # 启动
self.capture_event.clear() # 停止
# 线程间数据传递使用深拷贝
self.captured_frames.copy() # 避免引用问题3. 性能优化
# 帧率控制
frame_interval = 1.0 / self.target_fps
if current_time - self.last_capture_time < frame_interval:
self.msleep(1) # 精确睡眠
continue
# 进度报告分批处理
progress = int((i + 1) / total_frames * 40) # 分阶段报告| 库名 | 用途 | 版本要求 | 说明 |
|---|---|---|---|
| PySide6 | GUI框架 | ≥6.4.0 | Qt的Python绑定 |
| opencv-python | 图像处理 | ≥4.8.0 | 格式转换、缩放 |
| numpy | 数值计算 | ≥1.24.0 | 数组操作 |
| Pillow | GIF编码 | ≥10.0.0 | PIL的升级版 |
单线程的问题:
假设录制30秒,每秒10帧,共300帧
编码需要5秒
如果是单线程:
- UI会卡死5秒
- 用户无法进行任何操作
- 体验极差
多线程的解决方案:
主线程:UI界面,响应用户操作
捕获线程:专门负责抓取屏幕
编码线程:专门负责生成GIF
三个线程并行工作,互不阻塞
时间线 →
─────────────────────────────────────
主线程:显示界面 ←→ 处理用户点击 ←→ 更新进度条
│ │ ↑
│ 启动 │ 停止 │ 信号
▼ ▼ │
捕获线程:──捕获1──捕获2──...──停止────┘
│
启动
▼
编码线程: ──处理1──处理2──...
使用Qt信号/槽:
# 定义信号
class ScreenCaptureThread(QThread):
frame_captured = Signal(np.ndarray) # 传递帧数据
capture_finished = Signal() # 完成信号
capture_error = Signal(str) # 错误信号
# 连接信号
self.capture_thread.frame_captured.connect(self.on_frame_captured)
self.capture_thread.capture_error.connect(self.on_capture_error)
# 发射信号
self.frame_captured.emit(frame)使用Event控制线程:
# 线程控制
self.capture_event = Event()
self.capture_event.set() # 开始
# 线程循环中检查
while self.is_running:
if not self.capture_event.is_set():
break # 退出循环
# ... 捕获逻辑原则:不要直接共享可变数据
正确做法:
# 在捕获线程中收集帧
self.frames.append(frame) # 线程内部列表
# 主线程获取副本
frames_copy = self.capture_thread.get_frames() # 返回.copy()
# 传递给编码线程时也使用副本
self.encode_thread = GIFEncodingThread(
self.captured_frames.copy(), # 关键:使用副本
# ... 其他参数
)错误做法:
# 不要这样做!
self.captured_frames = self.capture_thread.frames # 直接引用
# 两个线程会同时修改同一个列表启动顺序:
def _on_start_capture(self):
# 1. 重置状态
self.captured_frames = []
# 2. 创建线程
self.capture_thread = ScreenCaptureThread(self.capture_rect)
# 3. 连接信号
self.capture_thread.frame_captured.connect(...)
# 4. 启动线程
self.capture_thread.start()停止顺序:
def _on_stop_capture(self):
# 1. 设置停止标志
self.is_recording = False
# 2. 通知线程停止
if self.capture_thread:
self.capture_thread.stop() # 设置内部标志
# 3. 等待线程结束(带超时)
self.capture_thread.wait(1000) # 最多等1秒
# 4. 清理线程对象
self.capture_thread = NoneCPU使用:
- 捕获线程:约5-15% CPU(取决于FPS和区域大小)
- 编码线程:约20-50% CPU(取决于帧数和缩放)
- 总使用:25-65%,对现代CPU友好
内存使用:
- 每帧约 1920×1080×3 = 6.2MB
- 10秒录制(100帧)≈ 620MB
- 程序会占用较多内存,建议:
- 不要录制过长
- 及时生成GIF释放内存
- 4GB内存电脑建议录制不超过5秒
最佳实践:
# 帧率与内存关系
# 10fps × 30秒 = 300帧 × 6.2MB = 1.86GB
# 建议:15秒内录制,或降低FPS超时处理:
def wait_with_timeout(self, thread, timeout_ms):
"""等待线程结束,带超时"""
if not thread.wait(timeout_ms):
print("线程未正常结束,强制终止")
thread.terminate() # 不推荐,仅作最后手段
thread.wait()异常传播:
try:
# 可能出错的捕获逻辑
frame = cv2.cvtColor(...)
except Exception as e:
# 通过信号传递错误
self.capture_error.emit(f"捕获失败: {str(e)}")
# 继续运行,不要崩溃配置文件保存在程序所在目录:
程序目录\screentogif_config.json
例如:
D:\Tools\ScreenToGIF\screentogif_config.jsonC:\Users\用户名\Desktop\ScreenToGIF\screentogif_config.json
{
"output_directory": "D:\\Tools\\ScreenToGIF\\ScreenToGIF_Recordings",
"fps": 10,
"scale_percent": 100,
"quality": 80,
"auto_start": false,
"show_preview": true,
"frame_skip": 0,
"colors": 256,
"window_x": 100,
"window_y": 100,
"window_width": 900,
"window_height": 700,
"last_selection": {
"x": 500,
"y": 300,
"width": 800,
"height": 600
}
}| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_directory |
string | 程序目录/ScreenToGIF_Recordings | GIF保存位置 |
fps |
int | 10 | 帧率 (1-30) |
scale_percent |
int | 100 | 缩放比例 (10-200) |
quality |
int | 80 | 质量 (1-100) |
auto_start |
bool | false | 选择区域后自动录制 |
show_preview |
bool | true | 显示实时预览 |
frame_skip |
int | 0 | 帧跳过(预留) |
colors |
int | 256 | 颜色数 (2-256) |
window_x |
int | 100 | 主窗口X坐标 |
window_y |
int | 100 | 主窗口Y坐标 |
window_width |
int | 900 | 主窗口宽度 |
window_height |
int | 700 | 主窗口高度 |
last_selection |
object | null | 上次选择区域 |
何时需要手动修改:
- 程序无法正常启动,需要重置配置
- 批量部署时预设配置
- 调试特定问题
修改步骤:
- 关闭ScreenToGIF程序
- 用记事本打开
screentogif_config.json - 修改需要的值
- 保存文件(确保JSON格式正确)
- 重新启动程序
示例:重置所有设置
// 删除或重命名配置文件
// 程序会自动生成默认配置示例:预设输出目录
{
"output_directory": "D:\\MyGIFs",
"fps": 8,
"colors": 128
}什么时候自动保存:
- 修改任何设置(FPS、缩放等)
- 移动或调整窗口大小
- 选择录制区域
- 关闭程序时
保存机制:
def _save_config(self):
"""保存配置到文件"""
# 1. 从UI读取当前值
self.config.fps = self.fps_spin.value()
self.config.window_x = self.x()
# ...
# 2. 写入文件
with open(self.config_file, 'w', encoding='utf-8') as f:
json.dump(asdict(self.config), f, ensure_ascii=False, indent=2)设计原则:
- 向后兼容:新版本可以读取旧配置
- 缺失字段用默认值填充
- 无效值自动修正
示例:
@classmethod
def load_from_file(cls, filepath):
try:
with open(filepath, 'r') as f:
data = json.load(f)
# 使用**data填充,缺失的用默认值
return cls(**data)
except:
# 出错时返回默认配置
return cls()最低配置(勉强运行):
- CPU:双核 2.0GHz
- 内存:2GB
- 硬盘:HDD
- 适用场景:录制800×600以下,FPS≤8
推荐配置(流畅运行):
- CPU:四核 2.5GHz+
- 内存:4GB+
- 硬盘:SSD
- 适用场景:录制1920×1080,FPS≤15
最佳配置(专业使用):
- CPU:六核/八核 3.0GHz+
- 内存:8GB+
- 硬盘:NVMe SSD
- 适用场景:录制4K,FPS≤20,大量编辑
技巧1:减少录制区域
原区域:1920×1080 (207万像素)
缩小到:1280×720 (92万像素)
性能提升:处理时间减少55%,内存减少55%
技巧2:降低FPS
FPS 15 → 10:帧数减少33%
编码时间减少约30%
内存使用减少33%
技巧3:使用较低颜色数
256色 → 128色
编码时间减少约15%
文件大小减少约20%
技巧4:分段录制
不要一次录制5分钟
改为5次1分钟录制
优点:
- 内存压力小
- 出错只需重录一段
- 便于后期编辑
问题:大量帧占用内存
解决方案:
- 及时编码:
# 录制完成后立即编码
# 不要堆积多个录制- 限制帧数:
# 估算内存
帧内存 = 宽度 × 高度 × 3 (RGB) / 1024 / 1024 (MB)
示例:1920×1080×3 = 6.2MB/帧
100帧 = 620MB
200帧 = 1.24GB
300帧 = 1.86GB
建议:不超过200帧(约20秒@10fps)- 监控内存使用:
import psutil
def check_memory():
process = psutil.Process()
mem = process.memory_info().rss / 1024 / 1024
print(f"当前内存使用: {mem:.1f} MB")问题:编码时CPU占用高
解决方案:
- 降低缩放比例:
缩放100% → 缩放50%
像素数减少75%
CPU时间减少约60%
- 使用更低质量:
质量90% → 质量70%
编码复杂度降低
CPU时间减少约20%
- 编码时暂停其他任务:
- 编码时关闭浏览器、游戏等
- 让出CPU资源给编码线程
问题:保存大文件时写入慢
解决方案:
- 使用SSD:
HDD写入:50-100 MB/s
SSD写入:300-500 MB/s
NVMe SSD:1000-3000 MB/s
- 保存到本地:
避免保存到:
- 网络驱动器
- USB 2.0外置硬盘
- 云同步文件夹(如OneDrive)
- 预留空间:
- 确保磁盘有足够剩余空间
- 大GIF需要临时空间
测试脚本:
import time
import psutil
def performance_test():
start_time = time.time()
start_mem = psutil.Process().memory_info().rss
# 执行录制/编码操作
# ...
end_time = time.time()
end_mem = psutil.Process().memory_info().rss
print(f"耗时: {end_time - start_time:.2f}秒")
print(f"内存增加: {(end_mem - start_mem)/1024/1024:.1f} MB")性能指标参考:
| 操作 | 耗时参考 | 内存增加 | 优化目标 |
|---|---|---|---|
| 10秒录制(1080p,10fps) | 10秒(实时) | 200MB | 不适用 |
| 编码100帧(1080p) | 3-5秒 | 100MB | <3秒 |
| 编码200帧(1080p) | 6-10秒 | 200MB | <8秒 |
| 编码500帧(720p) | 15-25秒 | 300MB | <20秒 |
场景描述: 张老师是一名中学数学老师,需要录制解题过程发给学生。
需求:
- 展示数学公式推导
- 显示解题步骤
- 学生可以反复观看
- 文件不要太大,便于微信发送
解决方案:
录制区域:800×600(聚焦解题区域)
FPS:8(足够看清步骤)
缩放:100%(保持公式清晰)
颜色:256色(数学符号需要清晰)
录制时长:每道题2-3分钟
操作步骤:
- 打开几何画板/PPT
- 选择800×600区域
- 设置FPS=8,颜色=256
- 开始录制,讲解并书写
- 停止录制
- 编辑:删除开头准备和结尾多余帧
- 生成GIF,命名为"二次函数解法.gif"
效果:
- 文件大小:约3-5MB
- 学生:可以在手机上反复观看
- 老师:一次录制,永久使用
场景描述: 李老师是化学老师,需要演示实验操作步骤。
需求:
- 展示实验仪器摆放
- 显示试剂加入顺序
- 记录颜色变化过程
- 安全注意事项标记
解决方案:
录制区域:1280×720(覆盖整个实验台)
FPS:10(捕捉颜色变化)
缩放:100%(保持细节)
颜色:256色(保留颜色变化)
特别注意:提前准备,减少失误
技巧:
- 录制前摆放好所有仪器
- 每步操作后停顿2秒
- 可以在编辑时删除等待时间
- 配合外部工具添加文字说明
场景描述: 王老师教英语,需要展示单词拼写和发音。
需求:
- 显示单词
- 展示音标
- 鼠标轨迹指示
- 可以反复播放
解决方案:
录制区域:800×400(只显示单词区域)
FPS:5(足够看清拼写)
缩放:150%(放大显示)
颜色:128色(文字为主)
效果:
- 学生:看清每个字母的书写顺序
- 老师:不用重复讲解
- 可用于课前预习和课后复习
场景描述: 培训机构制作软件操作培训材料。
需求:
- 展示软件完整操作流程
- 标注关键步骤
- 可嵌入PPT或PDF
- 支持离线观看
工作流程:
-
准备阶段
- 编写操作脚本
- 准备测试数据
- 关闭无关程序
-
录制阶段
区域:全屏或软件窗口 FPS:10 缩放:80%(适应PPT大小) 颜色:256色 -
编辑阶段
- 删除等待时间
- 删除失误操作
- 调整操作顺序
- 添加指示(需外部工具)
-
发布阶段
- 嵌入培训文档
- 上传学习平台
- 邮件发送给学员
场景描述: 测试人员发现了一个Bug,需要向开发人员复现。
需求:
- 展示触发Bug的步骤
- 显示错误现象
- 附上环境信息
- 文件要小,便于在Issue中上传
示例:
Bug标题:点击保存按钮时程序崩溃
录制内容:
1. 打开程序
2. 输入测试数据
3. 点击保存按钮
4. 程序崩溃(显示错误对话框)
录制设置:
区域:800×600(聚焦程序窗口)
FPS:8
缩放:100%
颜色:256色
成果:
文件:bug_save_crash.gif (1.2MB)
开发人员:10秒看懂问题
效率提升:从文字描述(5分钟)→ 动图(10秒)
场景描述: 代码审查时,需要展示代码修改和运行效果。
需求:
- 展示修改前后的代码
- 显示运行结果对比
- 演示特定功能
- 便于远程审查
操作流程:
-
录制代码修改
区域:IDE编辑器区域 FPS:5(代码输入不快) 缩放:100%(保持代码可读) 颜色:32色(语法高亮足够) -
录制运行结果
区域:程序窗口 FPS:10 缩放:100% 颜色:256色 -
合并说明
- 用外部工具合并两个GIF
- 添加文字说明
场景描述: 演示API接口的调用过程和返回结果。
需求:
- 展示API请求构造
- 显示请求头和参数
- 展示返回数据
- 演示不同参数的效果
示例:
工具:Postman或Swagger UI
录制区域:1200×800
FPS:8
缩放:80%
颜色:128色
步骤:
1. 输入API地址
2. 设置请求头
3. 填写参数
4. 点击发送
5. 展示返回结果
场景描述: 向运维团队演示软件部署步骤。
需求:
- 展示命令行操作
- 显示配置文件修改
- 展示服务启动过程
- 验证部署结果
技巧:
- 使用等宽字体,提高可读性
- 录制前准备好命令,减少输入时间
- 重要输出用鼠标圈出
- 录制后编辑,删除命令等待时间
设置建议:
区域:终端窗口(80×25字符)
FPS:5
缩放:100%
颜色:16色(终端颜色足够)
文件大小:极小,适合嵌入文档
场景描述: UI设计师向客户展示交互设计效果。
需求:
- 展示页面切换动画
- 演示按钮悬停效果
- 显示菜单展开过程
- 模拟真实操作
设置建议:
区域:设计稿或原型区域
FPS:15(捕捉动画细节)
缩放:100%(保持设计精确)
颜色:256色(保留设计色彩)
质量:90%(画质优先)
示例:App首页交互演示
录制内容:
1. 页面初始状态
2. 向上滑动(展示更多内容)
3. 点击菜单按钮
4. 菜单展开动画
5. 选择菜单项
6. 页面跳转动画
成果:一个GIF完整展示App的核心交互
场景描述: 记录从草图到成品的完整设计过程。
需求:
- 展示创作思路
- 记录修改过程
- 分享设计技巧
- 制作教学素材
录制策略:
-
分阶段录制
阶段1:草图绘制(5fps) 阶段2:上色(8fps) 阶段3:细节调整(5fps) 阶段4:最终效果(10fps) -
后期编辑
- 删除长时间的思考停顿
- 加速重复性操作
- 保留关键步骤
场景描述: 展示3D模型的旋转和细节。
需求:
- 360度旋转展示
- 展示不同材质
- 显示线框模式
- 演示动画效果
设置建议:
区域:3D软件视口
FPS:20(流畅旋转)
缩放:100%(保留细节)
颜色:256色
质量:100%(画质优先)
注意:
- 使用专业显卡
- 关闭不必要的视图
- 录制前预演一遍
场景描述: 展示不同配色方案的效果对比。
需求:
- 显示色板
- 展示应用效果
- 切换不同方案
- 演示色彩关系
技巧:
录制两个版本:
1. 静态展示:5fps,逐项展示
2. 动态切换:15fps,流畅过渡
编辑时并排对比
或者制作两个GIF分别展示
场景描述: 在社交媒体上展示新产品功能。
需求:
- 吸引眼球
- 快速展示核心功能
- 适合移动端观看
- 文件大小符合平台限制
平台限制:
| 平台 | 最大文件 | 推荐尺寸 |
|---|---|---|
| 5MB | 800×600 | |
| 微信 | 2MB | 640×480 |
| 8MB | 720p | |
| 5MB | 800×600 | |
| 邮件 | 10MB | 1024×768 |
优化策略:
-
针对Twitter优化
目标:5MB以内 设置: - 缩放:70%(1920×1080 → 1344×756) - FPS:8 - 颜色:128色 - 质量:70% - 时长:<10秒 -
针对微信优化
目标:2MB以内 设置: - 缩放:50% - FPS:6 - 颜色:64色 - 质量:60% - 时长:<8秒
场景描述: 制作Email营销中的动态广告。
需求:
- 突出产品亮点
- 引导点击
- 兼容所有邮件客户端
- 文件小(邮件附件限制)
设计要点:
1. 前3帧最重要(抓住注意力)
2. 循环播放(自动重复)
3. 最后帧包含CTA(行动号召)
4. 尺寸适中(600×400常见)
示例:电商促销
帧1:商品图片(停留1秒)
帧2:价格标签出现
帧3:"限时折扣"文字动画
帧4:"点击购买"按钮
帧5-8:循环播放
场景描述: 在YouTube或B站视频中插入GIF教程。
需求:
- 清晰展示操作
- 可与视频画面共存
- 循环播放强调重点
- 文件小不影响视频加载
制作流程:
-
录制核心操作
区域:只录必要部分 FPS:10 缩放:100% -
后期编辑
- 去除开头结尾
- 加速中间过程
- 添加标注(外部工具)
-
嵌入视频
- 放在屏幕角落
- 与视频内容同步
- 适当透明背景
场景描述: 从视频中截取片段制作表情包。
需求:
- 捕捉有趣瞬间
- 尺寸小
- 循环自然
- 适合聊天使用
技巧:
1. 选择2-3秒的片段
2. 设置FPS=10(平衡流畅和大小)
3. 缩放50%(聊天窗口够用)
4. 颜色64色(表情包不需要太多颜色)
5. 编辑时让循环点自然
示例:猫咪打哈欠
- 从张嘴到闭嘴完整周期
- 编辑成无缝循环
- 最终文件 < 500KB
场景描述: 编写软件用户手册,需要动态插图。
需求:
- 展示软件操作
- 说明界面功能
- 可嵌入PDF/Word
- 读者可反复观看
最佳实践:
-
截图不够用的情况
问题:如何导出数据? 截图:显示菜单项 GIF:展示完整的点击导出过程 效果:GIF让用户一看就懂 -
多步骤操作
文字描述:5个步骤,200字 GIF展示:5秒看完 结合使用:文字+GIF,效果最佳
场景描述: 编写常见问题解决方案,附带动图演示。
需求:
- 显示错误现象
- 展示解决步骤
- 验证问题已解决
- 用户可对照操作
示例:打印机无法连接
GIF 1:错误现象(打印机离线状态)
GIF 2:检查打印机电源和连接
GIF 3:打开控制面板
GIF 4:找到打印机设置
GIF 5:重新添加打印机
GIF 6:测试打印成功
用户:按图操作,轻松解决问题
场景描述: 为企业新员工编写系统操作培训材料。
需求:
- 系统性展示业务流程
- 可自学
- 包含练习案例
- 便于更新维护
结构化方法:
-
模块划分
模块1:登录系统(30秒GIF) 模块2:创建订单(2分钟GIF) 模块3:审批流程(1分钟GIF) 模块4:报表导出(45秒GIF) -
每模块包含
- 学习目标(文字)
- 操作演示(GIF)
- 关键点说明(文字)
- 练习任务(文字)
场景描述: 在产品官网建立在线帮助中心。
需求:
- 快速加载
- 移动端适配
- 便于搜索
- 支持多语言
技术方案:
1. GIF压缩到极致
- 缩放:50-70%
- FPS:5-8
- 颜色:64-128色
- 使用工具进一步压缩
2. 懒加载
- 用户滚动到才加载
- 使用loading="lazy"
3. 替代方案
- 提供视频链接(清晰度更高)
- 提供截图(无法播放时)
发布日期:2026-01-15
✅ 核心功能
- 基础屏幕区域选择
- GIF录制功能
- 基础设置(FPS、缩放、质量、颜色数)
- 实时预览
✅ 用户界面
- 简洁的双面板布局
- 基本按钮和控件
- 状态显示
✅ 配置管理
- 自动保存设置
- 恢复上次选择区域
- Python 3.8 + PySide6
- 单线程处理(UI和录制在同一线程)
- 使用OpenCV进行图像处理
- PIL生成GIF
❌ 录制时UI会轻微卡顿
❌ 不支持帧编辑
❌ 不支持播放预览
❌ 内存占用较高
"基本功能都有了,就是录制时间长会卡"
"希望能编辑帧,有时候录错了要重来"
"要是能预览就好了,生成才发现问题"
发布日期:2026-01-28
✅ 性能优化
- 引入多线程(录制线程独立)
- UI响应更流畅
- 减少录制卡顿
✅ Bug修复
- 修复区域选择时的屏幕闪烁
- 修复高DPI下的显示问题
- 修复配置文件损坏问题
✅ 用户体验
- 添加进度条显示
- 改进状态提示
- 优化错误处理
- 使用QThread分离录制逻辑
- 添加信号/槽机制
- 改进内存管理
"流畅多了,可以边录边干别的"
"进度条很有用,知道还要等多久"
"没再遇到闪退了"
发布日期:2026-02-10
✅ GIF播放器
- 播放录制的帧
- 速度调节(0.5x, 1.0x, 1.5x, 2.0x)
- 帧滑块手动定位
- 停止和暂停控制
✅ 历史记录
- 显示最近生成的GIF
- 双击打开文件位置
- 快速访问输出目录
✅ 菜单栏
- 文件菜单
- 编辑菜单
- 视图菜单(窗口置顶)
- 帮助菜单(关于)
- 按钮样式优化
- 添加图标和颜色区分
- 工具提示说明
"播放器太实用了,生成前就能预览效果"
"历史记录很方便,不用去文件夹找了"
"窗口置顶功能好评!"
发布日期:2026-02-25
✅ 帧编辑器
- 删除当前帧
- 批量删除选定帧
- 调整帧顺序(上移/下移)
- 缩略图列表
- 播放预览
- 重置功能
✅ 编辑器界面
- 双面板布局(列表+预览)
- 滑块快速定位
- 帧计数显示
- 选择范围提示
- 新增"录制后操作"组
- 播放和编辑按钮独立
- 更清晰的状态提示
"终于可以删除录错的部分了!"
"批量删除省了好多时间"
"缩略图列表很直观,找帧方便"
发布日期:2026-03-11
✅ 项目信息元数据
- 统一版本管理
- 窗口标题显示版本和构建日期
- 完善版权信息
✅ 输出目录优化
- 强制使用程序目录下的子目录
- 防止输出到系统目录导致权限问题
- 自动创建目录
✅ 稳定性改进
- 改进路径处理(使用os.path.abspath)
- 增强配置加载健壮性
- 更好的错误处理
- 修复输出目录被意外修改的问题
- 修复多屏环境下的区域选择问题
- 修复某些格式QImage转换错误
- 使用ProjectInfo类集中管理元数据
- 改进_ensure_output_directory逻辑
- 增强配置文件的兼容性
"现在不用担心GIF存到哪里去了"
"版本信息一目了然"
"更稳定了,没遇到崩溃"
| 快捷键 | 功能 | 说明 |
|---|---|---|
Ctrl+R |
选择录制区域 | 快速开始选择 |
Ctrl+S |
开始录制 | 需先选择区域 |
Ctrl+T |
停止录制 | 录制中有效 |
Ctrl+E |
编辑帧 | 有录制内容时 |
Ctrl+P |
播放录制 | 有录制内容时 |
Ctrl+G |
生成GIF | 有录制内容时 |
Ctrl+O |
打开输出文件夹 | 快速访问 |
Ctrl+Q |
退出程序 | 安全退出 |
F1 |
帮助 | 打开本文档 |
| 快捷键 | 功能 | 说明 |
|---|---|---|
ESC |
取消选择 | 退出选择模式 |
Enter |
确认选择 | 同鼠标松开 |
| 快捷键 | 功能 | 说明 |
|---|---|---|
Space |
播放/暂停 | 预览效果 |
Delete |
删除当前帧 | 需选中 |
Ctrl+A |
全选 | 选择所有帧 |
Ctrl+D |
取消全选 | 清除选择 |
↑ |
上一帧 | 当预览区激活 |
↓ |
下一帧 | 当预览区激活 |
Ctrl+Z |
(预留) | 未来版本支持 |
| 快捷键 | 功能 | 说明 |
|---|---|---|
Space |
播放/暂停 | 控制播放 |
Esc |
停止 | 回到第一帧 |
→ |
下一帧 | 步进一帧 |
← |
上一帧 | 步进一帧 |
Home |
第一帧 | 跳转到开头 |
End |
最后一帧 | 跳转到结尾 |
APNG:Animated Portable Network Graphics,动态PNG,支持24位真彩色和8位透明,比GIF画质更好但兼容性略差。
BGR:Blue-Green-Red,OpenCV默认的颜色通道顺序,与常见的RGB顺序相反。
CV2:OpenCV的Python模块,用于图像处理和计算机视觉任务。
dataclass:Python的数据类装饰器,简化类的定义,自动生成__init__等方法。
FPS:Frames Per Second,每秒帧数,衡量动画流畅度的单位。
GIF:Graphics Interchange Format,图形交换格式,支持256色和简单动画。
ICC:International Color Consortium,国际色彩联盟,定义色彩管理标准。
JSON:JavaScript Object Notation,轻量级数据交换格式,用于存储配置。
loop:循环,GIF可以设置循环次数(0表示无限循环)。
MVC:Model-View-Controller,模型-视图-控制器,软件设计模式。
NumPy:Python的科学计算库,提供多维数组对象。
OpenCV:Open Source Computer Vision Library,开源计算机视觉库。
PIL:Python Imaging Library,Python图像处理库,Pillow是其升级版。
PySide6:Qt for Python,Qt6的Python绑定,用于创建GUI应用。
QThread:Qt的线程类,用于实现多线程。
QImage:Qt的图像类,支持多种像素格式。
QPixmap:Qt的像素图类,优化用于屏幕显示。
RGB:Red-Green-Blue,红绿蓝三原色,常见的颜色模型。
Signal/Slot:Qt的信号/槽机制,用于对象间通信。
Thread:线程,程序执行的最小单元。
UI:User Interface,用户界面。
UX:User Experience,用户体验。
Virtual Desktop:虚拟桌面,多显示器组合成的逻辑桌面。
WebP:Google开发的图像格式,支持有损/无损压缩和动画。
GitHub Issues(推荐)
- 网址:https://github.com/duma520/ScreenToGIF/issues
- 用途:报告Bug、提出新功能建议
- 优势:公开记录,其他用户也能受益
GitHub Discussions
- 网址:https://github.com/duma520/ScreenToGIF/discussions
- 用途:使用问题、技巧分享、交流讨论
- 优势:社区互助,积累知识
好的Bug报告包含:
1. 环境信息
- 操作系统:Windows 11 23H2
- 程序版本:1.0.4
- 屏幕分辨率:1920×1080,150%缩放
2. 复现步骤
- 打开程序
- 选择800×600区域
- 点击开始录制
- 等待10秒
- 点击停止录制
- 程序崩溃
3. 预期结果
- 正常停止录制,帧显示在预览区
4. 实际结果
- 程序无响应,然后自动关闭
5. 错误日志
- 如果有错误窗口,截图或复制文字
- 命令行运行的错误输出
6. 附件
- 配置文件(screentogif_config.json)
- 相关截图
Q: 程序启动后闪退 A:
- 检查Python版本(需3.8+)
- 检查依赖库是否完整
- 删除配置文件重启
- 查看系统事件日志
Q: 录制画面黑屏 A:
- 检查是否有程序在全屏运行
- 尝试降低录制区域
- 检查显卡驱动
- 重启程序
Q: GIF生成特别慢 A:
- 降低FPS
- 降低缩放比例
- 减少录制时长
- 关闭其他程序
欢迎提交Pull Request!
贡献流程:
- Fork项目
- 创建特性分支
- 提交修改
- 确保通过测试
- 发起Pull Request
代码规范:
- 遵循PEP 8
- 添加适当的注释
- 保持向后兼容
- 更新文档
版权声明: © 永久 杜玛 保留所有权利
许可证: GNU Affero General Public License v3.0
使用条款:
- ✅ 个人免费使用
- ✅ 修改后分享需开源
- ✅ 商业使用需联系我们
- ❌ 未经许可不得转载文档
- ❌ 不得用于违法用途
如何支持:
- ⭐ 在GitHub上给项目点星
- 🔗 分享给需要的朋友
- 🐛 报告Bug和提出建议
- 📝 贡献文档或代码
- 💬 在社区帮助其他用户
我们承诺:
- 永久免费提供基础功能
- 持续改进和更新
- 重视每个用户反馈
- 保持开源精神
感谢您选择ScreenToGIF屏幕录制工具!无论您是刚接触电脑的新手,还是经验丰富的开发者,我们都希望这个工具能帮助您更高效地工作和创作。
记住三句话:
- 新手别怕,基础功能很简单
- 高手别急,进阶功能很强大
- 有问必答,社区支持很热情
最后:
- 录制快乐!🎉
- 创作愉快!✨
- 分享开心!🌟
文档版本:1.0.4
最后更新:2026-03-11
文档作者:杜玛
版权声明:© 永久 杜玛 保留所有权利
本文档地址:https://github.com/duma520/ScreenToGIF/wiki
本文档以Markdown格式编写,可在GitHub上查看和下载。
建议使用支持Markdown的阅读器获得最佳阅读体验。