TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua

标题: [J]040_HorizonII_OP特效脚本 (附完整工程) [打印本页]

作者: milkyjing    时间: 2012-8-13 20:36:40     标题: [J]040_HorizonII_OP特效脚本 (附完整工程)

完整工程下载(注意, 请直接用浏览器下载):
[hide=10]说明: 这个工程执行一次需要很久, 相对的, 预览不会太卡

http://www.tcax.org/release/examples/HorizonII_OP_proj.rar[/hide]
  1. from tcaxPy import *
  2. from util.gdiFont import *
  3. from util.tcCurve import *
  4. from util.cairo import *
  5. from pixLibs.ImageStone import *

  6. def tcaxPy_Init():
  7.     global _Fs
  8.     global _FD          # 一帧的持续时间, 约40毫秒
  9.     global Font         # 首要字体
  10.     global FontOut      # 字体边框
  11.     global FontShad      # 加粗字体
  12.     global GdiFontThin
  13.     global GdiFontThin2
  14.     _Fs = GetVal(val_FontSize)
  15.     _FD = 1000 / GetVal(val_FXFPS)
  16.     _FontFileName = GetVal(val_FontFileName)
  17.     _FaceID = GetVal(val_FaceID)
  18.     Font = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 0, False)
  19.     FontOut = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 2, True)
  20.     FontShad = InitFont(_FontFileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 4, False)
  21.     GdiFontThin = gfInitFont(GetVal(val_FontFaceName), _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), -3, False)
  22.     GdiFontThin2 = gfInitFont(GetVal(val_FontFaceName), _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), -2, False)
  23.     # cairo
  24.     global surface
  25.     global ctx
  26.     fx_width = GetVal(val_ResolutionX)
  27.     fx_height = GetVal(val_ResolutionY)
  28.     width = fx_width
  29.     height = fx_height
  30.     surface = ImageSurface(FORMAT_ARGB32, width, height)
  31.     ctx = Context(surface)

  32. def tcaxPy_Fin():
  33.     FinFont(Font)
  34.     FinFont(FontOut)
  35.     FinFont(FontShad)
  36.     gfFinFont(GdiFontThin)
  37.     gfFinFont(GdiFontThin2)
  38.     #sys.exit()      # 自动关闭执行窗口 auto close the window

  39. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  40.     ASS_BUF  = []        # 保存ASS特效
  41.     TCAS_BUF = []        # 保存TCAS特效
  42.     ##### 主要特效编写操作 ####
  43.     dx = _x - int((_a + GetVal(val_Spacing)) / 2 + 0.5)     # 一个固定操作, 将an5的坐标转换为an7
  44.     dy = _y - int(_Fs / 2 + 0.5)    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  45.     # 文字主体
  46.     PIX = TextPix(Font, _txt)
  47.     PIX_t0 = PixColorRGB(PIX, DecRGB('FFFFFF'))     # 未增加内部填充
  48.     if _txt == '/' or _txt == '「' or _txt == '」':
  49.         PIX = PixFromPoints(gfGetPoints(GdiFontThin2, _txt))
  50.         PIX = PixColorRGB(PIX, DecRGB('002200'))
  51.         PIX_thin = PixBlur(PIX, 2)      # 内部填充
  52.         PIX_t = CombinePixs(PIX_t0, PIX_thin)    # 增加了内部填充的主体
  53.     else:
  54.         PIX = PixFromPoints(gfGetPoints(GdiFontThin, _txt))
  55.         PIX = PixColorRGB(PIX, DecRGB('002200'))
  56.         PIX_thin = PixBlur(PIX, 4)      # 内部填充
  57.         PIX_t = CombinePixs(PIX_t0, PIX_thin)    # 增加了内部填充的主体
  58.     # 边框
  59.     PIX = TextPix(FontOut, _txt)
  60.     PIX = PixColorRGB(PIX, DecRGB('FFFFFF'))
  61.     PIX_o = PixBlur(PIX, 6)
  62.     # 底色
  63.     PIX = TextPix(FontShad, _txt)
  64.     PIX = PixColorRGB(PIX, DecRGB('0042CA'))
  65.     PIX_s = PixBlur(PIX, 8)
  66.     # 混合
  67.     PIX = CombinePixs(PIX_s, PIX_o)
  68.     PIX_0 = CombinePixs(PIX, PIX_t0)
  69.     PIX_1 = CombinePixs(PIX, PIX_t)
  70.     # 一些时间的计算
  71.     T0 = 10 * _start - 12 * _FD + 1 * _j * _FD
  72.     T1 = T0 + 4 * _FD
  73.     T2 = 10 * _end + 4 * _FD - 1 * (_n - _j - 1) * _FD
  74.     T3 = T2 + 8 * _FD
  75.     # IN 入场方式
  76.     xv = [w for w in range(6, PIX_1[1][0], 6)]
  77.     yv = [h for h in range(6, PIX_1[1][1], 6)]
  78.     PIX_list = PixSubClips(PIX_1, xv, yv)
  79.     pix_num = len(PIX_list)
  80.     P = []
  81.     pix_num = len(PIX_list)
  82.     for i in range(pix_num):
  83.         if i % 2 == 0:
  84.             pt0 = (dx + 10, dy - 5)
  85.             pt1 = (dx, dy)
  86.         else:
  87.             pt0 = (dx + 10, dy + 5)
  88.             pt1 = (dx, dy)
  89.         P.append((pt0, pt1))
  90.     num = 10
  91.     for i in range(num):
  92.         for j in range(pix_num):
  93.             ts0 = T0 + i * _FD
  94.             te0 = ts0 + _FD
  95.             x, y, a = LinearBezier(P[j][0], P[j][1], (i + 1) / num)
  96.             PIX = PixResizeF(PIX_list[j], PIX_list[j][1][0] * (i + 1) / num, 0)
  97.             if num - i - 1 > 0:
  98.                 PIX = PixBlur(PIX, 2 * (num - i - 1))
  99.             PIX = BilinearFilter(PIX, x, y)
  100.             tcas_main(TCAS_BUF, PIX, ts0, te0, x, y, 0)
  101.     # MAIN 存在方式 part1
  102.     ts1 = te0
  103.     te1 = 10 * (_start + _elapk)
  104.     tcas_main(TCAS_BUF, PIX_1, ts1, te1, dx, dy, 0)
  105.     # EFT 表现方式 MAIN 存在方式 part2
  106.     ts2 = te1
  107.     te2 = T2
  108.     PIX = pstSoftGlow(PIX_1, 10, 100, 120)
  109.     tcas_keyframe(TCAS_BUF, PIX, PIX_1, ts2, te2, dx, dy, 1, 0)
  110.     # EXT 附加效果
  111.     points = PixPoints(PIX_thin)
  112.     pt_num = len(points)
  113.     dx0 = dx + PIX_thin[0][0]
  114.     dy0 = dy + PIX_thin[0][1]
  115.     num = int((te2 - te1) / _FD + 0.5)
  116.     for i in range(num):        # 逐帧绘制
  117.         ts = te1 + _FD * i
  118.         te = ts + _FD
  119.         for j in range(pt_num):
  120.             ctx.save()
  121.             y = dy0 + points[j][1]
  122.             if y < _y:
  123.                 ag = (y - _y - 5) / PIX_thin[1][1] * pi / 4
  124.             else:
  125.                 ag = (y - _y + 5) / PIX_thin[1][1] * pi / 4
  126.             ctx.translate(dx0 + points[j][0], dy0 + points[j][1])
  127.             ctx.scale(1/8, 1/8)
  128.             AssDraw(ctx, DrawLight2(160))
  129.             path_trans(ctx, ca_frz, -ag)
  130.             path_trans(ctx, ca_fry, pi * i / num)
  131.             ctx.set_source_rgba(0xFF/0xFF, 0x88/0xFF, 0x68/0xFF, 0x0A/0xFF)
  132.             ctx.fill()
  133.             AssDraw(ctx, DrawLight3(40))
  134.             path_trans(ctx, ca_frz, -ag)
  135.             path_trans(ctx, ca_fry, pi * i / num)
  136.             ctx.set_source_rgba(1, 1, 1, 0.2)
  137.             ctx.fill()
  138.             ctx.restore()
  139.         PIX = surface.get_pix()     # 获取图案
  140.         surface_clear(ctx)          # 清空画布
  141.         PIX = PixStrip(PIX)         # 裁剪空白边框提升后续操作效率
  142.         PIX = PixBlur(PIX, 1)       # 模糊效果
  143.         if i > num - 5:
  144.             PIX = PixColorMul(PIX, 1, 1, 1, (num - i) / 5)
  145.         tcas_main(TCAS_BUF, PIX, ts, te, 0, 0, 1)
  146.         progress(i + 1, num)
  147.     # OUT 出场方式
  148.     P = []
  149.     pix_num = len(PIX_list)
  150.     for i in range(pix_num):
  151.         if i % 2 == 0:
  152.             pt0 = (dx, dy)
  153.             pt1 = (dx - 10, dy + 5)
  154.         else:
  155.             pt0 = (dx, dy)
  156.             pt1 = (dx - 10, dy - 5)
  157.         P.append((pt0, pt1))
  158.     num = 10
  159.     for i in range(num):
  160.         for j in range(pix_num):
  161.             ts3 = te2 + i * _FD
  162.             te3 = ts3 + _FD
  163.             x, y, a = LinearBezier(P[j][0], P[j][1], i / num)
  164.             PIX = PixResizeF(PIX_list[j], PIX_list[j][1][0] * (num - i) / num, 0)
  165.             if i > 0:
  166.                 PIX = PixBlur(PIX, 2 * i)
  167.             PIX = BilinearFilter(PIX, x, y)
  168.             tcas_main(TCAS_BUF, PIX, ts3, te3, x, y, 0)
  169.     ##### 将结果返回给tcax进行处理 #####
  170.     return (ASS_BUF, TCAS_BUF)


  171. # 辅助函数
  172. def PixSubClips(PIX, xv, yv):
  173.     PIX_list = []
  174.     xv = list(xv)
  175.     yv = list(yv)
  176.     xv.append(PIX[1][0])
  177.     yv.append(PIX[1][1])
  178.     xv.sort()
  179.     yv.sort()
  180.     xn = len(xv)
  181.     yn = len(yv)
  182.     y_off = 0
  183.     for j in range(yn):
  184.         x_off = 0
  185.         for i in range(xn):
  186.             PIX_sub_pos = (PIX[0][0] + x_off, PIX[0][1] + y_off)
  187.             PIX_sub_res = (xv[i] - x_off, yv[j] - y_off)
  188.             PIX_sub_rgba = []
  189.             for h in range(PIX_sub_res[1]):
  190.                 for w in range(PIX_sub_res[0]):
  191.                     idx = 4 * ((h + y_off) * PIX[1][0] + w + x_off)
  192.                     PIX_sub_rgba.append(PIX[2][idx])
  193.                     PIX_sub_rgba.append(PIX[2][idx + 1])
  194.                     PIX_sub_rgba.append(PIX[2][idx + 2])
  195.                     PIX_sub_rgba.append(PIX[2][idx + 3])
  196.             PIX_list.append((PIX_sub_pos, PIX_sub_res, tuple(PIX_sub_rgba)))
  197.             x_off = xv[i]
  198.         y_off = yv[j]
  199.     return PIX_list

  200. def DrawLight2(l):
  201.     return 'm 0 0 l -{length} 0 0 8 c'.format(length = int(l * 8))

  202. def DrawLight3(l):
  203.     return 'm 0 0 l -{length} 0 0 4 c'.format(length = int(l * 8))
复制代码

作者: 兜兜里没糖    时间: 2012-8-13 21:47:43

辛苦了 感谢分享
作者: 渣渣疯子    时间: 2012-8-13 22:08:25

已经整40个了
作者: youkaze    时间: 2012-8-14 00:23:59

shine 嗯 shine  sunshine
作者: jijidata    时间: 2012-8-14 02:46:59

奶大高效率啊...
作者: staracg    时间: 2012-8-14 02:58:13

辛苦了
作者: 风之毁灭    时间: 2012-8-14 20:24:36

支持一下 顺便学习
作者: classa    时间: 2012-8-18 22:50:48

学习学习~~~
作者: zczzcz    时间: 2012-8-19 10:03:30

奶大好厉害啊
作者: 674316    时间: 2012-8-22 23:07:00

好强大,回复看看
作者: usfsaf    时间: 2012-8-23 16:26:14

好巨大的tcas字幕文件,500m

图片附件: 捕获.JPG (2012-8-23 16:26:09, 43.67 KB) / 下载次数 1328
http://tcax.org/forum.php?mod=attachment&aid=OTE2fDY0N2FmZDU2fDE3MTQ2NTY2NjR8MHww


作者: coo    时间: 2012-8-27 14:37:33

分不够 杯具啊
作者: milkyjing    时间: 2012-8-27 21:35:53

coo 发表于 2012-8-27 14:37
分不够 杯具啊

10分很快的, 去水几帖就到了
作者: zhore    时间: 2012-10-30 18:39:03


作者: zhore    时间: 2012-10-30 18:40:12

望楼主体谅
作者: zhore    时间: 2012-10-30 18:40:18

好了
作者: milkyjing    时间: 2012-10-30 21:59:06

zhore 发表于 2012-10-30 18:40
好了

分不够可以去水区嘛...

下回别怪我手滑..
作者: 靠不住    时间: 2012-11-14 00:04:20

好好学习,天天向上
作者: Forever    时间: 2012-11-17 17:02:50

刚刚接触制作特效字幕,还是小白,很多都不太懂,但是要支持楼主!
作者: balibabyer    时间: 2012-12-7 12:27:04

奶大的新工程啊!!不过感觉工程文件好庞大的说!!
作者: shinkouha    时间: 2013-4-5 12:16:11

编译失败了,不知道哪个数值溢出了,还是数组
作者: milkyjing    时间: 2013-4-5 12:56:38

shinkouha 发表于 2013-4-5 12:16
编译失败了,不知道哪个数值溢出了,还是数组

贴一下出错信息.
作者: wobuyao    时间: 2013-4-7 12:18:57

新工程呢。执行一下,学习哦。
作者: alinachen1985    时间: 2013-4-8 18:08:38

好想学,貌似啥都看不懂。。。。
作者: laijunyu6448    时间: 2013-4-21 15:24:37

谢谢分享了哦。 。拿来慢慢看
作者: herol    时间: 2013-6-28 22:04:07

工程量不小啊
作者: morofish    时间: 2013-8-6 22:16:47

感謝分享
作者: ayumity    时间: 2013-10-21 15:29:39

完全新手。。。。。
作者: 剪瞳_    时间: 2013-12-9 20:41:44

我得到了这些完整代码要怎么才可以把效果弄出来了?我是新手,刚接触,请指导。。。
作者: yy100313    时间: 2014-7-22 00:28:48

偶,天哪  内存不足了 。。
作者: katsui    时间: 2014-7-27 08:16:14

好厉害
作者: chenfeng139    时间: 2014-8-11 21:03:57

支持支持,来学习了
作者: oiuu    时间: 2014-10-23 22:58:46

完整工程直接parse就可以吧,之前下载了Nekogami_OP的完整工程,可以直接用,这个好像不行,巨巨能否指点一下?是需要修改什么吗?

图片附件: 信息.jpg (2014-10-23 22:58:21, 141.2 KB) / 下载次数 1042
http://tcax.org/forum.php?mod=attachment&aid=MTgwOXxlOWY5N2E1MHwxNzE0NjU2NjY0fDB8MA%3D%3D


作者: oiuu    时间: 2014-10-23 23:06:40

我把这个完整工程下载下来,然后需要修改什么东西才能够parse您这个完整工程呢?
作者: milkyjing    时间: 2014-10-24 23:51:09

oiuu 发表于 2014-10-23 23:06
我把这个完整工程下载下来,然后需要修改什么东西才能够parse您这个完整工程呢? ...


把_k.ass文件貼出來看下吧
作者: oiuu    时间: 2014-10-25 11:07:41

milkyjing 发表于 2014-10-24 23:51
把_k.ass文件貼出來看下吧

就是直接用你的kass文件,没有做任何修改。
作者: oiuu    时间: 2014-10-25 11:55:33

milkyjing 发表于 2014-10-24 23:51
把_k.ass文件貼出來看下吧

对了,请问一下,直接使用您的完整工程,或者套用别人发布的完整特效py脚本,流程是什么?还需要修改别人制作好的Py脚本吗?需要注意些什么,有没有这方面的教程可供参考?lijingjie巨巨的进阶教程,已经看了几遍,对于如何使用比人的发布py脚本,还是一直都是出错。可能编写脚本,实在没这个能力,还是说使用别人的完整特效py脚本,需要有编写脚本的能力?多谢了。
作者: cf45ffws    时间: 2014-10-25 12:17:26

oiuu 发表于 2014-10-25 11:07
就是直接用你的kass文件,没有做任何修改。

可能是你的 tcaxPy.py 太舊了
需要更新
作者: oiuu    时间: 2014-10-25 13:15:13

cf45ffws 发表于 2014-10-25 12:17
可能是你的 tcaxPy.py 太舊了
需要更新

是tcax主程序的 tcaxPy.py?我下载的最新版本。
作者: cf45ffws    时间: 2014-10-25 19:21:35

oiuu 发表于 2014-10-25 13:15
是tcax主程序的 tcaxPy.py?我下载的最新版本。

若你只是將字體放在同一個目錄下
系統沒安裝需要的字體
就可能出現這個錯誤

另外,你貼出的那個信息圖片
其中一行顯示的訊息
可以看出你的 tcaxPy.py 是 ver0.8.0.0
雖然這不是出錯的原因
但是更新一下(Version 8.0.0.1)總是好的

作者: oiuu    时间: 2014-10-25 20:21:54

cf45ffws 发表于 2014-10-25 19:21
若你只是將字體放在同一個目錄下
系統沒安裝需要的字體
就可能出現這個錯誤

运行这个完整工程,显示成功。但是生成了一个400多m的tcas文件,这是什么情况?ass文件是空的。
作者: oiuu    时间: 2014-10-25 20:48:37

cf45ffws 发表于 2014-10-25 19:21
若你只是將字體放在同一個目錄下
系統沒安裝需要的字體
就可能出現這個錯誤

刚刚那个问题,我自己弄明白了。压制方式,我知道!但是到时候,这个tcas字幕也会占用那么大的容量吗?
作者: 疯狂的馒头    时间: 2015-1-25 21:11:37

新人前来膜拜
作者: 疯狂的馒头    时间: 2015-1-26 09:58:53

我也分不够
作者: vip    时间: 2015-3-20 17:06:25

非常强大!!!!!!!!!!!!!!!!
作者: AkaNext    时间: 2015-3-23 11:33:26

新人前来学习一下
作者: y3010607    时间: 2015-3-25 01:12:24

工程浩大啊!!!
作者: 酉酉君    时间: 2015-4-16 09:10:28

好厉害!!存下来慢慢啃
作者: 辉无恒    时间: 2015-4-25 16:07:57

分不够啊,要升级
作者: 玩具    时间: 2015-5-30 05:29:09

好久没来了,来支持一个,下来看看先
作者: aaaqz112    时间: 2015-6-22 11:48:37

好强大,謝謝分享
作者: 鲨鱼君    时间: 2015-7-11 12:40:18

刚刚接触制作特效字幕,还是小白,很多都不太懂 看看lz的成果
作者: YG大擦饭    时间: 2015-8-11 20:14:39

学习学习学习
作者: hezochu    时间: 2015-9-1 13:44:37

不错.新手学习用
作者: sujinding    时间: 2015-9-24 09:16:30

本帖隐藏的内容需要积分高于 10 才可浏览,您当前积分为 1
作者: sujinding    时间: 2015-10-4 05:17:34

楼主辛苦了
作者: sujinding    时间: 2015-10-4 05:17:56

只有8分怎么破

作者: sujinding    时间: 2015-10-4 05:18:17

还差1分
作者: sujinding    时间: 2015-10-4 05:18:40

还差0分
作者: sujinding    时间: 2015-10-4 05:19:40

还差-1分
作者: w菲翔w    时间: 2015-11-11 18:30:24

好好学习天天上上
作者: hezochu    时间: 2015-11-14 15:31:25

小白...我想学习字幕
作者: w菲翔w    时间: 2015-11-14 16:23:30

好大的工程
作者: exooo    时间: 2015-11-18 06:57:16

提示: 作者被禁止或删除 内容自动屏蔽
作者: 790951063    时间: 2015-11-21 21:18:02

努力,努力。。。。。。
作者: zx7796396    时间: 2015-12-4 20:54:25

学习着,看代码
作者: iear07    时间: 2015-12-10 21:46:47

感谢分享……
作者: edsfef    时间: 2015-12-12 23:39:56

好强大的说.......
作者: fmecho    时间: 2015-12-20 12:58:39

学习了!!!
作者: kirito    时间: 2016-1-17 11:40:33

不错
作者: inalo    时间: 2016-1-19 11:54:34

感谢,正在努力学习中
作者: 路静兰    时间: 2016-2-21 19:53:44

小白新人来学习  感谢楼主!
作者: 肥秋    时间: 2016-3-11 11:46:15

支持一下,顺便学习
作者: exooo    时间: 2016-3-16 13:42:31

提示: 作者被禁止或删除 内容自动屏蔽
作者: 花卷    时间: 2016-6-18 13:43:19

有ass吗

作者: ABC不是菜    时间: 2016-9-11 18:52:45


好强大,回复看看
作者: covenchen    时间: 2016-10-10 19:55:08

想要简单的KARAOK特效·····
作者: cixiplc    时间: 2016-11-9 13:31:35

牛逼
作者: Kairu    时间: 2016-11-25 20:20:13

谢谢大神的努力!收下了
作者: 言芷夏    时间: 2017-5-19 15:18:52

謝謝樓主的分享,辛苦您了~
剛接觸製作字幕的小菜鳥,會努力向上的^^
作者: yylorz    时间: 2017-6-1 07:38:50

感觉真的开眼界了   666666
作者: xyz121777    时间: 2017-6-9 06:41:54

支持!
作者: sfz205    时间: 2017-6-14 02:27:57

好复杂呀,谢谢。
作者: swnheams    时间: 2017-7-11 06:17:44

观摩下,开始学习
作者: imprint-long    时间: 2018-8-12 17:19:31

学习学习
作者: rulkong    时间: 2019-1-8 04:26:43

学习学习~~~
作者: zhangrunze    时间: 2022-10-5 15:16:46

学习啦~回到代码时代~
辛苦啦~
作者: yjucg    时间: 2023-3-22 16:30:27

学习学习!




欢迎光临 TCAX 字幕特效制作工具官方论坛 | ASS | TCAS | Python | Aegisub | Lua (http://tcax.org/) Powered by Discuz! X2