八哥365手绘短视频,我用Golang写了个能画画的家伙,结果它比我还会整活儿

说实话,最开始我想搞“八哥365手绘短视频”这个事儿,纯粹是因为懒,你没听错,就是懒,我每天刷短视频,看到那些手绘动画——一个小人儿蹦蹦...

说实话,最开始我想搞“八哥365手绘短视频”这个事儿,纯粹是因为懒,你没听错,就是懒,我每天刷短视频,看到那些手绘动画——一个小人儿蹦蹦跳跳,一朵花慢慢绽放,一个故事在几秒钟内被讲完——我就想,这玩意儿要是能自动生成该多好,但我是个写代码的,不是画画的,手绘?我连火柴人都画不利索,于是我想到了一个骚操作:用Golang写个程序,让它替我画。

为什么是Golang?为什么是八哥365?

先说说“八哥365”这个名字,八哥这鸟吧,学舌能力强,但又不是完全复制,它会加点自己的花样,我想要的就是这种效果——程序模仿手绘风格,但每一帧都带点随机的小变化,看起来就像有个活人在画,而不是机器渲染的冰冷帧。

Golang呢?说实话,我选它不是因为它在图形处理界多有名——恰恰相反,Go在GUI和图像生成领域不算主流,但我要的就是这种“非主流”的感觉,Go编译快、并发好、部署简单,让我能快速迭代,用Go写图像处理,有种用螺丝刀拧螺丝的踏实感,不像Python那样啥都有现成的——但那种“啥都有”反而让我觉得没意思。

第一版:一个比小学生画得还丑的程序

我的第一版程序,用Go的image包,在画布上用贝塞尔曲线画了个圆,你以为会很好看?不,画出来像被压扁的土豆,手绘的精髓在于“不完美”,但我这“不完美”过头了。

问题出在哪里?我仔细研究了真正的手绘短视频,你去看那些热门的手绘动画,笔触是有节奏的——起笔重、收笔轻,线条不是一气呵成而是有断点,颜色不是均匀涂抹而是有深有浅,这些细节,我第一版的程序一个都没抓住。

核心难点:随机与规则的平衡

我花了整整两周调参数,一开始是纯随机——每条线的抖动、每个点的偏移都扔给rand.Float64(),结果呢?画出来的东西像喝醉了的蜘蛛网,毫无美感。

后来我换了思路:规则为主,随机为辅,用噪声函数模拟手的抖动,用分段贝塞尔曲线控制笔触的起落,用alpha通道模拟顏料的浓淡,这个阶段,我的代码长这样(简化版):

type Brush struct {
    x, y     float64
    pressure float64 // 模拟压力,0.0-1.0
    angle    float64 // 笔触角度
    speed    float64 // 绘制速度
}
func (b *Brush) Stroke(img *image.RGBA, targetX, targetY float64) {
    // 用Perlin噪声模拟手的自然抖动
    noiseX := perlin.Noise2D(b.x*0.1, b.y*0.1) * 2.0
    noiseY := perlin.Noise2D(b.x*0.1+100, b.y*0.1+100) * 2.0
    stepX := (targetX - b.x) / 10.0
    stepY := (targetY - b.y) / 10.0
    for i := 0; i < 10; i++ {
        drawX := b.x + noiseX * (1 - b.pressure)
        drawY := b.y + noiseY * (1 - b.pressure)
        // 画一个半透明的圆点,模拟笔触
        drawCircle(img, drawX, drawY, b.pressure * 3)
        b.x += stepX
        b.y += stepY
        b.pressure *= 0.95 // 模拟画笔抬起的过渡
    }
}

这段代码看起来挺像那么回事,但跑出来的效果还是一言难尽,不过别急,我还没用到“八哥365”的大招。

让程序学会“手绘”的四个关键点

经过无数次试错——是的,无数次,我的笔记本里全是各种奇怪的输出图——我总结出了八哥365手绘短视频生成系统的四个核心要素,这玩意儿不是魔法,是数学加一点审美。

笔触库:不是画一条线,是画一千条各有特色的线

手绘的美在于每笔都不一样,我建立了一个“笔触库”,里面存了各种类型的笔触示例——铅笔的、炭笔的、马克笔的、毛笔的,每种笔触有不同的宽度变化曲线、透明度变化曲线和抖动模式。

举个例子,铅笔笔触的特点是两头轻中间重,线条有细微的锯齿,而毛笔笔触则是起笔重、收笔轻,线条边缘有自然的晕染效果,我把这些特征参数化,存在Go的struct里,每次绘画时随机选取一种,再叠加实时生成的噪声。

笔触类型 宽度变化 透明度范围 抖动幅度 适用场景
铅笔 5-2.0像素 3-0.8 草图、轮廓
炭笔 0-4.0像素 4-1.0 阴影、背景
马克笔 0-6.0像素 6-0.9 大面积填充
毛笔 0-8.0像素 2-1.0 书法、边缘晕染

实际测试中,铅笔+炭笔的组合最受欢迎,看起来像真正的素描,而有些人喜欢马克笔+毛笔的效果,更像水彩画。

帧间一致性:画完一笔,下一笔不能忘了前面画过啥

这是手绘短视频最坑的地方,如果每帧独立生成,画面会疯狂闪烁——前一秒一根线是歪的,后一秒它又正了,看起来就像视频卡了,我在GitHub上翻了好多项目,最后找到了一个笨办法但很有效:增量绘制

每一帧都在前一帧的基础上继续画,而不是重画,Go的image包让我能方便地操作像素,每次只修改新增的那部分,这样出来的视频,线条是慢慢长出来的,就像有人在实时画一样。

这带来了一个问题:内存占用,一个1080p的视频,30帧每秒,画3分钟,内存占用轻松上几个GB,我用了Go的sync.Pool来缓存帧数据,配合image.RGBA的复用,把内存压到了合理范围。

速度与节奏:画太快像打印机,画太慢像树懒

刚开始生成的视频,要么是“唰”一下画完了,观众还没看清楚;要么是慢吞吞的,急性子直接划走,我研究了B站上播放量高的手绘视频,发现它们都有一个黄金节奏

  • 起笔:0.5-1秒,先勾勒轮廓
  • 铺色:2-3秒,快速填充大面积颜色
  • 细绘:5-10秒,精修细节
  • 收尾:1-2秒,添加高光和阴影

我在代码里实现了帧预算调度——给每种绘画操作分配固定的时间片,超时就强制切换到下一步,比如轮廓阶段最多用60帧,不管画没画完,都要进入铺色阶段。

这是我最满意的部分之一,它让生成的视频有了“呼吸感”,刚写出来的时候,我盯着屏幕看了十几遍,心里只有一个念头:这玩意儿居然能模仿人类的绘画节奏

动作序列:让画面“活”起来

光会画还不够,短视频需要“故事”,我写了个简单的动作序列生成器,用状态机控制画面的演变:

初始 → 轮廓出现 → 主体填充 → 细节添加 → 背景渲染 → 最终效果

每个状态都有预设的笔触参数和绘制路径,轮廓出现”阶段用铅笔,速度快、线条细;“主体填充”阶段用马克笔,速度快但笔触宽。

为了让画面更有趣,我还加了随机打断机制——有时候画到一半,程序会“走神”,回头补一笔之前没画好的地方,或者多画几笔阴影,这模拟了人类绘画时的修改过程,让视频看起来更真实。

从代码到成品:一个完整的八哥365手绘视频是怎么诞生的

好了,理论说了一堆,我们来走一遍完整流程,假设我要生成一个“猫咪打哈欠”的手绘短视频。

第一步:准备素材

我找了一张猫咪打哈欠的参考图,但不是直接用,我需要的是关键帧——猫咪打哈欠过程中的5-8个姿态,我用一个简单的脚本提取了这些姿态的边缘轮廓和色块分布,保存为JSON格式。

第二步:定义绘制顺序

哪个部分先画?我按照人类画画的习惯:先画眼睛——因为眼睛是灵魂——然后画头部轮廓,再画身体,最后加胡须和背景,顺序定义好了,程序才会“有条理”。

第三步:参数随机化

每次运行程序,都会生成不同的参数组合,笔触类型随机选,笔触宽度在一定范围内随机,绘制速度也随机变化,这样同一张图,可以生成截然不同的手绘效果。

第四步:编码输出

Go的ffmpeg绑定帮我完成最后的视频编码,我要求输出是H.264编码的MP4,分辨率1920x1080,帧率24fps,一个3分钟的短视频,渲染时间大约5-8分钟——在Go的并发加持下,比Python快3倍左右。

踩过的坑和没踩的坑

写这个项目的过程中,我犯过很多错误,有些好笑,有些心酸。

第一个坑是颜色空间,我以为RGB就够了,但手绘需要更细腻的颜色过渡,后来改用HSL色彩空间,控制色相、饱和度、明度各自独立变化,效果提升了一大截。

第二个坑是并发冲突,Go的goroutine太方便了,我一开始让几十个goroutine同时画不同的部分,结果出来的画面像是被撕碎后又拼起来的——每个goroutine画自己的,完全不管别人画到哪了,最后我老老实实改成单线程绘制,只在编码阶段用并发。

八哥365手绘短视频,我用Golang写了个能画画的家伙,结果它比我还会整活儿

第三个坑是审美疲劳,生成的视频看多了,我发现自己能一眼看出“这是程序画的”,那些噪声模式、笔触变化、节奏安排,都有固定的套路,为了打破这种模式,我引入了外部随机源——从API获取实时天气数据、新闻标题,甚至比特币价格波动,把这些数据映射到绘画参数中,这样每个视频都是独一无二的,连我都猜不到下一秒会画成啥样。

一个意外之喜:八哥365不只是画画

写这个项目的时候,我本来只想要个画画工具,但后来发现,这个系统能做的事情比想象中多

我用它生成了“城市天际线从白天到黑夜”的手绘动画,输出给朋友看,她说“像在翻一本会动的速写本”,还有个做教育的朋友,让我帮他生成物理实验的手绘版流程演示,说是比标准动画更吸引学生注意力。

最有意思的一次,我试着用八哥365把一段音乐转成手绘动画,把音频的频谱数据映射到笔触参数上——低频对应大笔触,高频对应细线条,结果生成了一段完全抽象的手绘视频,看起来就像有人在听歌时随手涂鸦。

这些应用我之前完全没想到,可能这就是“八哥”精神——学舌但不是鹦鹉,模仿但永远带点创意

要不要试试?但提前说好,这玩意儿不完美

如果你也想玩八哥365手绘短视频,我建议你直接用我写的这个Golang项目,但它不完美,你必须接受以下几点:

  • 它不会画人像,至少现在不会,人脸需要极其精细的特征点定位,我还没搞定。
  • 它经常“翻车”,有时候画出来的东西让人哭笑不得,比如猫咪的胡须画成了三条腿。
  • 它很慢,至少跟真正的画家比,画一幅完整的画面,可能要5-15分钟。
  • 它没有“审美”,不知道什么好看什么不好看,你需要手动训练,或者调整参数。

不过话说回来,这些“不完美”恰恰是手绘的魅力所在,如果你要的是完美无瑕的3D渲染,出门左转找Blender,但如果你想要那种“有人情味的、带点瑕疵的、看起来像真实手绘”的短视频,八哥365值得一试。

项目代码我扔在GitHub上了,叫bage365-handdraw,用Go 1.21以上版本就能跑。安装命令就一行go get github.com/yourname/bage365,对了,依赖里有个github.com/fogleman/gg,画图用的,特别棒。

我还在持续改进,下一个版本我想加入交互式模式——让人在画布上点几个点,指定关键区域,程序自动填充剩余部分,听起来像半AI半人工的协作绘画,想想就兴奋。

本文来自作者[kyadmin]投稿,不代表be365立场,如若转载,请注明出处:http://www.uss1.cn/lvyou/986.html

(3)

文章推荐

发表回复

本站作者才能评论

评论列表(4条)

  • kyadmin
    kyadmin 2026-07-01

    我是be365的签约作者“kyadmin”!

  • kyadmin
    kyadmin 2026-07-01

    希望本篇文章《八哥365手绘短视频,我用Golang写了个能画画的家伙,结果它比我还会整活儿》能对你有所帮助!

  • kyadmin
    kyadmin 2026-07-01

    本站[be365]内容主要涵盖:be365,be365网站,be365网址,ball365体育,Be365排名

  • kyadmin
    kyadmin 2026-07-01

    本文概览:说实话,最开始我想搞“八哥365手绘短视频”这个事儿,纯粹是因为懒,你没听错,就是懒,我每天刷短视频,看到那些手绘动画——一个小人儿蹦蹦...

    联系我们

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注我们