延續第一篇的攝影機存取與畫面預覽,本文著重於「截圖 → 像素序列化 → AMFPHP 傳輸 → PHP 端像素還原存檔」的完整資料流,並解析關鍵效能考量。
m_pictureBitmapData = new BitmapData(DEFAULT_CAMERA_WIDTH, DEFAULT_CAMERA_HEIGHT);
m_pictureBitmapData.draw(t_vd_Video, new Matrix());
draw() 將 Video 當前畫面繪製到位圖緩衝區,支援任意轉換矩陣。
for (var i = 0; i < DEFAULT_CAMERA_WIDTH; i++) {
for (var j = 0; j < DEFAULT_CAMERA_HEIGHT; j++) {
var pixel = m_pictureBitmapData.getPixel(i, j); // 0xRRGGBB
m_pictureData += (m_pictureData.length ? "," : "") + pixel.toString();
}
}
產生格式為 "12345,67890,..." 的純文字字串,長度 = 寬 × 高 × (平均 7 字元) ≈ 160×120×7 ≈ 134 KB。
service.getOperation("createjpeg").send(pic_width, pic_height, m_pictureData);
AMF3 格式傳輸比 JSON 更緊湊,但仍屬文字型負載,大圖傳輸時建議改用 ByteArray + PNGEncoder 壓縮後再送出。
class Image {
public function createjpeg($width, $height, $bitmap_data) {
$img = imagecreatetruecolor($width, $height);
$pixels = explode(',', $bitmap_data);
for ($i = 0; $i < $width; $i++) {
for ($j = 0; $j < $height; $j++) {
$color = (int)$pixels[$i * $height + $j];
imagesetpixel($img, $i, $j, $color);
}
}
imagejpeg($img, "../../image/header/0.jpg");
imagedestroy($img);
return true;
}
}
for 迴圈在 PHP 解釋器中極慢(160×120=19,200 次 imagesetpixel 呼叫)。imagecreatefromstring() 配合 base64_decode 或直接接收二進位 PNG/JPEG 流。| 現狀 | 建議替代方案 | 預期收益 |
|---|---|---|
| 逐像素 CSV 字串 | Flex 端用 PNGEncoder / JPEGEncoder 壓縮為 ByteArray | 負載縮減 80%+,傳輸時間大幅降低 |
| PHP 端 imagesetpixel 還原 | imagecreatefromstring($binaryData) 一行搞定 | CPU 耗用從秒級降至毫秒級 |
| AMFPHP 文字傳輸 | AMF3 ByteArray 直接傳遞二進位 | 避免字串化/解析開銷,支援大圖 |
Flex: Camera → Video → BitmapData.draw()
→ PNGEncoder.encode() → ByteArray
→ AMFPHP (ByteArray) → PHP
PHP: imagecreatefromstring() → imagejpeg()/imagepng() → 儲存檔案
採用二進位影像編碼而非像素序列化,是從原型走向生產環境的關鍵一步。