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

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

作者: milkyjing    时间: 2014-8-17 10:21:34     标题: [J]042_KuroshitsujiIII_OP特效脚本 (附完整工程)

特效工程 http://pan.baidu.com/s/1o61BDxg
视频预览http://pan.baidu.com/s/1pJBdfCZ
  1. from tcaxPy import *
  2. from util.magick import *
  3. from util.tcAudio import *
  4. from util.tcCurve import *
  5. from pixLibs.ImageStone import *



  6. def tcaxPy_Init():
  7.     global _Fs
  8.     global _FD          # 一帧的持续时间, 约40毫秒
  9.     global _Spacing     # 字体间距
  10.     global Font         # 首要字体
  11.     global FontOut      # 字体边框
  12.     global FontOut2     # 字体边框2
  13.     global COLORS       # 边框二颜色
  14.     global IMG_texs      # 主要纹理
  15.     global IMG_mask
  16.     global IMG_eye
  17.     global leading_frame_count
  18.     global trailing_frame_count
  19.     global channel
  20.     global freq
  21.     global avg_bar
  22.     leading_frame_count = 10
  23.     trailing_frame_count = 10
  24.     _Fs = GetVal(val_FontSize)
  25.     _FD = 1000 / GetVal(val_FXFPS)
  26.     _FontFileName = GetVal(val_FontFileName)
  27.     _FaceID = GetVal(val_FaceID)
  28.     _Spacing = GetVal(val_Spacing)
  29.     Font = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), 0xFFFFFF, 0, 0)
  30.     FontOut = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), 0xFFFFFF, 3, 1)
  31.     FontOut2 = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), 0xFFFFFF, 2, 0)
  32.     COLORS = ['000000', '000000', '88AA33', '88AA33', '88AA33', 'C60D65', 'C60D65', 'F17A3A', 'F17A3A']
  33.     IMG_tex1 = Image('images\\blurred_noise.jpg')
  34.     IMG_tex2 = Image('images\\blurred_noise2.jpg')
  35.     IMG_tex3 = Image('images\\blurred_noise3.jpg')
  36.     IMG_tex4 = Image('images\\blurred_noise4.jpg')
  37. #    PIX = pmgToPix(IMG)
  38. #    PIX = PixColorMul(PIX, 1, 1, 1, 1)
  39. #    IMG_tex4 = pmgToImage(PIX)
  40.     IMG_texs = [IMG_tex1, IMG_tex1, IMG_tex2, IMG_tex2, IMG_tex2, IMG_tex3, IMG_tex3, IMG_tex4, IMG_tex4]
  41. #    PIX = BlankPix(60, 60, MakeRGBA(255, 255, 255, 255))
  42. #    IMG_mask = pmgToImage(PIX)
  43.     IMG_mask = Image('images\\radial.jpg')
  44.     # create shaeru's purple magical eye
  45.     img = Image(abspath('images\\purple_eye.jpg'))
  46.     img.filterType(FilterTypes.CubicFilter)
  47.     img.resize('100x100000')
  48.     img.backgroundColor('Transparent')
  49.     IMG = Image(img) # create a mask
  50.     IMG.type(ImageType.GrayscaleType)
  51.     PIX = pmgToPix(IMG)
  52.     PIX_mask = r2a(PIX)    # the mask
  53.     PIX = BlankPix(IMG.columns(), IMG.rows(), MakeRGBA(255, 255, 255, 255))    # make the inner white color
  54.     PIX_white = PixMask(PIX, PIX_mask)
  55.     PIX = pmgToPix(img)    # the original image
  56.     PIX = PixMask(PIX, PIX_mask)    # with the black masked out
  57.     PIX = PixBlur(PIX, 10)    # blur it
  58.     PIX = PixColorMul(PIX, 1.2, 1, 1.2, 3.5)    # make it more visible
  59. #    PIX = PixColorMul(PIX, 5, 1, 20, 1)
  60. #    PIX = pstSoftGlow(PIX, 10, 180, 160)
  61.     PIX = CombinePixs(PIX, PIX_white)
  62.     IMG = pmgToImage(PIX)    # convert to image magick object
  63.     IMG.backgroundColor('Transparent')
  64.     IMG_eye = IMG
  65.     # tc Audio
  66.     tcAudioInit()
  67.     channel = tcAudioOpen('OP.mp3')
  68.     freq = tcAudioGetFreq(channel)      # usually 44100 Hz
  69.     avg_bar = 100


  70. def tcaxPy_Fin():
  71.     tcAudioFin()
  72.     FinFont(Font)
  73.     FinFont(FontOut)
  74.     FinFont(FontOut2)

  75. # 用户修订版的tcaxPy_Main函数, 保留原始tcaxPy_Main风格是为了减少额外记忆量, 实际上该函数形式可以非常多样化
  76. def tcaxPy_Main_Fake(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt, param):
  77.     ASS_BUF  = []        # 保存ASS特效
  78.     TCAS_BUF = []        # 保存TCAS特效
  79.     ##### 主要特效编写操作 ####
  80. #    if _i == 3:
  81. #        _x = GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i] - GetVal(val_OffsetX) + GetVal(val_TextAdvanceDiff)[_i][_j]
  82.     dx = _x - int((_a + _Spacing) / 2 + 0.5)     # 一个固定操作, 将an5的坐标转换为an7
  83.     dy = _y - int(_Fs / 2 + 0.5)    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  84. #     一些时间的计算
  85.     T0 = 10 * _start - 10 * _FD + 2 * _j * _FD
  86.     T1 = T0 + 4 * _FD
  87.     T2 = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
  88.     T3 = T2 + _FD * 6
  89.     TS = 10 * _start - 40 * _FD
  90.     TK = 10 * (_start + _elapk)
  91.     TE = 10 * _end + 10 * _FD

  92.     # 文字主体
  93.     PIX = TextPix(Font, _txt)
  94.     IMG = Image(IMG_texs[_i])
  95.     xoff = randint(0, IMG.columns() - PIX[1][0])
  96.     yoff = (randint(0, 54), randint(90, IMG.rows() - PIX[1][1]))[randint(0, 1)]
  97.     IMG.crop(Geometry(PIX[1][0], PIX[1][1], xoff, yoff))
  98.     PIX_tex = pmgToPix(IMG)
  99.     PIX_t = PixTexture(PIX, PIX_tex)
  100.     # 边框主体
  101.     PIX = TextPix(FontOut, _txt)
  102.     PIX = PixColorRGB(PIX, DecRGB(COLORS[_i]))
  103.     PIX = PixColorMul(PIX, 0.7, 0.7, 0.7, 0.8)
  104.     PIX_o = PixBlur(PIX, 8)
  105.     # 混合
  106.     PIX = CombinePixs(PIX_o, PIX_t)
  107.     PIX0 = PIX
  108.         
  109.     # 第一二句效果
  110.     if _i < 2:

  111.         ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  112.         BigPixAdd(param[0], PIX0, dx, dy, 0)

  113.         # 表现效果
  114.         num = int(10 * _k / _FD + 0.5) + 1
  115.         total_num = int(10 * (_end - _start) / _FD + 0.5) + leading_frame_count + trailing_frame_count
  116.         for i in range(num):
  117.             faX = i / num
  118.             fa = 1 + 0.5 * faX
  119.             PIX = PixResizeF(PIX0, PIX0[1][0] * fa, 0)
  120.             PIX = BilinearFilter(PIX, dx, dy)
  121.             PIX = PixColorMul(PIX, 200, 1, 150, 0.8 + 0.2 * (num - i) / num)
  122.             PIX = PixBlur(PIX, (i + 1) * 2)
  123.             # 坐标校正
  124.             if _i % 2 == 0:   # 第一句向右, 第二句向左移动
  125.                 PIX = PixPosShift(PIX, int(10 * _elapk / _FD + 0.5) + leading_frame_count + i, 0)
  126.             else:
  127.                 PIX = PixPosShift(PIX, total_num - (int(10 * _elapk / _FD + 0.5) + leading_frame_count + i) - 1, 0)
  128.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 2)
  129.         # 附加效果
  130.         num = int(10 * _k / _FD + 0.5) + 10
  131.         start_pic = randint(1, 30)
  132.         for i in range(num):
  133.             ts4 = 10 * (_start + _elapk) + i * _FD
  134.             te4 = ts4 + _FD
  135.             img_path = MakePath(1, i + start_pic, 'images', 'list', 'img', '.png', 'sys')
  136.             PIX = ImagePix(abspath(img_path))
  137.             if i < 5:
  138.                 PIX = PixColorMul(PIX, 1, 1, 1, (i + 1) / 5)
  139.             elif i > num - 5:
  140.                 PIX = PixColorMul(PIX, 1, 1, 1, (num - i) / 5)
  141.             # 坐标校正
  142.             if _i % 2 == 0:   # 第一句向右, 第二句向左移动
  143.                 PIX = PixPosShift(PIX, int(10 * _elapk / _FD + 0.5) + leading_frame_count + i, 0)
  144.             else:
  145.                 PIX = PixPosShift(PIX, total_num - (int(10 * _elapk / _FD + 0.5) + leading_frame_count + i) - 1, 0)
  146.             tcas_main(TCAS_BUF, PIX, ts4, te4, _x - PIX[1][0] / 2, _y - PIX[1][1] / 2, 0)
  147.                     
  148.     # 第三四五句效果
  149.     elif _i < 5:
  150.    
  151.         # 整体模糊
  152.         PIX2 = PixBlur(PIX0, 2)

  153.         ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  154.         BigPixAdd(param[0], PIX2, dx, dy, 0)
  155.         
  156.         # 第三句有入场效果, 第五句有出场效果
  157.         # 入场效果
  158.         if _i == 2:
  159.         
  160.             # beat detect, initial beat
  161.             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * _start - _FD) / 1000))
  162.             fft = tcAudioGetFFT(channel, 2048)
  163.             bar = Spectrum(fft)[1]
  164.             if bar > avg_bar:
  165.                 PIX2 = PixBlur(PIX2, sqr(bar / avg_bar))
  166.             
  167.             num = leading_frame_count // 2
  168.             TS = 10 * _start - leading_frame_count * _FD + randint(0, leading_frame_count - num - 1) * _FD
  169.             for i in range(num):
  170.                 ts1 = TS + i * _FD
  171.                 te1 = ts1 + _FD
  172.                 PIX = PixBlur(PIX2, (num - i) * 6)
  173.                 PIX = PixResize(PIX, PIX2[1][0], PIX[1][1] * (1 + 2 * (num - i) / num))
  174.                 PIX = PixColorMul(PIX, 1, 1, 1, 0.5 + 0.5 * (i + 1) / num)
  175.                 tcas_main(TCAS_BUF, PIX, ts1, te1, dx, dy, 0)
  176.             tcas_main(TCAS_BUF, PIX2, te1, 10 * _start, dx, dy, 0)
  177.         
  178.         elif _i == 4:
  179.         
  180.             # beat detect, initial beat
  181.             tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (10 * _end) / 1000))
  182.             fft = tcAudioGetFFT(channel, 2048)
  183.             bar = Spectrum(fft)[1]
  184.             if bar > avg_bar:
  185.                 PIX2 = PixBlur(PIX2, sqr(bar / avg_bar))
  186.             
  187.             num = trailing_frame_count // 2
  188.             TS = 10 * _end + randint(1, trailing_frame_count - num) * _FD
  189.             tcas_main(TCAS_BUF, PIX2, 10 * _end, TS, dx, dy, 0)
  190.             for i in range(num):
  191.                 ts1 = TS + i * _FD
  192.                 te1 = ts1 + _FD
  193.                 PIX = PixBlur(PIX2, (i + 1) * 6)
  194.                 PIX = PixResize(PIX, PIX2[1][0], PIX[1][1] * (1 + 2 * (i + 1) / num))
  195.                 PIX = PixColorMul(PIX, 1, 1, 1, 0.5 + 0.5 * (num - i) / num)
  196.                 tcas_main(TCAS_BUF, PIX, ts1, te1, dx, dy, 0)
  197.    
  198.     # 第六七句效果
  199.     elif _i < 7:

  200.         ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  201.         BigPixAdd(param[0], PIX0, dx, dy, 0)
  202.         
  203.         # 存在效果
  204.         tcas_main(TCAS_BUF, PIX0, 10 * _start, TK, dx, dy, 0)
  205.         
  206.         # 表现效果
  207.         num = int(10 * _k / _FD + 0.5) + 1
  208.         for i in range(num):
  209.             faX = i / num
  210.             fa = 1 + 0.4 * faX
  211.             PIX = PixResizeF(PIX0, PIX0[1][0] * fa, 0)
  212.             PIX = BilinearFilter(PIX, dx, dy)
  213.             PIX = PixColorMul(PIX, 30, 30, 30, 0.5 + 0.5 * (num - i) / num)
  214.             PIX = PixBlur(PIX, (i + 1) * 2)
  215.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 2)
  216.         
  217.         te2 = TK + num / 2 * _FD
  218.         
  219.         xv = [w for w in range(6, PIX0[1][0], 6)]
  220.         yv = [h for h in range(6, PIX0[1][1], 6)]
  221.         PIX_list = PixSubClips(PIX0, xv, yv)
  222.         pix_num = len(PIX_list)
  223.         P = []
  224.         for i in range(pix_num):
  225.             if i % 2 == 0:
  226.                 pt0 = (dx, dy)
  227.                 pt1 = (dx - 10, dy + 5)
  228.             else:
  229.                 pt0 = (dx, dy)
  230.                 pt1 = (dx - 10, dy - 5)
  231.             P.append((pt0, pt1))
  232.         # 出场效果
  233.         num = 15
  234.         r1 = [randint(-4, -2), randint(2, 4)][randint(0, 1)]
  235.         for i in range(num):
  236.             for j in range(pix_num):
  237.                 ts3 = te2 + i * _FD
  238.                 te3 = ts3 + _FD
  239.                 x, y, a = LinearBezier(P[j][0], P[j][1], i / num)
  240.                 PIX = PixResizeF(PIX_list[j], PIX_list[j][1][0] * (0.6 + 0.4 * (num - i) / num), 0)
  241.                 PIX = PixPosShift(PIX, -0.3 * i - 2, r1)
  242.                 PIX = BilinearFilter(PIX, x, y)
  243.                 PIX = PixBlur(PIX, 1 + 6 * (i + 1) / num)
  244.                 PIX = PixColorMul(PIX, 1, 1, 1, 0.8 + 0.2 * (num - i) / num)
  245.                 tcas_main(TCAS_BUF, PIX, ts3, te3, x, y, 1)
  246.    
  247.     # 第八句效果
  248.     elif _i < 8:

  249.         ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  250.         BigPixAdd(param[0], PIX0, dx, dy, 0)
  251.         
  252.         # 表现效果
  253.         num = int(10 * _k / _FD + 0.5) + 1
  254.         for i in range(num):
  255.             faX = i / num
  256.             fa = 1 + 0.4 * faX
  257.             PIX = PixResizeF(PIX0, PIX0[1][0] * fa, 0)
  258.             PIX = BilinearFilter(PIX, dx, dy)
  259.             PIX = PixColorMul(PIX, 1, 1, 1, 0.7 + 0.3 * (num - i) / num)
  260.             PIX = PixBlur(PIX, (i + 1) * 2)
  261.             PIX = pstSoftGlow(PIX, 10, 160, 140)
  262.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 2)
  263.             
  264.         # 附加效果1
  265.         if _j == _n - 1:
  266.             num = int(10 * _k / _FD + 0.5) + 1
  267.         else:
  268.             num = int(10 * max(35, min(_k, 50)) * 2 / _FD + 0.5) + 1
  269.         for i in range(num):
  270.             img = Image(IMG_eye)
  271.             img.rotate(360 * 0.8 * i / num)
  272.             PIX = PixColorMul(pmgToPix(img), 1, 1, 1, linearFactor2(i / num))
  273.             PIX = PixPos(PIX, PIX_t[0][0] + (PIX_t[1][0] - PIX[1][0]) / 2, PIX_t[0][1] + (PIX_t[1][1] - PIX[1][1]) / 2)
  274.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 0)
  275.             
  276.         # 附加效果2
  277.         if _j == _n - 1:
  278.             num = 10
  279.         else:
  280.             num = 20
  281.         for i in range(num):
  282.             ts4 = 10 * (_start + _elapk) + i * _FD
  283.             te4 = ts4 + _FD
  284.             img_path = MakePath(3, 2 * i + 20, 'images', 'list', 'img', '.png', 'sys')
  285.             PIX = ImagePix(abspath(img_path))
  286.             if i > num - 12:
  287.                 PIX = PixColorMul(PIX, 1, 1, 1, (num - i) / 12)
  288.             tcas_main(TCAS_BUF, PIX, ts4, te4, _x - PIX[1][0] / 2, _y - PIX[1][1] / 2, 0)
  289.             
  290.     # 第九句效果
  291.     elif _i < 9:
  292.    
  293.         dx -= GetVal(val_OffsetX)
  294.         dx += GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i] - GetVal(val_OffsetX)
  295.         
  296.         _x -= GetVal(val_OffsetX)
  297.         _x += GetVal(val_ResolutionX) - GetVal(val_TextLength)[_i] - GetVal(val_OffsetX)

  298.         ### 增加到 BIG_PIX 当中, BIG_PIX保存在param的第一个元素处, 关于BIG_PIX用法, 请看专门教程
  299.         BigPixAdd(param[0], PIX0, dx, dy, 0)
  300.         
  301.         # 表现效果
  302.         if _j == _n - 1:
  303.             num = int(10 * _k / _FD + 0.5) + 1
  304.         else:
  305.             num = int(10 * min(_k, 50) * 2 / _FD + 0.5) + 1
  306.         for i in range(num):
  307.             img = Image(IMG_eye)
  308.             img.rotate(360 * 0.8 * i / num)
  309.             PIX = PixColorMul(pmgToPix(img), 1, 1, 1, linearFactor2(i / num))
  310.             PIX = PixPos(PIX, PIX_t[0][0] + (PIX_t[1][0] - PIX[1][0]) / 2, PIX_t[0][1] + (PIX_t[1][1] - PIX[1][1]) / 2)
  311.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 0)
  312.             
  313.         # 表现效果
  314. #        num = int(10 * _k / _FD + 0.5) + 1
  315. #        for i in range(num):
  316. #            faX = i / num
  317. #            fa = 1 + 0.4 * faX
  318. #            PIX = PixResizeF(PIX0, PIX0[1][0] * fa, 0)
  319. #            PIX = BilinearFilter(PIX, dx, dy)
  320. #            PIX = PixColorMul(PIX, 1, 1, 1, 0.5 + 0.5 * (num - i) / num)
  321. #            PIX = PixBlur(PIX, (i + 1) * 2)
  322. #            tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 2)
  323.             
  324.         # 表现效果
  325.         num = int(10 * _k / _FD + 0.5) + 1
  326.         for i in range(num):
  327.             faX = i / num
  328.             fa = 1 + 0.4 * faX
  329.             PIX = PixResizeF(PIX0, PIX0[1][0] * fa, 0)
  330.             PIX = BilinearFilter(PIX, dx, dy)
  331.             PIX = PixColorMul(PIX, 1, 1, 1, 0.7 + 0.3 * (num - i) / num)
  332.             PIX = PixBlur(PIX, (i + 1) * 2)
  333.             PIX = pstSoftGlow(PIX, 10, 160, 140)
  334.             tcas_main(TCAS_BUF, PIX, TK + i * _FD, TK + (i + 1) * _FD, dx, dy, 2)
  335.             
  336.         # 附加效果
  337.         if _j == _n - 1:
  338.             num = int(10 * _k / _FD + 0.5) + 1
  339.         else:
  340.             num = int(10 * _k / _FD + 0.5) + 10
  341.         start_pic = randint(1, 30)
  342.         for i in range(num):
  343.             ts4 = 10 * (_start + _elapk) + i * _FD
  344.             te4 = ts4 + _FD
  345.             img_path = MakePath(1, i + start_pic, 'images', 'list', 'img', '.png', 'sys')
  346.             PIX = ImagePix(abspath(img_path))
  347.             if i < 5:
  348.                 PIX = PixColorMul(PIX, 1, 1, 1, (i + 1) / 5)
  349.             elif i > num - 5:
  350.                 PIX = PixColorMul(PIX, 1, 1, 1, (num - i) / 5)
  351.             tcas_main(TCAS_BUF, PIX, ts4, te4, _x - PIX[1][0] / 2, _y - PIX[1][1] / 2, 0)
  352.         
  353.     # 第x句效果
  354.     else:
  355.         pass
  356.             
  357. #     将结果返回给tcax进行处理 #####
  358.     return (ASS_BUF, TCAS_BUF)

  359. def tcaxPy_User():
  360.     file_name = GetVal(val_OutFile) + '.ass'
  361.     ass_header = GetVal(val_AssHeader)
  362.     ASS_FILE = CreateAssFile(file_name, ass_header)
  363.    
  364.     file_name = GetVal(val_OutFile) + '.tcas'
  365.     fx_width = GetVal(val_ResolutionX)
  366.     fx_height = GetVal(val_ResolutionY)
  367.     fx_fps = GetVal(val_FXFPS)
  368.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  369.     # basic metrics
  370.     fontSize   = GetVal(val_FontSize)
  371.     marginX    = GetVal(val_OffsetX)
  372.     marginY    = GetVal(val_OffsetY)
  373.     spacing    = GetVal(val_Spacing)
  374.     lineNum    = GetVal(val_nLines)
  375.     textNum    = GetVal(val_nTexts)
  376.     start      = GetVal(val_BegTime)
  377.     end        = GetVal(val_EndTime)
  378.     kar        = GetVal(val_KarTime)
  379.     elapKar    = GetVal(val_KarTimeDiff)
  380.     text       = GetVal(val_Text)
  381.     textLength = GetVal(val_TextLength)
  382.     advance    = GetVal(val_TextAdvance)
  383.     advDiff    = GetVal(val_TextAdvanceDiff)
  384.     # main loop
  385.     for i in range(0, lineNum):
  386.         initPosX = marginX    #(fx_width - textLength[i]) / 2 + marginX        # if marginX = 0, then it's just on the middle
  387.         initPosY = fx_height - marginY - fontSize
  388.         BIG_PIX = InitBigPix()
  389.         for j in range(textNum[i]):
  390.             if text[i][j] == '' or text[i][j] == ' ' or text[i][j] == ' ':
  391.                 continue
  392.             posX = initPosX + advDiff[i][j] + advance[i][j] / 2
  393.             posY = initPosY + fontSize / 2
  394.             param = [BIG_PIX]
  395.             ASS_BUF, TCAS_BUF = tcaxPy_Main_Fake(i, j, textNum[i], start[i], end[i], elapKar[i][j], kar[i][j], posX, posY, advance[i][j], text[i][j], param)
  396.             if len(TCAS_BUF) != 0:
  397.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  398.             if len(ASS_BUF) != 0:
  399.                 WriteAssFile(ASS_FILE, ASS_BUF)
  400.             Progress(i, j)
  401.         # 一二句进出场以及显示效果
  402.         if i < 2:
  403.             num = int(10 * (end[i] - start[i]) / _FD + 0.5) + leading_frame_count + trailing_frame_count
  404.             TS = start[i] * 10 - leading_frame_count * _FD
  405.             PIX1 = ConvertBigPix(BIG_PIX)
  406.             blur_flag = False
  407.             counter = 0
  408.             for ii in range(num):
  409.                 TCAS_BUF = []
  410.                 # position
  411.                 if i % 2 == 0:   # 第一句向右, 第二句向左移动
  412.                     PIX = PixPosShift(PIX1, ii, 0)
  413.                 else:
  414.                     PIX = PixPosShift(PIX1, num - ii - 1, 0)
  415.                 # blur effect
  416.                 if ii < 10:
  417.                     PIX = PixBlur(PIX, (leading_frame_count - ii) * 4)
  418.                 elif ii > num - trailing_frame_count - 1:
  419.                     PIX = PixBlur(PIX, (ii - (num - trailing_frame_count - 1)) * 4)
  420.                 else:
  421.                     m = 2
  422.                     if blur_flag:
  423.                         PIX = PixBlur(PIX, 2 * fac_func(counter, m))
  424.                         counter += 1
  425.                         if counter == 2 * m:
  426.                             blur_flag = False
  427.                             counter = 0
  428.                     elif randint(0, 8) == 0:
  429.                         blur_flag = True
  430.                 tcas_main(TCAS_BUF, PIX, TS + ii * _FD, TS + (ii + 1) * _FD, 0, 0, 0)
  431.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  432.                 progress(ii + 1, num)
  433.         # 三四五显示效果
  434.         elif i < 5:
  435.             num = int(10 * (end[i] - start[i]) / _FD + 0.5)
  436.             TS = start[i] * 10
  437.             PIX1 = ConvertBigPix(BIG_PIX)
  438.             for ii in range(num):
  439.                 TCAS_BUF = []
  440.                 PIX = PIX1
  441.                 # beat detect
  442.                 tcAudioSetPos(channel, tcAudioSec2Bytes(channel, (TS + ii * _FD) / 1000))
  443.                 fft = tcAudioGetFFT(channel, 2048)
  444.                 bar = Spectrum(fft)[1]
  445.                 #PIX = PixColorMul(PIX, 1, 1, 1, bar / 333)
  446.                 #PIX = PixColorRGB(PIX, MakeRGB(bar * 255 / 333, 0, 0))
  447.                 if bar > avg_bar:
  448.                     PIX = PixBlur(PIX, sqr(bar / avg_bar))
  449.                 tcas_main(TCAS_BUF, PIX, TS + ii * _FD, TS + (ii + 1) * _FD, 0, 0, 0)
  450.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  451.                 progress(ii + 1, num)
  452.         # 六七显示效果
  453.         elif i < 7:
  454.             # 入场效果
  455.             num = leading_frame_count * 2
  456.             PIX1 = ConvertBigPix(BIG_PIX)
  457.             CANVAS = BlankPix(PIX1[1][0] * 3, PIX1[1][1] * 3, MakeRGBA(0, 0, 0, 0))
  458.             for ii in range(num):
  459.                 TCAS_BUF = []
  460.                 theta = pi / 2 * (0.5 + 0.5 * (ii + 1) / num)
  461.                 #Ay = -12 - 1 * (num - ii)
  462.                 Ay = -15 - 1 * (num - ii)
  463.                 #orgX = 1.5 * PIX1[1][0] * ii / num
  464.                 orgX = 2 * PIX1[1][0] * ii / num
  465.                 PIX = PixMap_enlarge(CANVAS, PIX1, page_curl_core_ex, (theta, Ay, orgX))
  466.                 PIX = PixPos(PIX, PIX1[0][0] - PIX1[1][0], PIX1[0][1] - PIX1[1][1])
  467.                 PIX = PixStrip(PIX)
  468.                 blur_val = 2
  469.                 if ii > num / 2:
  470.                     blur_val = 1
  471.                 PIX = PixBlur(PIX, blur_val)
  472.                 PIX = PixColorMul(PIX, 1, 1, 1, (ii + 1) / num)
  473.                 time_start1 = 10 * start[i] - num * _FD + ii * _FD
  474.                 time_end1 = time_start1 + _FD
  475.                 tcas_main(TCAS_BUF, PIX, time_start1, time_end1, 0, 0, 0)
  476.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  477.                 progress(ii + 1, num)
  478.         # 第八句效果
  479.         elif i < 8:
  480.         
  481.             # 入场效果
  482.             PIX1 = ConvertBigPix(BIG_PIX)
  483.             mask_width = PIX1[1][0] // leading_frame_count
  484.             mask_height = PIX1[1][1]
  485.             num = leading_frame_count
  486.             TS = start[i] * 10 - leading_frame_count * _FD
  487.             for ii in range(num):
  488.                 TCAS_BUF = []
  489.                 ts1 = TS + ii * _FD
  490.                 te1 = ts1 + _FD
  491.                 IMG = Image(IMG_mask)
  492.                 IMG.filterType(FilterTypes.CubicFilter)
  493.                 IMG.resize('!{0}x{1}'.format(mask_width * (ii + 1), mask_height))
  494.                 PIX = pmgToPix(IMG)
  495.                 PIX = r2a(PIX)
  496.                 PIX = invertA(PIX)
  497.                 PIX = PixColorMul(PIX, 0, 0, 0, 2)
  498.                 PIX = PixPos(PIX, PIX1[0][0] + (PIX1[1][0] - PIX[1][0]) // 2, PIX1[0][1])
  499.                 mask = PIX
  500.                 PIX = PixMask(PIX1, mask)
  501.                 tcas_main(TCAS_BUF, PIX, ts1, te1, 0, 0, 0)
  502.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  503.                 progress(ii + 1, num)
  504.             
  505.             # 存在效果
  506.             TCAS_BUF = []
  507.             tcas_main(TCAS_BUF, PIX1, 10 * start[i], 10 * end[i], 0, 0, 0)
  508.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  509.         
  510.             # 出场效果
  511.             num = trailing_frame_count + 2
  512.             PIX1 = ConvertBigPix(BIG_PIX)
  513.             CANVAS = BlankPix(PIX1[1][0] * 3, PIX1[1][1] * 3, MakeRGBA(0, 0, 0, 0))
  514.             for ii in range(num):
  515.                 TCAS_BUF = []
  516.                 theta = pi / 2 * (0.5 + 0.5 * (num - ii) / num)
  517.                 Ay = -15 - 1 * (ii + 1)
  518.                 orgX = 2 * PIX1[1][0] * (num - ii - 1) / num
  519.                 PIX = PixMap_enlarge(CANVAS, PIX1, page_curl_core_ex, (theta, Ay, orgX))
  520.                 PIX = PixPos(PIX, PIX1[0][0] - PIX1[1][0], PIX1[0][1] - PIX1[1][1])
  521.                 PIX = PixStrip(PIX)
  522.                 blur_val = 1
  523.                 if ii > num / 2:
  524.                     blur_val = 2
  525.                 PIX = PixBlur(PIX, blur_val)
  526.                 PIX = PixColorMul(PIX, 1, 1, 1, (num - ii) / num)
  527.                 time_start1 = 10 * end[i] + ii * _FD
  528.                 time_end1 = time_start1 + _FD
  529.                 tcas_main(TCAS_BUF, PIX, time_start1, time_end1, 0, 0, 0)
  530.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  531.                 progress(ii + 1, num)
  532.                
  533.         # 第九句效果
  534.         elif i < 9:
  535.         
  536.             # 入场效果
  537.             num = leading_frame_count * 2
  538.             PIX1 = ConvertBigPix(BIG_PIX)
  539.             CANVAS = BlankPix(PIX1[1][0] * 3, PIX1[1][1] * 3, MakeRGBA(0, 0, 0, 0))
  540.             for ii in range(num):
  541.                 TCAS_BUF = []
  542.                 theta = pi / 2 * (0.5 + 0.5 * (ii + 1) / num)
  543.                 #Ay = -12 - 1 * (num - ii)
  544.                 Ay = -15 - 1 * (num - ii)
  545.                 #orgX = 1.5 * PIX1[1][0] * ii / num
  546.                 orgX = 2 * PIX1[1][0] * ii / num
  547.                 PIX = PixMap_enlarge(CANVAS, PIX1, page_curl_core_ex, (theta, Ay, orgX))
  548.                 PIX = PixPos(PIX, PIX1[0][0] - PIX1[1][0], PIX1[0][1] - PIX1[1][1])
  549.                 PIX = PixStrip(PIX)
  550.                 blur_val = 2
  551.                 if ii > num / 2:
  552.                     blur_val = 1
  553.                 PIX = PixBlur(PIX, blur_val)
  554.                 PIX = PixColorMul(PIX, 1, 1, 1, (ii + 1) / num)
  555.                 time_start1 = 10 * start[i] - num * _FD + ii * _FD
  556.                 time_end1 = time_start1 + _FD
  557.                 tcas_main(TCAS_BUF, PIX, time_start1, time_end1, 0, 0, 0)
  558.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  559.                 progress(ii + 1, num)
  560.             
  561.             # 存在效果
  562.             TCAS_BUF = []
  563.             tcas_main(TCAS_BUF, PIX1, 10 * start[i], 10 * end[i], 0, 0, 0)
  564.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  565.                
  566.             # 出场效果
  567.             PIX1 = ConvertBigPix(BIG_PIX)
  568.             mask_width = PIX1[1][0] // leading_frame_count
  569.             mask_height = PIX1[1][1]
  570.             num = leading_frame_count
  571.             TS = end[i] * 10
  572.             for ii in range(num):
  573.                 TCAS_BUF = []
  574.                 ts1 = TS + ii * _FD
  575.                 te1 = ts1 + _FD
  576.                 IMG = Image(IMG_mask)
  577.                 IMG.filterType(FilterTypes.CubicFilter)
  578.                 IMG.resize('!{0}x{1}'.format(mask_width * (num - ii), mask_height))
  579.                 PIX = pmgToPix(IMG)
  580.                 PIX = r2a(PIX)
  581.                 PIX = invertA(PIX)
  582.                 PIX = PixColorMul(PIX, 0, 0, 0, 2)
  583.                 PIX = PixPos(PIX, PIX1[0][0] + (PIX1[1][0] - PIX[1][0]) // 2, PIX1[0][1])
  584.                 mask = PIX
  585.                 PIX = PixMask(PIX1, mask)
  586.                 tcas_main(TCAS_BUF, PIX, ts1, te1, 0, 0, 0)
  587.                 WriteTcasFile(TCAS_FILE, TCAS_BUF)
  588.                 progress(ii + 1, num)
  589.                
  590.         # 第x句效果
  591.         else:
  592.             pass
  593.             
  594.     FinTcasFile(ASS_FILE)
  595.     FinTcasFile(TCAS_FILE)

  596. def sqr(x):
  597.     return x * x

  598. def fac_func(x, m):
  599.     if x < m:
  600.         return x + 1
  601.     else:
  602.         return 2 * m - x + 1

  603. def linearFactor2(x):
  604.     if x < 0.5:
  605.         return 1
  606.     else:
  607.         return 1 - 2 * (x - 0.5)

  608. SPECWIDTH = 368
  609. SPECHEIGHT = 127
  610. BANDS = 6

  611. def Spectrum(fft):      # convert fft data to graph
  612.     bars = []
  613.     b0 = 0
  614.     for x in range(BANDS):
  615.         peak = 0        # peak of a certain bar
  616.         b1 = pow(2, x * 10.0 / (BANDS - 1))
  617.         if b1 > 1023:
  618.             b1 = 1023
  619.         if b1 <= b0:
  620.             b1 = b0 + 1    # make sure it uses at least 1 FFT bin
  621.         while b0 < b1:
  622.             if peak < fft[1 + b0]:
  623.                 peak = fft[1 + b0]
  624.             b0 += 1
  625.         y = sqrt(peak) * 5 * SPECHEIGHT
  626.         bars.append(y)
  627.     return bars

  628. # page curl effect

  629. def page_curl_core_ex(Px, Py, param):
  630.     theta, Ay, orgX = param
  631.     Px -= orgX
  632.     R = sqrt(Px * Px + (Py - Ay) * (Py - Ay))
  633.     alpha = asin(Px / R)
  634.     beta = alpha / sin(theta)
  635.     r = R * sin(theta)
  636.     Tx = r * sin(beta)
  637.     Ty = R + Ay - r * (1 - cos(beta)) * sin(theta)
  638.     Tz = r * (1 - cos(beta)) * cos(theta)
  639.     return (Tx + orgX, Ty, Tz)

  640. def PixMap_enlarge(PIX_dst, PIX_src, map_func, param):
  641.     buf_dst = list(PIX_dst[2])
  642.     width_dst = PIX_dst[1][0]
  643.     height_dst = PIX_dst[1][1]
  644.    
  645.     buf_src = list(PIX_src[2])
  646.     width_src = PIX_src[1][0]
  647.     height_src = PIX_src[1][1]
  648.    
  649.     for h in range(height_src):
  650.         for w in range(width_src):
  651.             P = map_func(w, h, param)
  652.             x = int(P[0] + 0.5) + width_src
  653.             y = int(P[1] + 0.5) + height_src
  654.             if x in range(width_dst) and y in range(height_dst):
  655.                 index_src = 4 * (h * width_src + w)
  656.                 index_dst = 4 * (y * width_dst + x)
  657.                 buf_dst[index_dst + 0] = buf_src[index_src + 0]
  658.                 buf_dst[index_dst + 1] = buf_src[index_src + 1]
  659.                 buf_dst[index_dst + 2] = buf_src[index_src + 2]
  660.                 buf_dst[index_dst + 3] = buf_src[index_src + 3]
  661.     return (PIX_dst[0], PIX_dst[1], tuple(buf_dst))


  662. def PixSubClips(PIX, xv, yv):
  663.     PIX_list = []
  664.     xv = list(xv)
  665.     yv = list(yv)
  666.     xv.append(PIX[1][0])
  667.     yv.append(PIX[1][1])
  668.     xv.sort()
  669.     yv.sort()
  670.     xn = len(xv)
  671.     yn = len(yv)
  672.     y_off = 0
  673.     for j in range(yn):
  674.         x_off = 0
  675.         for i in range(xn):
  676.             PIX_sub_pos = (PIX[0][0] + x_off, PIX[0][1] + y_off)
  677.             PIX_sub_res = (xv[i] - x_off, yv[j] - y_off)
  678.             PIX_sub_rgba = []
  679.             for h in range(PIX_sub_res[1]):
  680.                 for w in range(PIX_sub_res[0]):
  681.                     idx = 4 * ((h + y_off) * PIX[1][0] + w + x_off)
  682.                     PIX_sub_rgba.append(PIX[2][idx])
  683.                     PIX_sub_rgba.append(PIX[2][idx + 1])
  684.                     PIX_sub_rgba.append(PIX[2][idx + 2])
  685.                     PIX_sub_rgba.append(PIX[2][idx + 3])
  686.             PIX_list.append((PIX_sub_pos, PIX_sub_res, tuple(PIX_sub_rgba)))
  687.             x_off = xv[i]
  688.         y_off = yv[j]
  689.     return PIX_list


  690. def r2a(PIX):
  691.     buf = []
  692.     width = PIX[1][0]
  693.     height = PIX[1][1]
  694.     for h in range(height):
  695.         for w in range(width):
  696.             index = 4 * (h * width + w)
  697. #            if PIX[2][index] != PIX[2][index + 1] or PIX[2][index] != PIX[2][index + 2]:
  698. #                print('note1')
  699. #            if PIX[2][index + 3] != 255:
  700. #                print('note2')
  701.             buf.append(0)
  702.             buf.append(0)
  703.             buf.append(0)
  704.             buf.append(PIX[2][index + 0])
  705.     return (PIX[0], PIX[1], tuple(buf))

  706. def invertA(PIX):
  707.     buf = list(PIX[2])
  708.     width = PIX[1][0]
  709.     height = PIX[1][1]
  710.     for h in range(height):
  711.         for w in range(width):
  712.             index = 4 * (h * width + w) + 3
  713.             buf[index] = 255 - buf[index]
  714.     return (PIX[0], PIX[1], tuple(buf))
复制代码

作者: zxdfcgv    时间: 2014-8-17 11:04:35

奶大太逗。写这么多...要做巨无霸汉堡?

现已加入肯德基超豪华午餐
作者: 花小栗    时间: 2014-8-17 17:30:21

milk大大酷爱收下窝的膝盖!~~
作者: 忘却の小伊    时间: 2014-8-17 18:38:46

好长好长好长····
作者: oiuu    时间: 2014-11-1 13:00:33

大神,请教一下,这些在哪里下载?怎么用啊?直接丢在工程文件夹里?from util.magick import *
from util.tcAudio import *
from util.tcCurve import *
from pixLibs.ImageStone import
作者: oiuu    时间: 2014-11-1 19:18:49

我上面问题刚刚自己解决了,感谢楼主分享的代码,效果真是绚丽。感觉我在自言自语啊。
作者: milkyjing    时间: 2014-11-9 21:07:04

oiuu 发表于 2014-11-1 19:18
我上面问题刚刚自己解决了,感谢楼主分享的代码,效果真是绚丽。感觉我在自言自语啊。 ...

可以把怎麼解決的貼出來, 這樣後續有同樣問題, 也有個參照~
作者: Det.Rush    时间: 2016-1-28 13:22:59

oiuu 发表于 2014-11-1 19:18
我上面问题刚刚自己解决了,感谢楼主分享的代码,效果真是绚丽。感觉我在自言自语啊。 ...

我也是路径丢失...求解决办法
作者: Det.Rush    时间: 2016-2-9 10:56:55

milkyjing 发表于 2014-11-9 21:07
可以把怎麼解決的貼出來, 這樣後續有同樣問題, 也有個參照~

試了幾次終於知道,首先要把py中需要調用的函數(tcAudio)放進根目錄,然後是avs文件中插件和mkv的路徑指明
不知為什麼ass文件打開顯示“無法確認文字編碼”,用記事本打開,時間軸部分是空白的;tcas文件則有
152MB,掛在AVS中 可以播放但位置在左下,milk大給的預覽不一樣?
作者: アクマ    时间: 2016-2-9 18:42:13

Det.Rush 发表于 2016-2-9 10:56
試了幾次終於知道,首先要把py中需要調用的函數(tcAudio)放進根目錄,然後是avs文件中插件和mkv的路徑 ...

你倆這對話跨越了一年多啊 233
作者: Det.Rush    时间: 2016-2-9 19:12:38

アクマ 发表于 2016-2-9 18:42
你倆這對話跨越了一年多啊 233

剛入的坑(‾▽‾)雖然晚了點,没能趁着热闹的时候和大家交流,不过公式原理是不会过时的啦
感謝大神们留下的教程和作品,有機會站在前辈的肩膀上也是一種福利

作者: milkyjing    时间: 2016-2-9 23:00:31

Det.Rush 发表于 2016-2-9 10:56
試了幾次終於知道,首先要把py中需要調用的函數(tcAudio)放進根目錄,然後是avs文件中插件和mkv的路徑 ...

另一个帖子给回复了。

插件的话,我记得最新版本是有的,放在util下了吧。
作者: ABC不是菜    时间: 2016-9-11 20:12:30

辛苦了
作者: dream    时间: 2016-9-29 19:54:30

我也是现在才开始学
作者: aini96071111    时间: 2016-10-5 15:57:36

辛苦了
作者: cixiplc    时间: 2016-11-9 13:44:33

顶起
作者: Kairu    时间: 2016-11-25 20:18:22

看着很厉害的样子
作者: miaoxu    时间: 2017-3-3 18:10:37

感觉好厉害的样子,回去慢慢研究
作者: zgghyys123    时间: 2017-3-9 23:26:29

Det.Rush 发表于 2016-2-9 10:56
試了幾次終於知道,首先要把py中需要調用的函數(tcAudio)放進根目錄,然後是avs文件中插件和mkv的路徑 ...

我在parse tcc文件的时候,总是提示我No module named tcAudio,没有该模块。那个需要调用哪一个函数,怎么弄的,可以稍微详细说一下吗?感激不尽




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