BMP (Bitmap) 為無壓縮位圖格式,檔案體積龐大。早期 PHP GD 擴展不支援 BMP 讀寫,開發者需自行實作位元級解析。現代 PHP (GD 2.1.0+/PHP 7.2+) 已原生支援 imagecreatefrombmp() 與 imagebmp(),本文兼具教學價值與實務指導。
原始碼包含兩大核心函式:
imagebmp():GD 資源 → BMP 二進位字串/檔案imagecreatefrombmp():BMP 檔案 → GD 資源$zbytek 計算)freadbits)、整數轉位元組 (int_to_dword/word)include_once('bmp.php');
$image = imagecreatefrombmp('source.bmp');
imagejpeg($image, 'output.jpg', 90); // 品質 90
imagedestroy($image);
// 直接使用內建函式
$image = imagecreatefrombmp('source.bmp');
if ($image !== false) {
imagejpeg($image, 'output.jpg', 90);
imagedestroy($image);
} else {
throw new Exception('BMP 載入失敗:格式不支援或檔案損壞');
}
佈署簡單、API 優雅、支援鏈式操作、自動處理記憶體:
use Intervention\Image\ImageManagerStatic as Image;
Image::configure(['driver' => 'gd']); // 或 imagick
$img = Image::make('source.bmp')
->resize(800, null, function ($constraint) {
$constraint->aspectRatio();
})
->encode('jpg', 85)
->save('output.jpg');
| 方案 | PHP 版本需求 | 相依性 | 效能 | 功能豐富度 | 維護性 |
|---|---|---|---|---|---|
| 手工實作 | 5.0+ | 純 PHP | 極慢 (純 PHP 位元運算) | 基礎 | 難 (數百行核心邏輯) |
| GD 原生 | 7.2+ | GD 擴展 | 快 (C 層實作) | 基礎讀寫 | 官方維護 |
| Imagick | 5.3+ | ImageMagick + 擴展 | 最快 (多執行緒) | 極豐富 | 社群活躍 |
| Intervention/Image | 5.4+ | GD/Imagick + Composer | 視底層驅動 | 豐富 (縮圖、水印、濾鏡) | 優 (物件導向、測試完整) |
php -m | grep gd、gd_info()['BMP Support']memory_limit (寬×高×4 字節)false、捕獲 GdException (PHP 8.0+)finfo 確認真實為 BMP#!/usr/bin/env php
$out\n";
$img = @imagecreatefrombmp($file);
if ($img) {
imagejpeg($img, $out, $quality);
imagedestroy($img);
echo " OK\n";
} else {
echo " FAILED\n";
}
}
手工實作 BMP 編解碼是理解圖片格式內部結構的優秀教材,但生產環境請務必使用原生 GD 函式或成熟庫 (Intervention/Image, Imagick)。若維護舊專案無法升級 PHP,可將手工實作封裝為獨立庫並加入完整測試覆蓋。