TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua
标题:
[TCAS特效教程进阶系列] 一. fade流
[打印本页]
作者:
milkyjing
时间:
2012-2-25 16:07:20
标题:
[TCAS特效教程进阶系列] 一. fade流
说明
本教程来源,
[J]034_Another_OP
.
用到了util.magick模块(虽然有方法避开...). 最简单的方法是使用
TCAX 1.1.8
或以上版本.
TCAS使用教程是必修课, 见,
http://www.tcax.org/forum.php?mod=viewthread&tid=220
例子
代码
from tcaxPy import *
from util.magick import *
def tcaxPy_Init():
global _Fs
global _FD # 一帧的持续时间, 约40毫秒
global _Spacing # 字体间距
global Font # 首要字体
global FontOut # 字体边框
global FontOut2 # 字体边框2
_Fs = GetVal(val_FontSize)
_FD = 1000 / GetVal(val_FXFPS)
_FontFileName = GetVal(val_FontFileName)
_FaceID = GetVal(val_FaceID)
_Spacing = GetVal(val_Spacing)
Font = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 0, False)
FontOut = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 3, True)
FontOut2 = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 2, False)
def tcaxPy_Fin():
FinFont(Font)
FinFont(FontOut)
def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
ASS_BUF = [] # 保存ASS特效
TCAS_BUF = [] # 保存TCAS特效
##### 主要特效编写操作 ####
dx = _x - int((_a + _Spacing) / 2 + 0.5) # 一个固定操作, 将an5的坐标转换为an7
dy = _y - int(_Fs / 2 + 0.5) # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
# 文字主体
PIX_t = TextPix(Font, _txt)
# 边框主体
PIX = TextPix(FontOut, _txt)
PIX = PixColorRGB(PIX, DecRGB('FF0000'))
PIX = PixColorMul(PIX, 1, 1, 1, 0.8)
PIX_o = PixBlur(PIX, 6)
# 边框
PIX = TextPix(FontOut2, _txt)
PIX = PixColorRGB(PIX, DecRGB('0000BB'))
PIX_b = PixBlur(PIX, 2)
# 混合
PIX = CombinePixs(PIX_o, PIX_b)
PIX = CombinePixs(PIX, PIX_t)
PIX0 = PIX
# 一些时间的计算
TS = 10 * _start - 40 * _FD
TE = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
# 淡入
IMG = Image('images\\blurred_noise.jpg') # 读入图片, 将用于构造Mask
# 将从IMG图片上随机选定一个位置, 取下与PIX0一样尺寸的一个矩形区域, 用作Mask
xoff = randint(0, IMG.columns() - PIX0[1][0]) # IMG.columns()为IMG图片的宽度, PIX0[1][0]为PIX0的宽度
yoff = randint(0, IMG.rows() - PIX0[1][1]) # IMG.rows()为IMG图片的高度, PIX0[1][1]为PIX0的高度
IMG.crop(Geometry(PIX0[1][0], PIX0[1][1], xoff, yoff)) # 从IMG上取出我们需要的部分, 左上角坐标为(xoff, yoff), 尺寸为PIX0[1][0] * PIX0[1][1]
PIX = pmgToPix(IMG) # 通过pmgToPix将magick的Image对象转换为PIX结构对象
PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1]) # 为这个PIX设定内部偏移量, 使PIX的位置也与PIX0相同
PIX = r2a(PIX) # 因为blurred_noise.jpg是一个灰度图, 所以它的r, g, b分量值都是一样的, 我们取r分量, 将其作为不透明度分量. 注意, 图片上越黑的地方r值越小, 越白的地方r值越大, 复制到不透明度上, 就变成图片上越黑的部分不透明度就越低, 也即越透明. r2a()函数的定义见脚本最下方
mask0 = invertA(PIX) # 反转PIX的不透明度值, 这样, 图片上越黑的地方不透明度就越高, 符合思维习惯(但这不是必须的, 还要看图片本身是否需要让我们做这一处理). invertA()函数的定义见脚本最下方
num = 40
for i in range(num):
mask = addA(mask0, 255 * (2 * i - num) / num) # 逐渐修改Mask的通透性. addA()函数的定义见脚本最下方
PIX = PixMask(PIX0, mask) # 将Mask应用到PIX0上得到一个新的PIX结构
tcas_main(TCAS_BUF, PIX, TS + i * _FD, TS + (i + 1) * _FD, dx, dy, 0)
# 存在
tcas_main(TCAS_BUF, PIX0, TS + num * _FD, TE, dx, dy, 0)
# 淡出, 原理基本相同
IMG = Image('images\\radial.jpg')
IMG.filterType(FilterTypes.CubicFilter) # 更改下插值方式, 不加这句也没什么- -
IMG.resize('!{0}x{1}'.format(PIX0[1][0], PIX0[1][1])) # 缩放IMG尺寸, 使其与PIX0一样大, 加!表示不保持宽高比
PIX = pmgToPix(IMG)
PIX = PixColorMul(PIX, 2, 1, 1, 1) # 红色分量放大2倍, 为了使之后的透明度变化更明显
PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1])
PIX = r2a(PIX)
if _i == 0: # 小变化- -
mask0 = PIX
else:
mask0 = invertA(PIX)
num = 10
for i in range(num):
mask = addA(mask0, 255 * (num - 2 * i) / num)
PIX = PixMask(PIX0, mask)
tcas_main(TCAS_BUF, PIX, TE + i * _FD, TE + (i + 1) * _FD, dx, dy, 0)
##### 将结果返回给tcax进行处理 #####
return (ASS_BUF, TCAS_BUF)
# 一些辅助函数
# 拷贝PIX的红色分量到不透明度分量
def r2a(PIX):
buf = []
width = PIX[1][0]
height = PIX[1][1]
for h in range(height):
for w in range(width):
index = 4 * (h * width + w)
# if PIX[2][index] != PIX[2][index + 1] or PIX[2][index] != PIX[2][index + 2]:
# print('note1')
# if PIX[2][index + 3] != 255:
# print('note2')
buf.append(0)
buf.append(0)
buf.append(0)
buf.append(PIX[2][index + 0])
return (PIX[0], PIX[1], tuple(buf))
# 反转PIX的不透明度分量
def invertA(PIX):
buf = list(PIX[2])
width = PIX[1][0]
height = PIX[1][1]
for h in range(height):
for w in range(width):
index = 4 * (h * width + w) + 3
buf[index] = 255 - buf[index]
return (PIX[0], PIX[1], tuple(buf))
# 增加/减少不透明度, step可以是负数
def addA(PIX, step):
buf = list(PIX[2])
width = PIX[1][0]
height = PIX[1][1]
for h in range(height):
for w in range(width):
index = 4 * (h * width + w) + 3
buf[index] += int(step + 0.5)
if buf[index] < 0:
buf[index] = 0
if buf[index] > 255:
buf[index] = 255
return (PIX[0], PIX[1], tuple(buf))
# 对换PIX的红色分量与蓝色分量, 本教程未用到该函数
def switchRB(PIX):
buf = list(PIX[2])
width = PIX[1][0]
height = PIX[1][1]
for h in range(height):
for w in range(width):
index = 4 * (h * width + w)
temp = buf[index]
buf[index] = buf[index + 2]
buf[index + 2] = temp
return (PIX[0], PIX[1], tuple(buf))
复制代码
完整工程见附件, 有问题请直接跟帖...
p.s. 换换作为Mask的图片就可以弄出些不同的效果了, 虽然对图源没什么限制, 但用灰度图比较直观一点. 利用util.magick模块就能方便处理图片了 233
附件: [完整工程]
tcas_fade.zip
(2012-2-25 16:07:15, 11.54 KB) / 下载次数 2057
http://tcax.org/forum.php?mod=attachment&aid=MzQzfDAyMGI4N2VjfDE3MzI0Njg2ODF8MHww
作者:
mzlmcx
时间:
2012-2-25 16:52:05
已经下载附件……
找机会给看了= =
tcas的教程上个星期看过,这个星期就忘了
作者:
四月一日 君寻
时间:
2012-2-29 12:16:13
如果有同学遇到了我这样的RP问题如图:
2012-2-29 12:14:18 上传
下载附件
(72.01 KB)
请将PY脚本里面的两张图片路径代码改成这样如下:
# 淡入
IMG = Image(abspath('images\\blurred_noise.jpg')) # 读入图片, 将用于构造Mask
# 淡出, 原理基本相同
IMG = Image(abspath('images\\radial.jpg'))
图片附件:
1.jpg
(2012-2-29 12:14:18, 72.01 KB) / 下载次数 991
http://tcax.org/forum.php?mod=attachment&aid=MzQ4fDhjNzVkODI3fDE3MzI0Njg2ODF8MHww
欢迎光临 TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua (http://tcax.org/)
Powered by Discuz! X2