- UID
- 2
- 积分
- 8682
- 帖子
- 2905
- 主题
- 199
- 论坛币
- 11739
- 威望
- 16
- EP值
- 2349
- MP值
- 15
- 阅读权限
- 200
- 注册时间
- 2011-8-3
- 在线时间
- 2597 小时
- 最后登录
- 2024-8-28
|
说明
本教程来源, [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
|
|