函数
函数在手册中可查。
颜色 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即三原色发光模式。
(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时,颜色才是纯色彩。
渐变的算法(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,测试字幕
平滑函数
在行数很多的时候,设置的头尾颜色可能不会被很多的显示出来。可以尝试使用平滑函数来使开头和结尾更平滑一些。
函数
$
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$
应用代码
以$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效果。
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 L
的Hue
即可,随后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