Ming 是一個用 C 撰寫的開源函式庫,讓 PHP 能以程式化方式生成 SWF (Flash) 檔案。雖然 Flash 已退出歷史舞台,但 Ming 的設計理念——伺服器端程式化向量圖形/動畫生成——在現代 Web 開發中仍有啟發價值(如動態 SVG、Canvas、PDF、圖表生成)。本文記錄 Ming 的安裝、核心物件模型、完整範例與遷移建議。
pecl install minglibming、freetype、libpng、zlibphp -m | grep ming 或 php -r "echo 'Ming version: ' . ming_version();"| 類別 | 用途 | 關鍵方法 |
|---|---|---|
SWFMovie | 動畫主容器,對應 _root | setDimension(), setRate(), add(), output(), save(), nextFrame() |
SWFShape | 向量圖形(線條、填滿、曲線) | addFill(), setRightFill(), movePenTo(), drawLine(), drawCurve() |
SWFSprite | 動畫剪輯 | add(), nextFrame(), setFrames(), add(SWFAction) |
SWFButton | 互動按鈕(四態:Up/Over/Down/Hit) | addShape(), addAction() |
SWFText / SWFTextField | 文字顯示/輸入欄位 | setFont(), setHeight(), addString() |
SWFFont | 字體載入(支援 .fdb、.ttf 轉換) | __construct() |
SWFAction | ActionScript 位元組碼封裝 | __construct($script) |
SWFBitmap / SWFGradient | 位圖填滿/漸層填滿 | __construct() |
SWFMorph | 形狀變形動畫 | getShape1(), getShape2() |
SWFDisplayItem | 場景中的顯示實例(由 add() 回傳) | moveTo(), rotate(), scale(), setDepth(), setName() |
<?php
// ming_demo.php
// 1. 建立圖形:藍色正方形
$square = new SWFShape();
$fill = $square->addFill(0, 0, 0xFF); // RGB 藍
$square->setRightFill($fill);
$square->movePenTo(-50, -50);
$square->drawLineTo(50, -50);
$square->drawLineTo(50, 50);
$square->drawLineTo(-50, 50);
$square->drawLineTo(-50, -50);
// 2. 建立 Sprite(動畫剪輯)並加入旋轉腳本
$sprite = new SWFSprite();
$item = $sprite->add($square);
$item->setDepth(1);
$sprite->setFrames(24); // 總幀數
// 幀 1:停止
$sprite->add(new SWFAction("stop();"));
// 幀 2~24:每幀旋轉 -15 度
for ($i = 0; $i < 23; $i++) {
$item->rotate(-15);
$sprite->nextFrame();
}
// 最後一幀:播放(循環)
$sprite->add(new SWFAction("play();"));
// 3. 建立按鈕(四態不同顏色)
function makeRect($r, $g, $b) {
$s = new SWFShape();
$s->setRightFill($s->addFill($r, $g, $b));
$s->drawLine(100, 0);
$s->drawLine(0, 40);
$s->drawLine(-100, 0);
$s->drawLine(0, -40);
return $s;
}
$btn = new SWFButton();
$btn->addShape(makeRect(0xFF, 0, 0), SWFBUTTON_UP | SWFBUTTON_HIT); // 紅:預設/點擊區
$btn->addShape(makeRect(0, 0xFF, 0), SWFBUTTON_OVER); // 綠:滑鼠懸停
$btn->addShape(makeRect(0, 0, 0xFF), SWFBUTTON_DOWN); // 藍:按下
// 點擊動作:控制名為 "box" 的 Sprite 跳到第 2 幀播放
$btn->addAction(new SWFAction('setTarget("/box"); gotoAndPlay(2);'), SWFBUTTON_MOUSEDOWN);
// 4. 建立主動畫
$movie = new SWFMovie();
$movie->setDimension(400, 300); // 寬、高
$movie->setRate(12); // 幀率
$movie->setBackground(0xFF, 0xFF, 0xFF); // 白色背景
// 加入 Sprite,命名為 "box"
$boxItem = $movie->add($sprite);
$boxItem->setDepth(2);
$boxItem->moveTo(200, 150);
$boxItem->setName("box");
// 加入按鈕
$btnItem = $movie->add($btn);
$btnItem->setDepth(3);
$btnItem->moveTo(150, 250);
// 5. 輸出 SWF
header('Content-Type: application/x-shockwave-flash');
$movie->output();
// 亦可存檔:$movie->save('demo.swf');
?>
根據資料庫數據繪製長條圖、圓餅圖、折線圖,輸出 SWF 供舊版瀏覽器顯示,或轉換為 PNG(需搭配 swftools 的 swfrender)。
合併背景模板、使用者姓名、編號、QR Code,即時生成可列印的 SWF/PDF。
將向量圖形預先渲染為 SWF,減少客戶端運算量。
由於 Flash Player 於 2020 年底停止支援,新專案不建議使用 Ming 生成 SWF。以下是現代替代方案對照:
| Ming 功能 | 現代替代方案 | PHP 整合方式 |
|---|---|---|
| 向量圖形繪製 | SVG (XML 格式) | 直接拼接字串、XMLWriter、Sabberworm\CSS、vgcross/svg-builder |
| 動畫/互動 | CSS Animation / Web Animations API / Canvas / GSAP | PHP 生成 JSON 設定,前端渲染 |
| 動態圖表 | Chart.js, ApexCharts, ECharts, Highcharts | PHP 提供資料 API,前端圖表庫渲染 |
| PDF 生成 | Dompdf, TCPDF, Snappy (wkhtmltopdf), mPDF | Composer 安裝,PHP 直接生成 PDF |
| 圖片處理 | GD, ImageMagick (Imagick), Intervention Image | 內建/PECL 擴充 |
| 字體處理 | Freetype (Imagick), 瀏覽器 @font-face | CSS 載入 Web Font |
<?php
// svg_demo.php - 產生等效的 SVG
$width = 400; $height = 300;
$cx = 200; $cy = 150; $size = 50;
header('Content-Type: image/svg+xml');
echo '';
?>
Ming 是 PHP 歷史上將程式碼轉化為多媒體內容的先驅嘗試。雖然 SWF 格式已成歷史,但「伺服器端宣告式圖形/動畫生成」的思維在 SVG、Canvas、PDF、甚至 WebGL 伺服器端渲染中延續。理解 Ming 的物件模型(Movie、Shape、Sprite、Action、DisplayItem)有助於掌握現代圖形庫的設計模式。維護舊專案時可續用 Ming;新專案請直接擁抱 HTML5 標準技術棧。