牙叔教程 简单易懂
这是给单张图片打关键帧的教程,
给图片打关键帧有四个步骤
- 鼠标点选图片
- 打起始帧
- 跳转到图片末尾
- 打结束帧
打帧是一件很费手的事情, 所以我写了个自动化的代码,
专门用来打关键帧, 使用的软件是 AutoHotkey
关键帧参数的详细解释
剪映 自动打关键帧 AutoHotkey
目前的使用效果
鼠标点击图片, 播放头放图片第一帧,
点击按钮, 即可打关键帧
只适用于打简单的关键帧,
如果想要图片中的人物的脸一直漏出来,
那么就需要接入人脸识别, 识别图片中的人脸区域
关键帧打多了, 觉得没必要上人脸识别
我们看看四个步骤, 哪些可以自动化
第一步 鼠标点选图片
这个做不了自动化, 我也是手动点的,
不是说AutoHotkey点不了鼠标,
而是不能判断应该点击哪里
第二步 打起始帧
这个只有两个动作
- 点击
- 输入框输入数字
这必然是可以自动化的
第三步 跳转到图片末尾
在第二步做完的时候, 播放头在图片的第一帧,
我们记下此时的图片特征,
我自己选择的特征是, 以图片中心为参考系, 取9个点的颜色,
以此为图片特征
然后, 按快捷键 ↓ , 播放后会移动,
那么图片变不变呢? 这就要靠图片特征来判断了,
如果按了 ↓ , 图片没有变化, 那么我们就继续按 ↓ ,
这就要加一个循环判断操作
这必然是可以自动化的, 看我咋写的 跳到结束帧
跳到结束帧() {图片特征current := 获取当前图片特征()Send "{Down}"; Sleep delayBetweenKeysSleep 200foundIt := Falseloop 10 {图片特征afterTouchDownKey := 获取当前图片特征()if (图片特征current == 图片特征afterTouchDownKey) {OutputDebug "图片特征current == 图片特征afterTouchDownKey"图片特征current := 获取当前图片特征()Send "{Down}"Sleep 200}else{OutputDebug "图片特征current != 图片特征afterTouchDownKey"foundIt := Truebreak}}if (!foundIt) {OutputDebug "没有找到结束帧"SoundBeep 666Sleep 500SoundBeep 666Sleep 200Exit ;return}Send "{Left}"Sleep delayBetweenKeys }
获取图片特征的代码
获取当前图片特征() {图片特征点 := config.剪映.图片特征点center := 图片特征点.centerdistance := 图片特征点.distance; 生成包含九个点坐标的数组points := []for _, yOffset in [-1, 0, 1] {y := center.y + distance * yOffsetfor _, xOffset in [-1, 0, 1] {x := center.x + distance * xOffsetpoints.Push({ x: x, y: y })}}; 获取九个点的颜色colors := []for index, point in points {color := PixelGetColor(point.x, point.y)colors.Push(color)}; 构建字符串格式的返回值result := ""for index, point in points {result .= point.x "," point.y "," colors[index] "|"}result := SubStr(result, 1, StrLen(result) - 1) ; 去除最后一个分隔符 "|"return result}
第四步 打结束帧
这个和打开始帧是一样的, 就不说了
目前我测试, 自己是在用的,
只是那些出现半个脑袋的
需要手动重新打帧,
综合来讲, 我自己比较满意
总结 要使用的AutoHotkey命令
点击命令 用于点击关键帧, 还有输入框
MouseClick "left", x, y, 1
输入数据, 用于输入关键帧数值
Send "134"
延时 用于动作之间的等待时间
Sleep 200
回车键, 输入框输入后要点击回车键
Send "{Enter}"
方向键 用于跳转到图片的尾帧
Send "{Down}" Send "{Left}"
获取图片特征 也就是对比固定点的颜色
color := PixelGetColor(point.x, point.y)
循环
; 生成包含九个点坐标的数组 points := [] for _, yOffset in [-1, 0, 1] {y := center.y + distance * yOffsetfor _, xOffset in [-1, 0, 1] {x := center.x + distance * xOffsetpoints.Push({ x: x, y: y })} }
基本代码就是有以上几条命令组成,
实际上我写了四个文件
分别是
- 配置文件, 主要是各个按钮的坐标
- UI界面, 也就是这几个按钮
- main文件, 主流程
- service 服务函数
- utils 工具函数
这一个小小的打关键帧功能, 大概 500 行代码