首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Flex 與 PHP 實現線上拍照功能(二):AMFPHP 圖片傳輸與儲存

     編輯:PHP 相關知識

前言

延續第一篇的攝影機存取與畫面預覽,本文著重於「截圖 → 像素序列化 → AMFPHP 傳輸 → PHP 端像素還原存檔」的完整資料流,並解析關鍵效能考量。

Flex 端:從 Video 到像素字串

1. 截圖至 BitmapData

m_pictureBitmapData = new BitmapData(DEFAULT_CAMERA_WIDTH, DEFAULT_CAMERA_HEIGHT);
m_pictureBitmapData.draw(t_vd_Video, new Matrix());

draw() 將 Video 當前畫面繪製到位圖緩衝區,支援任意轉換矩陣。

2. 像素序列化(逐像素讀取)

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。

3. AMFPHP 呼叫

service.getOperation("createjpeg").send(pic_width, pic_height, m_pictureData);

AMF3 格式傳輸比 JSON 更緊湊,但仍屬文字型負載,大圖傳輸時建議改用 ByteArray + PNGEncoder 壓縮後再送出。

PHP 端:像素還原存檔

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() → 儲存檔案

採用二進位影像編碼而非像素序列化,是從原型走向生產環境的關鍵一步。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved