Director是Macromedia公司开发的一套多媒体制作软件,用于创建高端交互式内容和应用程序,以供通过Macromedia Shockwave播放器在CD/DVD-ROM、公用信息导览站以及WEB上使用。简而言之就是多媒体光碟生产工具。
大概为了保护多媒体作者的劳动成果和知识产权,Director的演员(CAST)是无法导出的,即便导出,也失去了原有的部分元素,如xOffset, yOffset, Left, Top和透明度等。
为了得到一系列完整的CAST图片动画帧,我开始研究Director的剪贴板操作,因为它能自己复制粘贴,必然在系统剪贴板中留了一些特别的印记。打开一个CST文件,复制一个CAST,查看剪贴板,文本格式的内容如下
Macromedia Director cast from:
I:\XXXX\X.cst
1 cast members 44:2ETa267.PICS frame 1 to 44:2ETa267.PICS frame 1其他的内容就很复杂了,'DIRECTOR:1000|49630
'Palette
'Device Independent Bitmap (DIB)
'DIRECTOR:1007|49830
'BITMAP (BMP)
'Unknown: 17
'Director 7.0 Cast|49756其中我们感兴趣的就是DIRECTOR:1000和BITMAP (BMP)
获得DIRECTOR:1000数据的VB源代码如下:
Dim abFile() As Byte
abFile = GetClipboardDataArray(0, 49630)’这个数字要临时获取的,此处仅为简化
Public Function GetClipboardDataArray(ByVal hwndOwner As Long, ByVal lFormatID As Long, Optional bHTML As Boolean = False) As Byte()
  Dim bData() As Byte
  Dim hMem As Long
  Dim lSize As Long
  Dim lPtr As Long
  If (OpenClipboard(hwndOwner)) Then
    If (IsClipboardFormatAvailable(lFormatID) <> 0) Then
      hMem = GetClipboardData(lFormatID)
        If (hMem <> 0) Then
          lSize = GlobalSize(hMem)
            If (lSize > 0) Then
            Debug.Print lSize
                lPtr = GlobalLock(hMem)
                    If (lPtr <> 0) Then
                      ReDim bData(0 To lSize - 1) As Byte
                      CopyMemory bData(0), ByVal lPtr, lSize
                      GlobalUnlock hMem
                      GetClipboardDataArray = bData
                    End If
            End If
        End If
    End If
    CloseClipboard
  End If
End Function
得到的字节数组HEXDUMP如下:
3D 08 00 00 02 00 04 02 00 00 00 00 00 00 00 00 
00 96 00 00 00 08 00 00 00 00 00 00 00 00 00 00 
00 96 00 00 00 78 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 FF FE FF FF 65 FF FF FF E7 00 00 
00 A8 00 00 00 FF FF 01 00 00 00 00 00 01 00 00 
□□□□……此处省略0x083D-80字节
这样就可以得到图片的坐标数据了
    CopyMemory R.Width, abFile(33), 4
    CopyMemory R.Height, abFile(37), 4
    CopyMemory R.xOffset, abFile(61), 4
CopyMemory R.yOffset, abFile(65), 4
然后获得图片数据:
m_ClipFmt = CF_DIB  
abFile = GetClipboardDataArray(0, m_ClipFmt)
这样取得的数组是一个没有文件头的BMP文件字节数组,我们需要给它加一个文件头:
        Dim f&
        f = FreeFile
        Dim sFile$
        sFile = "c:\clip.bmp"
        Open sFile For Binary As f
    Put #f, , &H4D42 '"BM"标志 2bytes
    Dim lLen&
    lLen = UBound(abFile) + 1
    Put #f, , lLen ’4bytes
    lLen = 0
    Put #f, , lLen ’4bytes 0
    lLen = &H436
    Put #f, , lLen  ’4bytes 0
    Put #f, , abFile
    Close f
测试一下:
Picture1 = LoadPicture(sFile) 效果不错吧?
这样我们就轻松的获得了一个CAST演员的图片和坐标数据。
那么演员动画如何导出呢?
这个问题其实很简单,就是批处理,每次复制一张,然后再获取。
嫌麻烦?那就试试自动化输入按键来操作Director自动复制然后获取。
首先得到Director窗口的hWnd句柄,然后:
‘把Director窗口提到前面赋予焦点
BringWindowToTop hWnd
‘输入“Ctrl-C”复制键
Call keybd_event(VK_CONTROL, 0, 0, 0)
    Call keybd_event(VK_C, 0, 0, 0)
    Call keybd_event(VK_C, 0, KEYEVENTF_KEYUP, 0)
Call keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0)
‘获得数据
……
‘把CAST演员窗口提到前面赋予焦点
SetFocus hCast
    SetActiveWindow hCast
    SetForegroundWindow hCast
‘输入“向右”键选择下一帧
    SendMessage hCast, WM_KEYDOWN, Win.VK_RIGHT, 0
    SendMessage hCast, WM_KEYUP, VK_RIGHT, 0
如此循环,直到完整导出CAST演员。
请千万不要用此方法侵犯别人的版权哟!