在早期 Web 開發中,若需從 SWF (Flash) 動畫擷取靜態畫面作為縮圖或預覽,常見做法是在 Windows 伺服器上安裝 Flash Player 並搭配 COM 元件 SunCN.Flash2Jpeg 執行轉換。本文記錄該技術的實作步驟與代碼範例,供維護舊系統的開發者參考。
Flash2Jpeg.dll(通常隨附於相關工具包,需以管理員權限執行 regsvr32 Flash2Jpeg.dll)com_dotnet 擴充(php.ini 中 extension=com_dotnet)<?php
$oldswf = "/uploads/swf/test.swf"; // 來源 SWF 路徑
$oldjpg = "/uploads/litpic/test.jpg"; // 輸出 JPG 路徑
$flash2jpeg = new COM("SunCN.Flash2Jpeg");
if ($flash2jpeg) {
// 參數:來源檔、寬、高、輸出檔
$a = $flash2jpeg->Flash2Jpeg($oldswf, 150, 200, $oldjpg);
if ($a) {
// 轉換成功,使用預設圖片或進一步處理
$litpic = '/images/defaultpic.gif';
} else {
// 轉換失敗,回傳原輸出路徑(可能為空檔)
$litpic = $oldjpg;
}
} else {
// COM 元件建立失敗
$litpic = '/images/defaultpic.gif';
}
// $litpic 可供後續邏輯使用(如寫入資料庫、輸出前端)
?>
Flash2Jpeg(source, width, height, dest)
執行身分(IIS_IUSRS 或 Apache 執行使用者)必須對 SWF 來源目錄與輸出目錄具備讀寫權限。
此方案強依賴 Windows、Flash Player 及第三方 COM 元件,已不符合現代跨平台部署需求。Adobe 於 2020 年底停止支援 Flash Player,生產環境建議改用以下替代方案:
canvas.toDataURL() 取得截圖。ffmpeg -i input.swf -vframes 1 output.jpg。<?php
try {
$flash2jpeg = new COM("SunCN.Flash2Jpeg");
if (!$flash2jpeg) throw new Exception("COM 元件初始化失敗");
$result = $flash2jpeg->Flash2Jpeg($oldswf, 150, 200, $oldjpg);
if (!$result) throw new Exception("轉換過程發生錯誤");
// 成功邏輯
} catch (com_exception $e) {
error_log("Flash2Jpeg COM 錯誤: " . $e->getMessage());
// 降級處理
} catch (Exception $e) {
error_log("Flash2Jpeg 一般錯誤: " . $e->getMessage());
}
?>
雖然 SunCN.Flash2Jpeg 在 Flash 全盛期提供了便利的伺服器端截圖功能,但隨著技術棧演進,該方案已逐漸淘汰。新專案請優先考慮現代化、跨平台的替代方案;僅在必須維護舊系統時,才使用本文所述方法,並做好錯誤處理與日誌記錄。