牙叔教程 简单易懂
这是给单张图片打关键帧的教程,
给图片打关键帧有四个步骤
- 鼠标点选图片
- 打起始帧
- 跳转到图片末尾
- 打结束帧
打帧是一件很费手的事情, 所以我写了个自动化的代码,
专门用来打关键帧, 使用的软件是 AutoHotkey
关键帧参数的详细解释
https://mp.weixin.qq.com/s/7GnS3HnXCiPO4owgGZLSsA
目前的使用效果
鼠标点击图片, 播放头放图片第一帧,
点击按钮, 即可打关键帧
只适用于打简单的关键帧,
如果想要图片中的人物的脸一直漏出来,
那么就需要接入人脸识别, 识别图片中的人脸区域
关键帧打多了, 觉得没必要上人脸识别
我们看看四个步骤, 哪些可以自动化
第一步 鼠标点选图片
这个做不了自动化, 我也是手动点的,
不是说AutoHotkey点不了鼠标,
而是不能判断应该点击哪里
第二步 打起始帧
这个只有两个动作
- 点击
- 输入框输入数字
这必然是可以自动化的
第三步 跳转到图片末尾
在第二步做完的时候, 播放头在图片的第一帧,
我们记下此时的图片特征,
我自己选择的特征是, 以图片中心为参考系, 取9个点的颜色,
以此为图片特征
然后, 按快捷键 ↓ , 播放后会移动,
那么图片变不变呢? 这就要靠图片特征来判断了,
如果按了 ↓ , 图片没有变化, 那么我们就继续按 ↓ ,
这就要加一个循环判断操作
这必然是可以自动化的, 看我咋写的 跳到结束帧
跳到结束帧() {
图片特征current := 获取当前图片特征()
Send "{Down}"
; Sleep delayBetweenKeys
Sleep 200
foundIt := False
loop 10 {
图片特征afterTouchDownKey := 获取当前图片特征()
if (图片特征current == 图片特征afterTouchDownKey) {
OutputDebug "图片特征current == 图片特征afterTouchDownKey"
图片特征current := 获取当前图片特征()
Send "{Down}"
Sleep 200
}else{
OutputDebug "图片特征current != 图片特征afterTouchDownKey"
foundIt := True
break
}
}
if (!foundIt) {
OutputDebug "没有找到结束帧"
SoundBeep 666
Sleep 500
SoundBeep 666
Sleep 200
Exit ;
return
}
Send "{Left}"
Sleep delayBetweenKeys
}
获取图片特征的代码
获取当前图片特征() {
图片特征点 := config.剪映.图片特征点
center := 图片特征点.center
distance := 图片特征点.distance
; 生成包含九个点坐标的数组
points := []
for _, yOffset in [-1, 0, 1] {
y := center.y + distance * yOffset
for _, xOffset in [-1, 0, 1] {
x := center.x + distance * xOffset
points.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 * yOffset
for _, xOffset in [-1, 0, 1] {
x := center.x + distance * xOffset
points.Push({ x: x, y: y })
}
}
基本代码就是有以上几条命令组成,
实际上我写了四个文件
分别是
- 配置文件, 主要是各个按钮的坐标
- UI界面, 也就是这几个按钮
- main文件, 主流程
- service 服务函数
- utils 工具函数
这一个小小的打关键帧功能, 大概 500 行代码