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

 找回密码
 新人加入
查看: 6348|回复: 2
打印 上一主题 下一主题

[TCAS特效教程进阶系列] 一. fade流 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

跳转到指定楼层
楼主
发表于 2012-2-25 16:07:20 |只看该作者 |正序浏览
说明

本教程来源, [J]034_Another_OP.
用到了util.magick模块(虽然有方法避开...). 最简单的方法是使用TCAX 1.1.8 或以上版本.

TCAS使用教程是必修课, 见, http://www.tcax.org/forum.php?mod=viewthread&tid=220


例子

代码
  1. from tcaxPy import *
  2. from util.magick import *

  3. def tcaxPy_Init():
  4.     global _Fs
  5.     global _FD          # 一帧的持续时间, 约40毫秒
  6.     global _Spacing     # 字体间距
  7.     global Font         # 首要字体
  8.     global FontOut      # 字体边框
  9.     global FontOut2     # 字体边框2
  10.     _Fs = GetVal(val_FontSize)
  11.     _FD = 1000 / GetVal(val_FXFPS)
  12.     _FontFileName = GetVal(val_FontFileName)
  13.     _FaceID = GetVal(val_FaceID)
  14.     _Spacing = GetVal(val_Spacing)
  15.     Font = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 0, False)
  16.     FontOut = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 3, True)
  17.     FontOut2 = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 2, False)

  18. def tcaxPy_Fin():
  19.     FinFont(Font)
  20.     FinFont(FontOut)

  21. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  22.     ASS_BUF  = []        # 保存ASS特效
  23.     TCAS_BUF = []        # 保存TCAS特效
  24.     ##### 主要特效编写操作 ####
  25.     dx = _x - int((_a + _Spacing) / 2 + 0.5)        # 一个固定操作, 将an5的坐标转换为an7
  26.     dy = _y - int(_Fs / 2 + 0.5)                    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  27.     # 文字主体
  28.     PIX_t = TextPix(Font, _txt)
  29.     # 边框主体
  30.     PIX = TextPix(FontOut, _txt)
  31.     PIX = PixColorRGB(PIX, DecRGB('FF0000'))
  32.     PIX = PixColorMul(PIX, 1, 1, 1, 0.8)
  33.     PIX_o = PixBlur(PIX, 6)
  34.     # 边框
  35.     PIX = TextPix(FontOut2, _txt)
  36.     PIX = PixColorRGB(PIX, DecRGB('0000BB'))
  37.     PIX_b = PixBlur(PIX, 2)
  38.     # 混合
  39.     PIX = CombinePixs(PIX_o, PIX_b)
  40.     PIX = CombinePixs(PIX, PIX_t)
  41.     PIX0 = PIX
  42.     # 一些时间的计算
  43.     TS = 10 * _start - 40 * _FD
  44.     TE = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
  45.     # 淡入
  46.     IMG = Image('images\\blurred_noise.jpg')        # 读入图片, 将用于构造Mask
  47.     # 将从IMG图片上随机选定一个位置, 取下与PIX0一样尺寸的一个矩形区域, 用作Mask
  48.     xoff = randint(0, IMG.columns() - PIX0[1][0])   # IMG.columns()为IMG图片的宽度, PIX0[1][0]为PIX0的宽度
  49.     yoff = randint(0, IMG.rows() - PIX0[1][1])      # IMG.rows()为IMG图片的高度, PIX0[1][1]为PIX0的高度
  50.     IMG.crop(Geometry(PIX0[1][0], PIX0[1][1], xoff, yoff))  # 从IMG上取出我们需要的部分, 左上角坐标为(xoff, yoff), 尺寸为PIX0[1][0] * PIX0[1][1]
  51.     PIX = pmgToPix(IMG)                              # 通过pmgToPix将magick的Image对象转换为PIX结构对象
  52.     PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1])       # 为这个PIX设定内部偏移量, 使PIX的位置也与PIX0相同
  53.     PIX = r2a(PIX)                                   # 因为blurred_noise.jpg是一个灰度图, 所以它的r, g, b分量值都是一样的, 我们取r分量, 将其作为不透明度分量. 注意, 图片上越黑的地方r值越小, 越白的地方r值越大, 复制到不透明度上, 就变成图片上越黑的部分不透明度就越低, 也即越透明. r2a()函数的定义见脚本最下方
  54.     mask0 = invertA(PIX)                             # 反转PIX的不透明度值, 这样, 图片上越黑的地方不透明度就越高, 符合思维习惯(但这不是必须的, 还要看图片本身是否需要让我们做这一处理). invertA()函数的定义见脚本最下方
  55.     num = 40
  56.     for i in range(num):
  57.         mask = addA(mask0, 255 * (2 * i - num) / num)       # 逐渐修改Mask的通透性. addA()函数的定义见脚本最下方
  58.         PIX = PixMask(PIX0, mask)                            # 将Mask应用到PIX0上得到一个新的PIX结构
  59.         tcas_main(TCAS_BUF, PIX, TS + i * _FD, TS + (i + 1) * _FD, dx, dy, 0)
  60.     # 存在
  61.     tcas_main(TCAS_BUF, PIX0, TS + num * _FD, TE, dx, dy, 0)
  62.     # 淡出, 原理基本相同
  63.     IMG = Image('images\\radial.jpg')
  64.     IMG.filterType(FilterTypes.CubicFilter)         # 更改下插值方式, 不加这句也没什么- -
  65.     IMG.resize('!{0}x{1}'.format(PIX0[1][0], PIX0[1][1]))   # 缩放IMG尺寸, 使其与PIX0一样大, 加!表示不保持宽高比
  66.     PIX = pmgToPix(IMG)
  67.     PIX = PixColorMul(PIX, 2, 1, 1, 1)              # 红色分量放大2倍, 为了使之后的透明度变化更明显
  68.     PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1])
  69.     PIX = r2a(PIX)
  70.     if _i == 0:     # 小变化- -
  71.         mask0 = PIX
  72.     else:
  73.         mask0 = invertA(PIX)
  74.     num = 10
  75.     for i in range(num):
  76.         mask = addA(mask0, 255 * (num - 2 * i) / num)
  77.         PIX = PixMask(PIX0, mask)
  78.         tcas_main(TCAS_BUF, PIX, TE + i * _FD, TE + (i + 1) * _FD, dx, dy, 0)
  79.     ##### 将结果返回给tcax进行处理 #####
  80.     return (ASS_BUF, TCAS_BUF)


  81. # 一些辅助函数

  82. # 拷贝PIX的红色分量到不透明度分量
  83. def r2a(PIX):
  84.     buf = []
  85.     width = PIX[1][0]
  86.     height = PIX[1][1]
  87.     for h in range(height):
  88.         for w in range(width):
  89.             index = 4 * (h * width + w)
  90. #            if PIX[2][index] != PIX[2][index + 1] or PIX[2][index] != PIX[2][index + 2]:
  91. #                print('note1')
  92. #            if PIX[2][index + 3] != 255:
  93. #                print('note2')
  94.             buf.append(0)
  95.             buf.append(0)
  96.             buf.append(0)
  97.             buf.append(PIX[2][index + 0])
  98.     return (PIX[0], PIX[1], tuple(buf))

  99. # 反转PIX的不透明度分量
  100. def invertA(PIX):
  101.     buf = list(PIX[2])
  102.     width = PIX[1][0]
  103.     height = PIX[1][1]
  104.     for h in range(height):
  105.         for w in range(width):
  106.             index = 4 * (h * width + w) + 3
  107.             buf[index] = 255 - buf[index]
  108.     return (PIX[0], PIX[1], tuple(buf))

  109. # 增加/减少不透明度, step可以是负数
  110. def addA(PIX, step):
  111.     buf = list(PIX[2])
  112.     width = PIX[1][0]
  113.     height = PIX[1][1]
  114.     for h in range(height):
  115.         for w in range(width):
  116.             index = 4 * (h * width + w) + 3
  117.             buf[index] += int(step + 0.5)
  118.             if buf[index] < 0:
  119.                 buf[index] = 0
  120.             if buf[index] > 255:
  121.                 buf[index] = 255
  122.     return (PIX[0], PIX[1], tuple(buf))

  123. # 对换PIX的红色分量与蓝色分量, 本教程未用到该函数
  124. def switchRB(PIX):
  125.     buf = list(PIX[2])
  126.     width = PIX[1][0]
  127.     height = PIX[1][1]
  128.     for h in range(height):
  129.         for w in range(width):
  130.             index = 4 * (h * width + w)
  131.             temp = buf[index]
  132.             buf[index] = buf[index + 2]
  133.             buf[index + 2] = temp
  134.     return (PIX[0], PIX[1], tuple(buf))
复制代码
完整工程见附件, 有问题请直接跟帖...

p.s. 换换作为Mask的图片就可以弄出些不同的效果了, 虽然对图源没什么限制, 但用灰度图比较直观一点. 利用util.magick模块就能方便处理图片了 233


tcas_fade.zip

11.54 KB, 下载次数: 2052

完整工程

Moderator

youkaze

Rank: 5Rank: 5

板凳
发表于 2012-2-29 12:16:13 |只看该作者
如果有同学遇到了我这样的RP问题如图:
1.jpg


请将PY脚本里面的两张图片路径代码改成这样如下:

# 淡入
    IMG = Image(abspath('images\\blurred_noise.jpg'))        # 读入图片, 将用于构造Mask


# 淡出, 原理基本相同
    IMG = Image(abspath('images\\radial.jpg'))

正式会员

妖木

Rank: 4

沙发
发表于 2012-2-25 16:52:05 |只看该作者
已经下载附件……
找机会给看了= =
tcas的教程上个星期看过,这个星期就忘了
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-11-22 07:07

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH