- UID
- 2443
- 积分
- 1311
- 帖子
- 78
- 主题
- 21
- 论坛币
- 909
- 威望
- 8
- EP值
- 449
- MP值
- 0
- 阅读权限
- 100
- 注册时间
- 2015-3-7
- 在线时间
- 121 小时
- 最后登录
- 2018-7-21
|
lens_distortion 效果,是上次 模拟透镜畸变效果 的后续。它们之间的区别是实现方法不同,上回是用粒子,这个是用矢量绘图代码。由于粒子方法会导致变化时字呈现栅格状,即使填充好也会产生锯齿(雾),所以更推荐矢量绘图的方法。
这个矢量绘图代码的框架是 milkyjing 大哥写的,请参考 放大镜效果 。其中 ImageSurface() Context() 是 util.cairo 模块的函数。AssDraw() path_trans() surface_clear() 则在 util/cairo/CairoAssist.py 中。总之,只需要 from util.cairo import* 即可。
片源、工程、成品字幕、预览见 http://pan.baidu.com/s/1pL2E63x 密码: th7p- from tcaxPy import *
- from util.cairo import *
- def tcaxPy_Init():
- global frameDur
- global fontSize
- global userFont
- fontSize = GetVal(val_FontSize)
- frameDur = 1000 / GetVal(val_FXFPS)
- userFont = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), fontSize, GetVal(val_Spacing), GetVal(val_SpaceScale), DecRGB(GetVal(val_1C)), 0, 0)
- # cairo
- global ctx
- vdWidth = GetVal(val_ResolutionX)
- vdHeight = GetVal(val_ResolutionY)
- surface = ImageSurface(FORMAT_ARGB32, vdWidth, vdHeight)
- ctx = Context(surface)
- def tcaxPy_Fin():
- FinFont(userFont)
- def lens_filter(x, y, param):
- orgx, orgy, f, frames = param
- px = x / 64
- py = y / 64
- rx = px - orgx
- ry = py - orgy
- rsq = rx ** 2 + ry ** 2
- rx = rx * (1 + 0.00002 * (frames - 1 - f) / (frames - 1) * rsq)
- ry = ry * (1 + 0.00005 * (frames - 1 - f) / (frames - 1) * rsq)
- px = (rx + orgx) * 64
- py = (ry + orgy) * 64
- return (px, py)
- def rand_filter(x, y, n):
- rndx = randint(-n, n)
- rndy = randint(-n, n)
- return (x + rndx, y + rndy)
- def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
- ASS_BUF = [] # used for saving ASS FX lines
-
- ux = _x
- dx = (GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i] * 2 - GetVal(val_OffsetX) * 2) + GetVal(val_TextLength)[_i]
- orgx = GetVal(val_OffsetX) + GetVal(val_TextLength)[_i] / 2
- orgy = GetVal(val_OffsetY) + fontSize / 2
- if 17 <= _i <= 19:
- ux += dx / 2
- orgx += dx / 2
- elif _i % 2:
- ux += dx
- orgx += dx
- udx = ux - int(_a / 2 + 0.5)
- udy = _y - int(fontSize / 2 + 0.5)
- outline = TextOutlineDraw(userFont, _txt, udx, udy)
-
- frames = 14
- eft = an(7) + pos(0, 0) + blur(2)
-
- for f in range(frames):
- ts = _start - (frames - f) * frameDur / 10
- te = ts + frameDur / 10
- AssDraw(ctx, outline)
- path_trans(ctx, lens_filter, (orgx, orgy, f, frames))
- text = ToAssDraw(ctx)
- ass_main(ASS_BUF, SubL(ts, te), eft, '{\p7} ' + text + ' {\p0}')
-
- weft = pos(ux, _y) + blur(2)
- ass_main(ASS_BUF, SubL(te, _start + _elapk), weft, _txt)
- ass_main(ASS_BUF, SubL(_start + _elapk + _k, _end), weft, _txt)
-
- surface_clear(ctx)
-
- frames = int(10 * _k / frameDur + 0.5)
- if 9 <= _i <= 16 or (_i == 8 and _j == _n - 1):
- n = 200
- else:
- n = 100
-
- for f in range(frames):
- ts = _start + _elapk + f * frameDur / 10
- te = ts + frameDur / 10
- AssDraw(ctx, outline)
- path_trans(ctx, rand_filter, n)
- text = ToAssDraw(ctx)
- ass_main(ASS_BUF, SubL(ts, te), eft, '{\p7} ' + text + ' {\p0}')
- return (ASS_BUF, None)
复制代码 |
-
1
查看全部评分
-
|