| 
UID2积分8682帖子2905主题199论坛币13045 威望16 EP值2349 MP值15 阅读权限200注册时间2011-8-3在线时间2597 小时最后登录2024-8-28
 
   
 | 
| 说明 
 本教程来源, [J]034_Another_OP.
 用到了util.magick模块(虽然有方法避开...). 最简单的方法是使用TCAX 1.1.8 或以上版本.
 
 TCAS使用教程是必修课, 见, http://www.tcax.org/forum.php?mod=viewthread&tid=220
 
 
 例子
 
 代码
 完整工程见附件, 有问题请直接跟帖...复制代码from tcaxPy import *
from util.magick import *
def tcaxPy_Init():
    global _Fs
    global _FD          # 一帧的持续时间, 约40毫秒
    global _Spacing     # 字体间距
    global Font         # 首要字体
    global FontOut      # 字体边框
    global FontOut2     # 字体边框2
    _Fs = GetVal(val_FontSize)
    _FD = 1000 / GetVal(val_FXFPS)
    _FontFileName = GetVal(val_FontFileName)
    _FaceID = GetVal(val_FaceID)
    _Spacing = GetVal(val_Spacing)
    Font = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 0, False)
    FontOut = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 3, True)
    FontOut2 = InitFont(_FontFileName, _FaceID, _Fs, _Spacing, GetVal(val_SpaceScale), MakeRGB(255, 255, 255), 2, False)
def tcaxPy_Fin():
    FinFont(Font)
    FinFont(FontOut)
def tcaxPy_Main(_i, _j, _n, _start, _end, _elapk, _k, _x, _y, _a, _txt):
    ASS_BUF  = []        # 保存ASS特效
    TCAS_BUF = []        # 保存TCAS特效
    ##### 主要特效编写操作 ####
    dx = _x - int((_a + _Spacing) / 2 + 0.5)        # 一个固定操作, 将an5的坐标转换为an7
    dy = _y - int(_Fs / 2 + 0.5)                    # ASS特效默认采用an5坐标, TCAS特效则采用an7坐标
    # 文字主体
    PIX_t = TextPix(Font, _txt)
    # 边框主体
    PIX = TextPix(FontOut, _txt)
    PIX = PixColorRGB(PIX, DecRGB('FF0000'))
    PIX = PixColorMul(PIX, 1, 1, 1, 0.8)
    PIX_o = PixBlur(PIX, 6)
    # 边框
    PIX = TextPix(FontOut2, _txt)
    PIX = PixColorRGB(PIX, DecRGB('0000BB'))
    PIX_b = PixBlur(PIX, 2)
    # 混合
    PIX = CombinePixs(PIX_o, PIX_b)
    PIX = CombinePixs(PIX, PIX_t)
    PIX0 = PIX
    # 一些时间的计算
    TS = 10 * _start - 40 * _FD
    TE = 10 * _end + 5 * _FD - 2 * (_n - _j - 1) * _FD
    # 淡入
    IMG = Image('images\\blurred_noise.jpg')        # 读入图片, 将用于构造Mask
    # 将从IMG图片上随机选定一个位置, 取下与PIX0一样尺寸的一个矩形区域, 用作Mask
    xoff = randint(0, IMG.columns() - PIX0[1][0])   # IMG.columns()为IMG图片的宽度, PIX0[1][0]为PIX0的宽度
    yoff = randint(0, IMG.rows() - PIX0[1][1])      # IMG.rows()为IMG图片的高度, PIX0[1][1]为PIX0的高度
    IMG.crop(Geometry(PIX0[1][0], PIX0[1][1], xoff, yoff))  # 从IMG上取出我们需要的部分, 左上角坐标为(xoff, yoff), 尺寸为PIX0[1][0] * PIX0[1][1]
    PIX = pmgToPix(IMG)                              # 通过pmgToPix将magick的Image对象转换为PIX结构对象
    PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1])       # 为这个PIX设定内部偏移量, 使PIX的位置也与PIX0相同
    PIX = r2a(PIX)                                   # 因为blurred_noise.jpg是一个灰度图, 所以它的r, g, b分量值都是一样的, 我们取r分量, 将其作为不透明度分量. 注意, 图片上越黑的地方r值越小, 越白的地方r值越大, 复制到不透明度上, 就变成图片上越黑的部分不透明度就越低, 也即越透明. r2a()函数的定义见脚本最下方
    mask0 = invertA(PIX)                             # 反转PIX的不透明度值, 这样, 图片上越黑的地方不透明度就越高, 符合思维习惯(但这不是必须的, 还要看图片本身是否需要让我们做这一处理). invertA()函数的定义见脚本最下方
    num = 40
    for i in range(num):
        mask = addA(mask0, 255 * (2 * i - num) / num)       # 逐渐修改Mask的通透性. addA()函数的定义见脚本最下方
        PIX = PixMask(PIX0, mask)                            # 将Mask应用到PIX0上得到一个新的PIX结构
        tcas_main(TCAS_BUF, PIX, TS + i * _FD, TS + (i + 1) * _FD, dx, dy, 0)
    # 存在
    tcas_main(TCAS_BUF, PIX0, TS + num * _FD, TE, dx, dy, 0)
    # 淡出, 原理基本相同
    IMG = Image('images\\radial.jpg')
    IMG.filterType(FilterTypes.CubicFilter)         # 更改下插值方式, 不加这句也没什么- -
    IMG.resize('!{0}x{1}'.format(PIX0[1][0], PIX0[1][1]))   # 缩放IMG尺寸, 使其与PIX0一样大, 加!表示不保持宽高比
    PIX = pmgToPix(IMG)
    PIX = PixColorMul(PIX, 2, 1, 1, 1)              # 红色分量放大2倍, 为了使之后的透明度变化更明显
    PIX = PixPos(PIX, PIX0[0][0], PIX0[0][1])
    PIX = r2a(PIX)
    if _i == 0:     # 小变化- -
        mask0 = PIX
    else:
        mask0 = invertA(PIX)
    num = 10
    for i in range(num):
        mask = addA(mask0, 255 * (num - 2 * i) / num)
        PIX = PixMask(PIX0, mask)
        tcas_main(TCAS_BUF, PIX, TE + i * _FD, TE + (i + 1) * _FD, dx, dy, 0)
    ##### 将结果返回给tcax进行处理 #####
    return (ASS_BUF, TCAS_BUF)
# 一些辅助函数
# 拷贝PIX的红色分量到不透明度分量
def r2a(PIX):
    buf = []
    width = PIX[1][0]
    height = PIX[1][1]
    for h in range(height):
        for w in range(width):
            index = 4 * (h * width + w)
#            if PIX[2][index] != PIX[2][index + 1] or PIX[2][index] != PIX[2][index + 2]:
#                print('note1')
#            if PIX[2][index + 3] != 255:
#                print('note2')
            buf.append(0)
            buf.append(0)
            buf.append(0)
            buf.append(PIX[2][index + 0])
    return (PIX[0], PIX[1], tuple(buf))
# 反转PIX的不透明度分量
def invertA(PIX):
    buf = list(PIX[2])
    width = PIX[1][0]
    height = PIX[1][1]
    for h in range(height):
        for w in range(width):
            index = 4 * (h * width + w) + 3
            buf[index] = 255 - buf[index]
    return (PIX[0], PIX[1], tuple(buf))
# 增加/减少不透明度, step可以是负数
def addA(PIX, step):
    buf = list(PIX[2])
    width = PIX[1][0]
    height = PIX[1][1]
    for h in range(height):
        for w in range(width):
            index = 4 * (h * width + w) + 3
            buf[index] += int(step + 0.5)
            if buf[index] < 0:
                buf[index] = 0
            if buf[index] > 255:
                buf[index] = 255
    return (PIX[0], PIX[1], tuple(buf))
# 对换PIX的红色分量与蓝色分量, 本教程未用到该函数
def switchRB(PIX):
    buf = list(PIX[2])
    width = PIX[1][0]
    height = PIX[1][1]
    for h in range(height):
        for w in range(width):
            index = 4 * (h * width + w)
            temp = buf[index]
            buf[index] = buf[index + 2]
            buf[index + 2] = temp
    return (PIX[0], PIX[1], tuple(buf))
 p.s. 换换作为Mask的图片就可以弄出些不同的效果了, 虽然对图源没什么限制, 但用灰度图比较直观一点. 利用util.magick模块就能方便处理图片了 233
 
 
 
 | 
 
回帖推荐
四月一日 君寻 发表于3楼
 查看完整内容
 如果有同学遇到了我这样的RP问题如图:
请将PY脚本里面的两张图片路径代码改成这样如下:
# 淡入
    IMG = Image(abspath('images\\blurred_noise.jpg'))        # 读入图片, 将用于构造Mask
# 淡出, 原理基本相同
    IMG = Image(abspath('images\\radial.jpg')) |