Aegisub特效随记:颜色函数和渐变
本文发布于 1315 天前。

函数

函数在手册中可查。

颜色 RGB to ASS

_G.ass_color(R,G,B)
输入RGB:三个RGB格式的颜色(0~255)
输出:ASS格式颜色代码
例如

> {\1c!_G.ass_color(200,300,120)!}
{\1c&H7812CC8&}

颜色 HSV to RGB

_G.HSV_to_RGB(H,S,V)
输入HSV:三个H(0~359)S(0~1)V(0~1)格式的颜色
输出:RGB格式的颜色;实际使用应搭配_G.ass_color(R,G,B)
例如

>{\1c!_G.ass_color(_G.HSV_to_RGB(100,1,1))!}
{\1c&H00FF55&}

透明度 D to H

_G.ass_alpha(D)
输入D:10进制(0-255,即(FF)16)
输出:16进制aegisub格式透明度
例如

> {\1a!_G.ass_alpha(256)!}
{\1a&H100&}

颜色算法

RGB

RGB即三原色发光模式。
image.png
(0, 0, 0)是黑色
(255, 255, 255)是白色
(255, 0, 0)是红色
(0, 255, 0)是绿色
(0, 0, 255)是蓝色
(255, 255, 0)是黄色
(0, 255, 255)是青色
(255, 0, 255)是品红

HSL

HSV即色相、饱和度、明度,是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。
饱和度越小越淡,越接近白色。S=0,颜色为白。
明度越小越暗,L=0,颜色为黑。
S=1且L=1时,颜色才是纯色彩。
image.png
image.png

渐变的算法(clip)

一段渐变的颜色,可以用HSL来生成。利用循环变量j或字符位置来计算。

字符位置

$si/$syln即为一个字符在整句话中的相对位置(0-1)

代码

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,strips=20 startc={2,1,1} endc={119,1,1}
Comment: 0,0:00:00.00,0:00:05.00,Default,HSL,0,0,0,template line,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color(_G.HSV_to_RGB((startc[1]-(startc[1]-endc[1])*j/maxj),(startc[2]-(startc[2]-endc[2])*j/maxj),(startc[3]-(startc[3]-endc[3])*j/maxj)))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,RGB,0,0,0,,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color((startc[1]-(startc[1]-endc[1])*j/maxj),(startc[2]-(startc[2]-endc[2])*j/maxj),(startc[3]-(startc[3]-endc[3])*j/maxj))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,测试字幕

image.png

平滑函数

在行数很多的时候,设置的头尾颜色可能不会被很多的显示出来。可以尝试使用平滑函数来使开头和结尾更平滑一些。

函数

$
S_n(x) =
\begin{cases}
0 & \text{if $x\le0$} \\
x^{n+1}\sum_{k=0}^n\binom{n+k}{k}\binom{2n+1}{n-k}(-x)^k & \text{if $0\le{x}\le1$} \\
1 & \text{if $1\le{x}$}
\end{cases}
$

$k=0$, $S_0=x$
$k=1$, $S_1=3x^2-2x^3$
$k=2$, $S_2=6x^5-15x^4+10x^3$
$k=3$, $S_3=-20x^7+70x^6-84x^5+35x^4$
image.png

应用代码

以$S_3$为例子。将$j/maxj$替换为-20*math.pow(j/maxj,7)+70*math.pow(j/maxj,6)-84*math.pow(j/maxj,5)+35*math.pow(j/maxj,4)
以下给出了S1-S3的HSL平滑渐变代码。

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,code once,strips=30 startc={2,1,1} endc={119,1,1}
Comment: 0,0:00:00.00,0:00:05.00,Default,HSL,0,0,0,template line,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color(_G.HSV_to_RGB((startc[1]-(startc[1]-endc[1])*j/maxj),(startc[2]-(startc[2]-endc[2])*j/maxj),(startc[3]-(startc[3]-endc[3])*j/maxj)))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,HSL_Smooth1,0,0,0,,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color(_G.HSV_to_RGB((startc[1]-(startc[1]-endc[1])*(3*math.pow(j/maxj,2)-2*math.pow(j/maxj,3))),(startc[2]-(startc[2]-endc[2])*(3*math.pow(j/maxj,2)-2*math.pow(j/maxj,3))),(startc[3]-(startc[3]-endc[3])*(3*math.pow(j/maxj,2)-2*math.pow(j/maxj,3)))))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,HSL_Smooth2,0,0,0,,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color(_G.HSV_to_RGB((startc[1]-(startc[1]-endc[1])*(6*math.pow(j/maxj,5)-15*math.pow(j/maxj,4)+10*math.pow(j/maxj,3))),(startc[2]-(startc[2]-endc[2])*(6*math.pow(j/maxj,5)-15*math.pow(j/maxj,4)+10*math.pow(j/maxj,3))),(startc[3]-(startc[3]-endc[3])*(6*math.pow(j/maxj,5)-15*math.pow(j/maxj,4)+10*math.pow(j/maxj,3)))))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,HSL_Smooth3,0,0,0,,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color(_G.HSV_to_RGB((startc[1]-(startc[1]-endc[1])*(-20*math.pow(j/maxj,7)+70*math.pow(j/maxj,6)-84*math.pow(j/maxj,5)+35*math.pow(j/maxj,4))),(startc[2]-(startc[2]-endc[2])*(-20*math.pow(j/maxj,7)+70*math.pow(j/maxj,6)-84*math.pow(j/maxj,5)+35*math.pow(j/maxj,4))),(startc[3]-(startc[3]-endc[3])*(-20*math.pow(j/maxj,7)+70*math.pow(j/maxj,6)-84*math.pow(j/maxj,5)+35*math.pow(j/maxj,4)))))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,RGB,0,0,0,,!maxloop(strips)!{\clip($lleft,!$ltop+$lheight*(j-1)/maxj!,$lright,!$ltop+$lheight*j/maxj!)\pos($lcenter,$lmiddle)\1c!_G.ass_color((startc[1]-(startc[1]-endc[1])*j/maxj),(startc[2]-(startc[2]-endc[2])*j/maxj),(startc[3]-(startc[3]-endc[3])*j/maxj))!}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,测试

以下为30条clip的S0—S4效果。
image.png

Yutils库渐变函数

G.interpolate_color

_G.interpolate_color(percent,c1,c2)函数是计算两个颜色之间的过渡色;函数的返回结果是一个颜色的字符串。
传入值为三个值:c1&c2为渐变的始末颜色,字符串格式,带""percent为一个0~1的数字,0为起始颜色,1为结束颜色。
用法例如:

{\1c!_G.interpolate_color(0.9,"&HFFFFFF&","&H000000&")!}
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template line,!maxloop(20)!{\1c!_G.interpolate_color(j/maxj,"&H00FEA32F","&H000303A0")!\pos($x,$y)\clip(!$left+(j-1)/maxj*$lwidth!,!$top!,!$left+(j)/maxj*$lwidth!,!$bottom!)}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,测试

以下是通过连接不同颜色图形的方式,形成的文字/图形渐变效果。

相比上面的分多行的渐变方法,下面的先转图形再加\clip的方法虽然复杂、文本单行长度大,但是所生成的行数少。

然而,目前尚不知道如何不依赖vsfiltermod简单地实现动效的渐变。[1]

当一行中有两个或个图形代码时,他们会被并排从左到右依次放置;每次向右的位移量为之前的宽度。[2]

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code line,shape = _G.decode.create_font(line.styleref.fontname, line.styleref.bold, line.styleref.italic, line.styleref.underline, line.styleref.strikeout, line.styleref.fontsize).text_to_shape(line.text_stripped)
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code syl noblank,fxgroup.f=syl.i==1
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,function rect(x,y,w,h)  return string.format("m %d %d l %d %d l %d %d l %d %d l %d %d",x,y,w+x,y,w+x,y+h,x,h+y,x,y) end
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code line,c={} for i=1,line.width do c[i]=_G.interpolate_color(i/line.width,"&H00FFFFFF","&H000303A0") end                                  t="" for i=1,line.width do t=t.."{".."\\c"..c[i].."}"..rect(0,0,1,100).." " end
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template syl noblank notext fxgroup f,{\p1\an7\pos($left,$top)\clip(!_G.Yutils.shape.move(shape,$left,$top)!)}!t!
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,{\k1}测{\k1}试{\k1}测{\k1}试
Comment: 0,0:00:06.00,0:00:08.00,Default,,0,0,0,karaoke,{\k1}这{\k1}是{\k1}一{\k1}条{\k1}测{\k1}试{\k1}字{\k1}幕
Comment: 0,0:00:09.00,0:00:11.00,Default,,0,0,0,karaoke,{\k1}忘{\k1}不{\k1}了{\k1}你{\k1}的{\k1}声{\k1}音

类似地,可以写一个垂直渐变的特效

G.Yutils.ass.interpolate_coloralpha

_G.Yutils.ass.interpolate_coloralpha(percent,c1,c2,c3,c4,...)
相比上面的函数,这个函数可以生成多个颜色间的过渡色。
传入的数据为:0-1的数,后接任一个颜色字符串。

当有2个颜色时,0为第一个,1为最后一个
当有3个颜色时,0为第一个,0.5为第二个,1为最后一个
当有5个颜色是,0为第一个,0.25为第二个,0.5为第三个,0.75为第四个,1为最够一个。

例如

Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template line,!maxloop(20)!{\1c!_G.Yutils.ass.interpolate_coloralpha(j/maxj,"&H00FEA32F","&H000303A0","&H00F5DED8","&H0060C107")!\pos($x,$y)\clip(!$left+(j-1)/maxj*$lwidth!,!$top!,!$left+(j)/maxj*$lwidth!,!$bottom!)}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,测试

逐字渐变

以上主要是利用\clip实现的平滑渐变;然而有些时候需要对单个字应用离散的渐变。
例如,向山出发 next summit的ED渐变效果如下

可以看出,这里的描边blur每个字使用了不同的颜色(或许是连续的渐变,但是因为颜色跨度极大,每个字之间色差很大,可以按照离散的渐变来处理)
考虑到主要是色相在发生变化,只需调整H S LHue即可,随后HSL->RGB->ASS(代码实现见前文)

值得注意的是,因为除了渐变和同时淡入淡出之外,此字幕并没有其它的特效,因此完全可以放入一行中进行显示:

{\blur2\fad(500,500)\3c&HE4AEF2&}今{\3c&HF2AED5&}は{\3c&HF2B1AE&}大{\3c&HF2DBAE&}切{\3c&HDEF2AE&}に{\3c&HB4F2AE&}し{\3c&HAEF2D3&}た{\3c&HAEE6F2&}い

按音节分成多句有以下两条缺点:
1. ASS体积增大
2. 繁化时,某些简体->繁体是一对多的汉字会出错。例如“额头”->“呃頭”

为了使应用模板后特效以单句显示,可以把template syl noblank改为template line noblank

Comment: 0,0:22:43.17,0:22:43.22,ED-JP,,0,0,0,template line noblank,{!$si == 1 and "\\blur2\\fad(500,500)" or ""!\3c!_G.ass_color(_G.HSV_to_RGB(350-(300/$syln)*($si),0.28,0.95))!}
Comment: 0,0:22:48.23,0:22:52.39,ED-JP,,0,0,0,karaoke,{\k42}余{\k42}裕{\k42}な{\k42}ん{\k42}て{\k42}な{\k42}い{\k42}け{\k42}れ{\k42}ど

!$si == 1 and "\\blur2\\fad(500,500)" or ""! 的作用是:在第一个音节前额外增加\blur2\fad(500,500)标签。
关于此三元表达式的详细说明,参见:And & Or In Lua

参考

  1. ^「歌词特效」黄金拼图 Happy⋆Pretty⋆Clover ED – Starring! !【中日双语】
    https://www.bilibili.com/video/BV1364y1R7BG?t=10
  2. ^具体请看【教程】Aegisub特效字幕,多个绘图https://www.bilibili.com/video/BV1YJ411b7Tc
这是一篇Aegisub专题,点击查看更多相关笔记
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇