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

标题: 使用cairo制作多文字Mask [打印本页]

作者: milkyjing    时间: 2012-2-24 21:29:56     标题: 使用cairo制作多文字Mask

说明

该例子需要TCAX 1.1.8或更新版本.

tcaxLib.pyd模块的TextOutlineDraw()函数只能处理单个文字. 对于多字符, 我们可以借助util.cairo模块来实现, 要用到TCAX 1.1.8引入的ToAssDraw()函数, 该函数的功能是把cairo路径转换为ASS绘图代码, 与AssDraw()函数相对. 有了该函数, 我们可以利用cairo做更多有趣的事情, 有待用户去发掘.


例子

代码如下, 有不清楚的地方直接跟帖好了.
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_Init():
  4.     global _Fs
  5.     global _Spacing
  6.     global Font
  7.     global surface
  8.     global ctx
  9.     _Fs = GetVal(val_FontSize)
  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(0, 0, 0), 0, False)
  14.     fx_width = GetVal(val_ResolutionX)
  15.     fx_height = GetVal(val_ResolutionY)
  16.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  17.     ctx = Context(surface)
  18.     ctx.select_font_face(GetVal(val_FontFaceName))
  19.     ctx.set_font_size(_Fs)

  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.     dx = _x - int((_a + _Spacing) / 2 + 0.5)         # 一个固定操作, 将an5的坐标转换为an7
  27.     dy = _y - int(_Fs / 2 + 0.5)                     # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
  28.     # new approach, can handle multiple texts at a time
  29.     ctx.new_path()
  30.     ctx.move_to(0, _Fs + GetVal(val_Descender))
  31.     ctx.text_path(_txt)
  32.     ctx.scale(1 / 64, 1 / 64)
  33.     assDraw = ToAssDraw(ctx)
  34.     ctx.scale(64, 64)
  35.     ass_main(ASS_BUF, SubL(_start, _end), an(7) + pos(dx, dy), '{\\p7}' + assDraw + '{\\p0}')
  36.     # the old fashion, can only handle one text at a time
  37.     assDraw = TextOutlineDraw(Font, _txt, 0, 0)
  38.     ass_main(ASS_BUF, SubL(_start, _end), an(7) + pos(dx, dy) + color1('000000') + color3('00FF00'), '{\\p7}' + assDraw + '{\\p0}')
  39.     ##### 将结果返回给tcax进行处理 #####
  40.     return (ASS_BUF, TCAS_BUF)
复制代码
完整工程见附件




附件: [完整工程] test_cairo_to_ass.rar (2012-2-24 21:29:51, 3.29 KB) / 下载次数 2678
http://tcax.org/forum.php?mod=attachment&aid=MzQwfDgwYWU4M2EyfDE3MzIyMDk4MTV8MHww
作者: mzlmcx    时间: 2012-2-24 21:45:34

嘛,GJ
马克之……
有空再学习
作者: 四月一日 君寻    时间: 2012-2-24 22:26:36

我生成了看了一下 对比是多了一层边框 (是只多了一层边框吧)那这个主要是加上了能mask出边框么?
作者: milkyjing    时间: 2012-2-24 22:28:29

七海の游风 发表于 2012-2-24 22:26
我生成了看了一下 对比是多了一层边框 (是只多了一层边框吧)那这个主要是加上了能mask出边框么? ...


和边框没关系的...因为这里用的是ASS绘图文字, 加个bord(0)就能去掉了... 用Mask就不会有边框了...

这个例子主要是用来搞多文字Mask用的...

主要是展示 ToAssDraw() 函数的用法...




作者: 四月一日 君寻    时间: 2012-2-24 22:30:06

milkyjing 发表于 2012-2-24 22:28
和边框没关系的...因为这里用的是ASS绘图文字, 加个bord(0)就能去掉了... 用Mask就不会有边框了...

这个 ...

知道了
作者: milkyjing    时间: 2012-2-29 23:30:37

1.1.9中, 该方法对于一些字体可能会存在问题 (文字大小不相等), 更系统的解决办法要等之后版本了. 临时解决方案是, 目测+推断出一个合适的字体大小, 比如TCC中font size设为40, 则该大小可能为36等... 把这个值填入 ctx.set_font_size() 函数中...即可...


作者: 渣渣疯子    时间: 2012-3-1 07:10:45

milkyjing 发表于 2012-2-29 23:30
1.1.9中, 该方法对于一些字体可能会存在问题 (文字大小不相等), 更系统的解决办法要等之后 ...

原来说的cario没修复的就是这么问题么?
作者: milkyjing    时间: 2012-3-1 10:09:20

渣渣疯子 发表于 2012-3-1 07:10
原来说的cario没修复的就是这么问题么?

對的,衹對使用text_path函數有影響
作者: milkyjing    时间: 2012-3-2 17:28:45

本问题已修复, 可以会以补丁的方式放出, 或等下一版本...


------- 2012-05-10 12:26 编辑 ---------

新版已放出 (TCAX 1.1.9 SP1)

将第20行代码 ctx.set_font_size(_Fs)  改成   ctx.set_font_size(CairoFontSize(_FontFileName, _FaceID, _Fs))  即可







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