Aegisub特效随记:颜色函数和渐变
本文最后更新于 60 天前。

函数

函数在手册中可查。

颜色 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

渐变的算法

一段渐变的颜色,可以用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,测试字幕

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的方法虽然复杂、文本单行长度大,但是所生成的行数少。

然而,目前尚不知道如何不依赖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,测试

参考

  1. ^「歌词特效」黄金拼图 Happy⋆Pretty⋆Clover ED – Starring! !【中日双语】
    https://www.bilibili.com/video/BV1364y1R7BG?t=10
  2. ^具体请看【教程】Aegisub特效字幕,多个绘图https://www.bilibili.com/video/BV1YJ411b7Tc
标题:Aegisub特效随记:颜色函数和渐变
作者:IKK
除转载和特殊声明外,所有文章采用 CC BY-NC-SA 4.0协议
上一篇
下一篇