智谱
前言:
平时写博客、做教程,经常需要录个 GIF 演示。用 QQ 自带的录制吧,方便是方便,但画质糊得有点难受,而且选区操作也不够顺手。于是自己用 C++ 写了一个小工具,核心就三点:高清一点、简单一点、实用一点。
工具叫「可达鸭 GIF 录制器」,界面只有一个按钮,点开始 → 拖拽选区 → 自动录制,点停止 → 自动保存到程序根目录的 output.gif。没有多余设置,打开就能用。
工具界面展示:

下面是QQ录制效果

能比较明显的感觉到 QQ的不太清晰
使用方法:
-
打开软件,点击「开始录制」
-
像 QQ 截图一样拖拽选区
-
松开鼠标,自动开始录制
-
点击「停止录制」,GIF 自动保存到程序所在目录
工具核心亮点
1. 比 QQ 录制更清晰
QQ 的 GIF 录制默认压缩得比较狠,颜色和细节丢失明显。我这个工具在帧率和色彩保留上做了取舍,默认 10 帧每秒,对于大多数操作演示足够流畅,同时 GIF 文件不会太大。录文字、代码类内容时,清晰度优势比较明显。
当然,GIF 格式本身最多 256 色,真要比画质肯定比不过 MP4。但在 GIF 这个范围内,它比 QQ 录出来的要干净不少。
2. 像 QQ 截图一样选区
点「开始录制」后,会弹出一个全屏遮罩,直接拖拽鼠标框选要录的区域,用起来和 QQ 截图一模一样。不用记快捷键,不用调参数,松开鼠标就开始录。
3. 一键开始 / 停止,自动保存
按钮就两个状态:开始录制 和 停止录制。停止后自动保存到程序所在目录,文件名固定 output.gif,省得每次都要选保存位置。
4. 轻量无依赖
整个工具基于 MFC 对话框开发,编译出来就一个 exe,不需要额外安装运行库,也不需要配置任何环境。拷贝到任何 Windows 电脑上都能直接跑。
实现思路:
整体逻辑不复杂,但有两个细节值得说一下。
一是录制线程的节奏控制。 录制跑在独立线程里,每帧抓屏后按实际耗时补偿休眠时间,避免抓屏本身的开销拖慢帧率:
const int frameIntervalMs = m_delayCentis * 10;
while (!m_stopRequested.load())
{
DWORD startTick = ::GetTickCount();
if (CaptureFrameInternal())
m_frameCount++;
DWORD elapsed = ::GetTickCount() - startTick;
int sleepMs = frameIntervalMs - static_cast<int>(elapsed);
if (sleepMs > 0)
::Sleep(sleepMs);
}
二是抓屏后的像素格式转换。 抓屏拿到的是 BGRA,GIF 编码需要 RGBA,中间做了一次通道交换,不处理的话录出来颜色会偏:
// GDI 返回 BGRA,gif.h 期望 RGBA => 交换 R/B
for (size_t i = 0; i < rgbaBuffer.size(); i += 4)
std::swap(rgbaBuffer[i], rgbaBuffer[i + 2]);
这款工具是我在实际使用中顺手写出来的,基于 MFC 对话框 + 屏幕捕获 + GIF 编码,代码量不大,逻辑也简单。希望能给有同样需求的朋友一点参考,也欢迎各位技术爱好者一起交流。
开发时间较短,没有大量测试,如果遇到 BUG 请与我联系反馈。

![私有化部署源码[2026-04-13更新]-可达鸭小栈](https://img.ikdya.com/wp-content/uploads/2026/04/20260409080657504.jpg)






暂无评论内容