本人花了很长时间研究外挂字幕SRT、ASS、SSA格式的文件,其编码之复杂,基本上能够用VB解析这些编码了。其目的,是想用VB编写的播放器直接支持SRT、ASS、SSA外挂字幕的自动和手工加载。虽然第三方外挂字幕插件VSFilter和AviSynth不错,但经常会遇到加载不上的问题,决定放弃,转而自己弄。Sub、IDX字幕我弄不来,但搞这些字幕还是可以的。现在有一个问题就是做的字幕太单调,没有立体感,就问一下大家像下面这个图显示的字体每个笔划的周围的黑色笔划是如何绘制出来的(注意不是字体阴影,是每个笔划周围的黑色),这种字体很漂亮,想摸仿:

解决方案 »

  1.   

    Option ExplicitPrivate Sub PrintText(ByVal x As Long, ByVal y As Long, ByVal Text As String)
        Dim i As Long
        Dim j As Long
        
        Me.ForeColor = vbBlack
        For i = -1 To 1
            For j = -1 To 1
                If (i <> 0) Or (j <> 0) Then
                    Me.CurrentX = x + (i * 2)
                    Me.CurrentY = y + (j * 2)
                    Me.Print Text
                End If
            Next
        Next
        
        Me.ForeColor = vbWhite
        Me.CurrentX = x
        Me.CurrentY = y
        Me.Print Text
    End SubPrivate Sub Form_Load()
        Me.ScaleMode = vbPixels
        Me.AutoRedraw = True
        Me.BackColor = &H40C0
        
        Me.Font.Name = "黑体"
        Me.Font.Size = 36
        
        Me.Cls
        PrintText 20, 20, "本字幕"
    End Sub
      

  2.   


    老鸟的不错,太好了!我记得,几年前蒋老大蒋晟(jiangsheng)给了一个网友办法,因为当时没有收藏,就是找不到!自己又不好意思向他提问!你的方法,没想到不用API,这么简单!过了春节后就结帐!
      

  3.   


    谢谢老鸟!不过有一个突出的问题:用像素座标的话,当字体较小时,填充的字体就会变成点阵状,这是不希望的结果,应该还是连续的。因为叠加在视频上的字幕是要随视频窗口的缩放而缩放的。所以我改成了缇座标,并且作了改进,这样就对了:
    Option ExplicitPrivate Sub PrintText(ByVal x As Long, ByVal y As Long, ByVal Text As String)
        Dim i As Long
        Dim j As Long
           
        Me.ForeColor = vbBlack
        
        For i = -1 * Screen.TwipsPerPixelX To Screen.TwipsPerPixelX
            For j = -1 * Screen.TwipsPerPixelY To Screen.TwipsPerPixelY
                If (i > (-1 * Screen.TwipsPerPixelX / 3) And i < Screen.TwipsPerPixelX / 3) Or (j > (-1 * Screen.TwipsPerPixelY / 3) And j < Screen.TwipsPerPixelY / 3) Then
                   Me.ForeColor = vbWhite
                Else
                   Me.ForeColor = vbBlack
                End If
                If i <> 0 Or j <> 0 Then Me.CurrentX = x + i: Me.CurrentY = y + j: Me.Print Text
            Next
        Next
        
        Me.ForeColor = vbWhite
        Me.CurrentX = x
        Me.CurrentY = y
        Me.Print Text
        
    End SubPrivate Sub Form_Load()
        Me.ScaleMode = 1 ' vbPixels
        Me.AutoRedraw = True
        Me.BackColor = &H40C0
        
        Me.Font.Name = "黑体"
        Me.Font.Size = 36
        
        Me.Cls
        PrintText 20 * Screen.TwipsPerPixelX, 20 * Screen.TwipsPerPixelY, "VB制作视频叠加字幕"
    End Sub