使用者上傳 Flash 檔案時,若不提供寬/高,前端顯示易變形。客戶端讀取 (JavaScript) 需載入後才能取得,且有 Flash Player 安全警告。伺服器端解析 SWF 格式是最佳方案。
flash.ocx COM 元件,呼叫 TGetProperty() 總回傳 E_FAIL參考 Macromedia Flash (SWF) File Format Specification Version 7,實作 FlashInfo 類別。
FlashInfo flashInfo = new FlashInfo(@"c:\test.swf");
Console.WriteLine($"Version: {flashInfo.Version}"); // Flash 版本
Console.WriteLine($"Compressed: {flashInfo.IsCompressed}"); // 是否壓縮 (ZLib)
Console.WriteLine($"Width: {flashInfo.Width}"); // 寬度 (twips, 1/20 pt)
Console.WriteLine($"Height: {flashInfo.Height}"); // 高度
Console.WriteLine($"FrameRate: {flashInfo.FrameRate}"); // 幀率
Console.WriteLine($"FrameCount: {flashInfo.FrameCount}"); // 總幀數
Console.WriteLine($"FileLength: {flashInfo.FileLength}"); // 未壓縮檔案大小
FWS (未壓縮) 或 CWS (壓縮,ZLib)
public class FlashInfo
{
public byte Version { get; private set; }
public bool IsCompressed { get; private set; }
public int Width { get; private set; } // pixels
public int Height { get; private set; } // pixels
public double FrameRate { get; private set; }
public int FrameCount { get; private set; }
public int FileLength { get; private set; } // uncompressed bytes
public FlashInfo(string filePath)
{
using (FileStream fs = File.OpenRead(filePath))
{
ParseHeader(fs);
}
}
private void ParseHeader(Stream stream)
{
// 1. 讀取簽名 (3 bytes)
// 2. 讀取版本 (1 byte)
// 3. 讀取檔案長度 (4 bytes, little-endian)
// 4. 若壓縮,用 ZLib 解壓縮到 MemoryStream
// 5. 解析 Rect (位元級讀取 nBits + 座標)
// 6. 解析 FrameRate (Fixed8) 與 FrameCount (UI16)
}
}
水平有限,歡迎指正!