函数
函数在手册中可查。
颜色 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时,颜色才是纯色彩。
渐变的算法
一段渐变的颜色,可以用HSL来生成。利用循环指针或字符位置来计算。
字符位置
$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{ifx\le0} \\
x^{n+1}\sum_{k=0}^n\binom{n+k}{k}\binom{2n+1}{n-k}(-x)^k&\text{if0\le{x}\le1} \\
1&\text{if1\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
的方法虽然复杂、文本单行长度大,但是所生成的行数少。然而,目前尚不知道如何不依赖vsfilter简单地实现动效的渐变。[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,测试