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

 找回密码
 新人加入
查看: 5463|回复: 6

[特效算法] 放大镜效果 [复制链接]

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-5-11 17:41:08 |显示全部楼层
说明: 代码框架类似 http://www.tcax.org/forum.php?mod=viewthread&tid=397, magnifier滤镜参考了水银灯的代码

magnifier.rar (2.84 KB, 下载次数: 2256)
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_Init():
  4.     global _Fs
  5.     global _FD          # 一帧的持续时间, 约40毫秒
  6.     global _Spacing     # 字体间距
  7.     global Font         # 首要字体
  8.     _Fs = GetVal(val_FontSize)
  9.     _FD = 1000 / GetVal(val_FXFPS)
  10.     _FontFileName = GetVal(val_FontFileName)
  11.     _FaceID = GetVal(val_FaceID)
  12.     _Spacing = GetVal(val_Spacing)
  13.     Font = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 0, False)
  14.     # cairo
  15.     global ctx
  16.     fx_width = GetVal(val_ResolutionX)
  17.     fx_height = GetVal(val_ResolutionY)
  18.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  19.     ctx = Context(surface)

  20. def tcaxPy_Fin():
  21.     FinFont(Font)

  22. def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
  23.     ASS_BUF  = []        # 保存ASS特效
  24.     TCAS_BUF = []        # 保存TCAS特效
  25.     ##### 主要特效编写操作 #####
  26.     ### begin of line scope, do not change the code ###
  27.     lineChanged = IsLineChanged(_i)
  28.     if lineChanged:
  29.         _initX = _x - int((_a + _Spacing) / 2 + 0.5)
  30.         _initY = _y - int(_Fs / 2 + 0.5)
  31.         _length = GetVal(val_TextLength)[_i]
  32.         tcaxPy_Line(_i, _start, _end, _initX, _initY, _length, ASS_BUF, TCAS_BUF)
  33.     ### end of line scope, do not change the code ###
  34.     ##### 将结果返回给tcax进行处理 #####
  35.     return (ASS_BUF, TCAS_BUF)

  36. def tcaxPy_Line(_i, _start, _end, _initX, _initY, _length, ASS_BUF, TCAS_BUF):
  37.     texts = GetVal(val_Text)[_i]
  38.     elapk = GetVal(val_KarTimeDiff)[_i]
  39.     kar = GetVal(val_KarTime)[_i]
  40.     advanceDiff = GetVal(val_TextAdvanceDiff)[_i]
  41.     advance = GetVal(val_TextAdvance)[_i]
  42.     num = len(texts)
  43.     assDraw = ''
  44.     for i in range(num):
  45.         if '' == texts[i] or ' ' == texts[i] or ' ' == texts[i]:
  46.             continue
  47.         assDraw += TextOutlineDraw(Font, texts[i], _initX + advanceDiff[i], _initY) + ' '
  48.     frames = int(10 * (_end - _start) / _FD + 0.5)
  49.     for i in range(frames):
  50.         ts = _start + i * _FD / 10
  51.         te = _start + (i + 1) * _FD / 10
  52.         j = xthSyl(elapk, num, i * _FD / 10)            # 根据进行的时间查找当前进行到第几个字
  53.         pct = (ts - (_start + elapk[j])) / kar[j]       # 当前文字效果进行的百分比
  54.         big_x = _initX + advanceDiff[j] + pct * advance[j]
  55.         big_y = _initY + _Fs / 2
  56.         AssDraw(ctx, assDraw)
  57.         path_trans(ctx, magnifier_filter, (big_x, big_y))
  58.         text = ToAssDraw(ctx)
  59.         EFT = an(7) + pos(0, 0) + color1('FFFFFF') + color3('FF0000') + p(7)
  60.         ass_main(ASS_BUF, SubL(ts, te), EFT, text)

  61. def xthSyl(elapk, n, fts):
  62.     for i in range(n - 1):
  63.         if elapk[i] <= fts and fts < elapk[i + 1]:
  64.             return i
  65.     return n - 1

  66. def magnifier_filter(x, y, param):
  67.     big_x, big_y = param
  68.     D = _Fs
  69.     d = sqrt((x - big_x * 64) * (x - big_x * 64) + (y - big_y * 64) * (y - big_y * 64)) / 64
  70.     if d < D:
  71.         ang = pi / 2 * sin(d / D)
  72.         pct = D * sin(ang) / d
  73.         new_x = int(big_x * 64 + (x - big_x * 64) * pct + 0.5)
  74.         new_y = int(big_y * 64 + (y - big_y * 64) * pct + 0.5)
  75.         return new_x, new_y
  76.     else:
  77.         return x, y
复制代码
1

查看全部评分

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-5-11 17:48:32 |显示全部楼层
不同的filter函数, 可以搞出不同的效果...

Rank: 4

发表于 2012-5-11 17:49:11 |显示全部楼层
看着奶大又搞出了新算法,让我感觉好忧桑........

Rank: 5Rank: 5

发表于 2012-5-11 23:29:13 |显示全部楼层
混着内置特效效果很不错~

Rank: 4

发表于 2012-7-10 12:56:49 |显示全部楼层
未命名.jpg

请教大神,怎么我运行时出现这个出错,什么意思?

Administrator

TCAX Dev.

Rank: 7Rank: 7Rank: 7

发表于 2012-7-10 13:50:55 |显示全部楼层
micotan 发表于 2012-7-10 12:56
请教大神,怎么我运行时出现这个出错,什么意思?

无法初始化字体,检查字体文件名是否正确(可以使用TCAX\tools\fontColor.exe选择字体),或者,对于TTF字体,打开TCC文件,设置font face id为1

Rank: 4

发表于 2012-7-10 19:19:00 |显示全部楼层
milkyjing 发表于 2012-7-10 13:50
无法初始化字体,检查字体文件名是否正确(可以使用TCAX\tools\fontColor.exe选择字体),或者,对于TTF ...

谢谢,可以了^^
您需要登录后才可以回帖 登录 | 新人加入

GitHub|TCAX 主页

GMT+8, 2024-4-19 09:29

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部
RealH