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

标题: PyCairo模块简单示例代码 [打印本页]

作者: milkyjing    时间: 2011-12-20 06:09:32     标题: PyCairo模块简单示例代码

说明

对于TCAX 1.0.0以前的版本, 需要先添加PyCairo模块, 下载地址 http://www.tcax.org/forum.php?mod=viewthread&tid=209, 推荐直接升级到1.0.0
附件为完整工程.
本例子仅作为一个展示用例. 实际上cairo是很强大的2D矢量绘图工具
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_Init():
  4.     global Font
  5.     _Fs = GetVal(val_FontSize)
  6.     _FileName = GetVal(val_FontFileName)
  7.     _FaceID = GetVal(val_FaceID)
  8.     Font = InitFont(_FileName, _FaceID, _Fs * 4, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 0, False)

  9. def tcaxPy_Fin():
  10.     FinFont(Font)

  11. def tcaxPy_User():
  12.     file_name = GetVal(val_OutFile) + '.tcas'
  13.     fx_width = GetVal(val_ResolutionX)
  14.     fx_height = GetVal(val_ResolutionY)
  15.     fx_fps = GetVal(val_FXFPS)
  16.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  17.     TCAS_BUF = []
  18.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  19.     ctx = Context(surface)
  20.     # object 1
  21.     ctx.set_line_width(2)
  22.     ctx.set_source_rgb(0.69, 0.19, 0)
  23.     ctx.arc(fx_width / 2, fx_height / 2, fx_height / 20, 0, 2 * pi)
  24.     ctx.stroke_preserve()
  25.     ctx.set_source_rgb(0.3, 0.4, 0.6)
  26.     ctx.fill()
  27.     # object 2
  28.     ctx.set_line_join(LINE_JOIN_ROUND)
  29.     ctx.set_line_cap(LINE_CAP_ROUND)
  30.     ctx.translate(300, 200)
  31.     ctx.scale(10, 10)
  32.     AssDraw(ctx, 'm 20 0  b  20 10  30 20  40 20  b  30 20  20 30  20 40  b  20 30  10 20  0 20  b  10 20  20 10  20 0')
  33.     ctx.set_source_rgb(0.69, 0.19, 1)
  34.     ctx.stroke()
  35.     # object 3
  36.     ctx.scale(1 / 10, 1 / 10)
  37.     ctx.translate(-100, -100)
  38.     AssDraw(ctx, 'm 69 67 l 69 67 l 69 67 l 69 63 l 69 59 l 70 56 l 72 58 l 76 49 l 74 48 l 76 44 l 77 43 l 71 34 l 67 21 l 67 17 l 71 19 l 77 29 l 81 40 l 87 28 l 85 23 l 84 16 l 86 15 l 89 19 l 90 25 l 95 14 l 103 5 l 100 16 l 95 26 l 99 26 l 103 28 l 99 31 l 94 30 l 86 43 l 95 42 l 106 45 l 103 49 l 93 49 l 86 48 l 86 50 l 84 53 l 82 52 l 73 68 l 76 69 l 88 68 l 88 66 l 94 66 l 96 67 l 98 58 l 108 48 l 111 51 l 110 56 l 104 63 l 100 68 l 113 68 l 114 64 l 119 60 l 120 62 l 120 67 l 117 69 l 128 69 l 137 72 l 134 73 l 127 74 l 117 74 l 120 79 l 120 83 l 117 82 l 114 79 l 113 74 l 100 75 l 105 84 l 108 84 l 109 86 l 108 86 l 111 95 l 111 100 l 106 97 l 102 91 l 95 78 l 92 78 l 90 75 l 73 75 l 82 91 l 83 90 l 86 94 l 86 96 l 86 94 l 97 95 l 100 96 l 101 98 l 99 102 l 96 104 l 94 104 l 94 103 l 85 101 l 92 113 l 97 113 l 98 115 l 98 116 l 94 116 l 98 126 l 100 131 l 100 134 l 97 131 l 90 119 l 87 123 l 85 122 l 86 117 l 88 116 l 82 104 l 79 112 l 80 114 l 78 117 l 70 119 l 69 114 l 76 102 l 78 101 l 75 95 l 77 94 l 69 79 l 67 82 l 69 85 l 66 90 l 63 88 l 61 92 l 61 96 l 59 101 l 57 100 l 60 102 l 64 109 l 68 117 l 68 123 l 64 122 l 61 119 l 59 119 l 57 116 l 59 114 l 55 104 l 52 110 l 50 116 l 48 118 l 51 120 l 52 124 l 52 126 l 49 125 l 46 122 l 42 129 l 40 134 l 35 136 l 36 131 l 37 127 l 43 119 l 38 119 l 36 117 l 37 116 l 41 115 l 44 116 l 51 102 l 42 103 l 40 106 l 38 106 l 36 105 l 36 103 l 33 101 l 31 99 l 35 96 l 39 96 l 48 96 l 50 98 l 52 98 l 52 96 l 54 92 l 56 92 l 58 86 l 56 84 l 60 80 l 61 80 l 66 74 l 61 75 l 58 78 l 55 78 l 53 77 l 53 75 l 46 75 l 47 76 l 46 77 l 42 77 l 36 89 l 34 93 l 29 95 l 27 92 l 27 88 l 27 85 l 28 83 l 32 83 l 37 75 l 24 75 l 24 76 l 21 81 l 18 82 l 17 80 l 18 77 l 20 74 l 10 74 l 2 72 l 6 70 l 20 70 l 18 67 l 17 64 l 18 61 l 20 62 l 22 65 l 24 68 l 23 69 l 37 70 l 32 62 l 28 62 l 27 60 l 28 56 l 27 52 l 29 49 l 31 49 l 35 53 l 41 65 l 41 67 l 45 68 l 53 69 l 53 67 l 54 65 l 58 66 l 60 68 l 64 69 l 61 66 l 58 64 l 57 58 l 54 52 l 52 53 l 51 50 l 51 49 l 46 50 l 38 50 l 31 47 l 34 42 l 36 41 l 38 39 l 41 39 l 42 42 l 45 42 l 50 43 l 44 31 l 44 32 l 38 32 l 35 30 l 37 27 l 41 27 l 44 28 l 38 20 l 35 12 l 35 6 l 38 10 l 43 16 l 46 24 l 48 20 l 51 19 l 52 23 l 50 27 l 48 27 l 55 40 l 57 32 l 56 29 l 58 27 l 60 26 l 61 24 l 65 25 l 67 28 l 63 39 l 61 43 l 59 43 l 61 50 l 61 51 l 65 58 l 66 56 l 68 56 l 68 60 l 67 62')
  39.     ctx.set_source_rgb(0.3, 0.4, 0.6)
  40.     ctx.fill_preserve()
  41.     ctx.set_source_rgb(0.3, 0, 0.6)
  42.     ctx.stroke()
  43.     # object 4
  44.     ctx.scale(1 / 64, 1 / 64)
  45.     AssDraw(ctx, TextOutlineDraw(Font, 'あ', 600, 300))
  46.     ctx.set_source_rgb(0.6, 0.4, 0.1)
  47.     ctx.fill_preserve()
  48.     ctx.set_line_width(0.5 * 64)
  49.     ctx.set_source_rgb(1, 0.1, 0.4)
  50.     ctx.stroke()
  51.     # save the result
  52.     surface.write_to_png(abspath('p1.png'))
  53.     PIX = surface.get_pix()
  54.     PIX = PixBlur(PIX, 10)
  55.     SavePix(abspath('p2.png'), PIX)
  56.     tcas_main(TCAS_BUF, PIX, 0, 100000, 0, 0, 0)
  57.     WriteTcasFile(TCAS_FILE, TCAS_BUF)     # write the buffer in memory to the file
  58.     FinTcasFile(TCAS_FILE)
复制代码


附件: [完整工程] tcas_test_cairo.rar (2011-12-20 06:22:07, 2.56 KB) / 下载次数 3224
http://tcax.org/forum.php?mod=attachment&aid=MTUyfDY5ZDgxY2I4fDE3MzIyMjgzMjZ8MHww
作者: milkyjing    时间: 2011-12-20 06:23:39

效果截图 (点击可放大)

原始
增加模糊效果



图片附件: [增加模糊效果] p2.png (2011-12-20 06:23:14, 135.22 KB) / 下载次数 1917
http://tcax.org/forum.php?mod=attachment&aid=MTU0fDhmNGM3M2UyfDE3MzIyMjgzMjZ8MHww



图片附件: [原始] p1.png (2011-12-20 06:23:08, 42.26 KB) / 下载次数 1880
http://tcax.org/forum.php?mod=attachment&aid=MTUzfDBkYzQ4YjI5fDE3MzIyMjgzMjZ8MHww


作者: milkyjing    时间: 2011-12-20 09:09:57

补充示例
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_Init():
  4.     global Font
  5.     global _Fs
  6.     _Fs = GetVal(val_FontSize)
  7.     _FileName = GetVal(val_FontFileName)
  8.     _FaceID = GetVal(val_FaceID)
  9.     Font = InitFont(_FileName, _FaceID, _Fs * 10, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 0, False)

  10. def tcaxPy_Fin():
  11.     FinFont(Font)

  12. def tcaxPy_User():
  13.     file_name = GetVal(val_OutFile) + '.tcas'
  14.     fx_width = GetVal(val_ResolutionX)
  15.     fx_height = GetVal(val_ResolutionY)
  16.     fx_fps = GetVal(val_FXFPS)
  17.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  18.     FD = 1000 / fx_fps
  19.     TCAS_BUF = []
  20.     # using cairo to draw a text
  21.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  22.     ctx = Context(surface)
  23.     outline = TextOutlineDraw(Font, 'あ', 0, 0)
  24.     ctx.scale(1 / 64, 1 / 64)
  25.     AssDraw(ctx, outline)
  26.     ctx.set_source_rgb(1, 0, 0)  # red
  27.     ctx.fill()
  28.     PIX = surface.get_pix()
  29.     tcas_main(TCAS_BUF, PIX, 0, 10000, 100, 100, 0)
  30.     # using tcaxLib to draw a text
  31.     PIX = TextPix(Font, 'あ')
  32.     PIX = PixColorRGB(PIX, MakeRGB(0, 255, 0))  # green
  33.     tcas_main(TCAS_BUF, PIX, 0, 10000, 400, 100, 0)
  34.     WriteTcasFile(TCAS_FILE, TCAS_BUF)     # write the buffer in memory to the file
  35.     FinTcasFile(TCAS_FILE)
  36.    
  37.     # ASS alternative
  38.     file_name = GetVal(val_OutFile) + '.ass'
  39.     ass_header = GetVal(val_AssHeader)
  40.     ASS_FILE = CreateAssFile(file_name, ass_header)
  41.     ASS_BUF = []
  42.     ass_main(ASS_BUF, SubL(0, 1000), an(7) + pos(700, 100) + fs(_Fs * 10) + bord(0) + color1('FF0000'), 'あ')    # blue
  43.     WriteAssFile(ASS_FILE, ASS_BUF)     # write the buffer in memory to the file
  44.     FinAssFile(ASS_FILE)
复制代码


附件: [完整工程] tcas_test_cairo_2.rar (2011-12-20 09:11:28, 1.67 KB) / 下载次数 3151
http://tcax.org/forum.php?mod=attachment&aid=MTU1fDQ4ZjEyZTdhfDE3MzIyMjgzMjZ8MHww
作者: milkyjing    时间: 2011-12-20 09:12:01

效果截图 (点击可放大)

p3.png

图片附件: p3.png (2011-12-20 09:11:56, 37.75 KB) / 下载次数 1890
http://tcax.org/forum.php?mod=attachment&aid=MTU2fDZkNzRjOGQyfDE3MzIyMjgzMjZ8MHww


作者: milkyjing    时间: 2011-12-20 11:47:11

补充示例, 字体平滑缩放 (动态)
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_Init():
  4.     global Font
  5.     global _Fs
  6.     _Fs = GetVal(val_FontSize) * 2
  7.     _FileName = GetVal(val_FontFileName)
  8.     _FaceID = GetVal(val_FaceID)
  9.     Font = InitFont(_FileName, _FaceID, _Fs, GetVal(val_Spacing), GetVal(val_SpaceScale), MakeRGB(0, 0, 0), 0, False)

  10. def tcaxPy_Fin():
  11.     FinFont(Font)

  12. def tcaxPy_User():
  13.     file_name = GetVal(val_OutFile) + '.tcas'
  14.     fx_width = GetVal(val_ResolutionX)
  15.     fx_height = GetVal(val_ResolutionY)
  16.     fx_fps = GetVal(val_FXFPS)
  17.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  18.     FD = 1000 / fx_fps
  19.     # using cairo to scale a text
  20.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  21.     ctx = Context(surface)
  22.     outline = TextOutlineDraw(Font, 'あ', 0, 0)
  23.     metrics = TextMetrics(Font, 'あ')
  24.     ctx.translate(300 - metrics[4] / 2, 300 - _Fs / 2)
  25.     fac = 1.5
  26.     n = 200
  27.     for i in range(n):
  28.         TCAS_BUF = []
  29.         ctx.translate(-_Fs * fac / 2 / n, -_Fs * fac / 2 / n)
  30.         f = 1/ 64 * (1 + fac * i / n)
  31.         ctx.scale(f, f)
  32.         AssDraw(ctx, outline)
  33.         ctx.set_source_rgb(1, 0, 0)
  34.         ctx.fill()
  35.         PIX = surface.get_pix()
  36.         #PIX = PixStrip(PIX)    # need the latest tcaxLib.pyd module
  37.         PIX = PixColorRGB(PIX, MakeRGB(255, 0, 255))
  38.         ctx.scale(1 / f, 1 / f)
  39.         clear_surface(ctx)
  40.         tcas_main(TCAS_BUF, PIX, 300 + FD * i, 300 + FD * (i + 1), 0, 0, 0)
  41.         WriteTcasFile(TCAS_FILE, TCAS_BUF)     # write the buffer in memory to the file
  42.         progress(i + 1, n)
  43.     FinTcasFile(TCAS_FILE)
  44.     # ASS alternative
  45.     file_name = GetVal(val_OutFile) + '.ass'
  46.     ass_header = GetVal(val_AssHeader)
  47.     ASS_FILE = CreateAssFile(file_name, ass_header)
  48.     ASS_BUF = []
  49.     ass_main(ASS_BUF, SubL(30, 30 + FD * n / 10), an(5) + pos(300, 300) + fs(_Fs) + t(fs(_Fs * (1 + fac))) + bord(0) + color1('FF0000'), 'あ')    # blue
  50.     ass_main(ASS_BUF, SubL(30, 30 + FD * n / 10), an(5) + pos(500, 300) + fs(_Fs) + t(fs(_Fs * (1 + fac))) + bord(0) + color1('0000FF'), 'あ')    # red
  51.     WriteAssFile(ASS_FILE, ASS_BUF)     # write the buffer in memory to the file
  52.     FinAssFile(ASS_FILE)


  53. def clear_surface(ctx):
  54.     ctx.save()
  55.     ctx.set_source_rgba(0, 0, 0, 0)
  56.     ctx.set_operator(OPERATOR_SOURCE)
  57.     ctx.paint()
  58.     ctx.restore()
复制代码


附件: [完整工程] tcas_test_cairo_3.rar (2011-12-20 12:49:30, 0 Bytes) / 下载次数 3109
http://tcax.org/forum.php?mod=attachment&aid=MTU3fDlhMjUyMGMwfDE3MzIyMjgzMjZ8MHww
作者: milkyjing    时间: 2012-1-4 21:07:23

补充示例, 参考模板
  1. from tcaxPy import *
  2. from util.cairo import *

  3. def tcaxPy_User():
  4.     GetHelp()   # get the description of the global variables, comment them if you don't need
  5.     # initilization
  6.     file_name = GetVal(val_OutFile) + '.tcas'
  7.     fx_width = GetVal(val_ResolutionX)
  8.     fx_height = GetVal(val_ResolutionY)
  9.     fx_fps = GetVal(val_FXFPS)
  10.     TCAS_FILE = CreateTcasFile(file_name, fx_width, fx_height, fx_fps)
  11.     surface = ImageSurface(FORMAT_ARGB32, fx_width, fx_height)
  12.     ctx = Context(surface)
  13.     Font = InitFont(GetVal(val_FontFileName), GetVal(val_FaceID), GetVal(val_FontSize), GetVal(val_Spacing), GetVal(val_SpaceScale), HexToDec(GetVal(val_1C)), GetVal(val_Bord), False)
  14.     # retrieve basic information
  15.     FD         = 1000 / fx_fps
  16.     fontSize   = GetVal(val_FontSize)
  17.     marginX    = GetVal(val_OffsetX)
  18.     marginY    = GetVal(val_OffsetY)
  19.     spacing    = GetVal(val_Spacing)
  20.     lineNum    = GetVal(val_nLines)
  21.     textNum    = GetVal(val_nTexts)
  22.     start      = GetVal(val_BegTime)
  23.     end        = GetVal(val_EndTime)
  24.     kar        = GetVal(val_KarTime)
  25.     elapKar    = GetVal(val_KarTimeDiff)
  26.     text       = GetVal(val_Text)
  27.     textLength = GetVal(val_TextLength)
  28.     width      = GetVal(val_TextWidth)
  29.     height     = GetVal(val_TextHeight)
  30.     advance    = GetVal(val_TextAdvance)
  31.     advDiff    = GetVal(val_TextAdvanceDiff)
  32.     # main loop
  33.     for i in range(lineNum):
  34.         initPosX = (fx_width - textLength[i]) / 2 + marginX        # if marginX = 0, then it's just on the middle
  35.         initPosY = fx_height - fontSize - marginY
  36.         for j in range(textNum[i]):
  37.             if text[i][j] == '' or text[i][j] == ' ' or text[i][j] == ' ':
  38.                 continue
  39.             posX = initPosX + advDiff[i][j] + advance[i][j] / 2
  40.             posY = initPosY
  41.             # draw by Cairo Toy Font API, color is pink, without border
  42.             ctx.select_font_face(GetVal(val_FontFaceName))
  43.             ctx.set_font_size(fontSize)
  44.             ctx.move_to(posX, posY + fontSize + GetVal(val_Descender))
  45.             ctx.text_path(text[i][j])
  46.             ctx.set_source_rgb(1, 0, 1)
  47.             ctx.fill()
  48.             # draw by tcaxLib TextOutlineDraw API, color is red, without border
  49.             ctx.save()
  50.             ctx.scale(1 / 64, 1 / 64)
  51.             outline = TextOutlineDraw(Font, text[i][j], posX, posY)
  52.             AssDraw(ctx, outline)
  53.             ctx.set_source_rgb(1, 0, 0)
  54.             ctx.fill()
  55.             ctx.restore()
  56.             # draw by tcaxLib TextPix API, color is blue, with border = 1 (according to the setting of the TCC file)
  57.             TCAS_BUF = []
  58.             PIX = TextPix(Font, text[i][j])
  59.             PIX = PixColorRGB(PIX, MakeRGB(0, 0, 0))
  60.             tcas_main(TCAS_BUF, PIX, start[i] * 10, end[i] * 10, posX, posY, 0)
  61.             WriteTcasFile(TCAS_FILE, TCAS_BUF)
  62.             # you can also draw the text by ASS, through various methods, such as direct text, draw by ASS drawing commands or draw by pixels, and hopefully note that all kinds of text drawing will likely to produce the same result, cool huh :)
  63.             # the result of this script is that lines of red texts with blue borders, let me explain, the pink texts are covered by the red one, since they comes later and on the same layer, the blue ones are written to the TCAS file earliest, but they have border! So you can see them
  64.         TCAS_BUF = []
  65.         PIX = surface.get_pix()
  66.         surface_clear(ctx)
  67.         PIX = PixStrip(PIX)
  68.         tcas_main(TCAS_BUF, PIX, start[i] * 10, end[i] * 10, 0, 0, 0)
  69.         WriteTcasFile(TCAS_FILE, TCAS_BUF)     # write the buffer in memory to the file
  70.         progress(i + 1, lineNum)
  71.     FinFont(Font)
  72.     FinTcasFile(TCAS_FILE)
复制代码


附件: tcas_OverPy.rar (2012-1-4 21:07:17, 3.55 KB) / 下载次数 3058
http://tcax.org/forum.php?mod=attachment&aid=MTc2fDFkYTA3ZWU3fDE3MzIyMjgzMjZ8MHww




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