在 PHP 中,處理位圖文件通常是通過 GD 庫或 ImageMagick 庫來實現的。這里我將向您展示如何使用 GD 庫讀取和保存 BMP 文件。
首先,確保您的 PHP 安裝包含了 GD 庫。大多數環境中默認都包含了這個庫。接下來,我們需要創建一個函數來讀取 BMP 文件并將其轉換為 GD 圖像資源。然后,我們可以選擇將該圖像資源保存為新的 BMP 文件。
<?php
function imagecreatefrombmp($filename) {
$file = fopen($filename, "rb");
$read = fread($file, 10);
while (!feof($file) && ($read<>"")) {
$read .= fread($file, 1024);
}
$temp = unpack("H*", $read);
$hex = $temp[1];
$header = substr($hex, 0, 108);
if (substr($header, 0, 4) == "424d") {
$header_parts = str_split($header, 2);
$width = hexdec($header_parts[19] . $header_parts[18]);
$height = hexdec($header_parts[23] . $header_parts[22]);
unset($header_parts);
}
$x = 0;
$y = 1;
$image = imagecreatetruecolor($width, $height);
$body = substr($hex, 108);
$body_size = strlen($body);
$header_size = ($width * $height);
$usePadding = false;
if ($body_size < $header_size * 3) {
$usePadding = true;
}
for ($i = 0; $i < $body_size; $i += 3) {
if ($x >= $width) {
if ($usePadding) {
$i += $width % 4;
}
$x = 0;
$y++;
if ($y > $height) {
break;
}
}
$color = imagecolorallocate($image, hexdec($body[$i + 2]), hexdec($body[$i + 1]), hexdec($body[$i]));
imagesetpixel($image, $x, $height - $y, $color);
$x++;
}
unset($body);
return $image;
}
function imagebmp(&$image, $filename = false) {
$width = imagesx($image);
$height = imagesy($image);
$colors = imagecolorstotal($image);
if ($filename === false) {
$filename = "php://output";
}
$result = fopen($filename, "wb");
// BMP header
$header = "BM";
$header .= pack("V", 54 + $width * $height * 3); // File size
$header .= pack("V", 0); // Reserved
$header .= pack("V", 54); // Offset to image data
// DIB header
$header .= pack("V", 40); // Header size
$header .= pack("V", $width); // Width
$header .= pack("V", $height); // Height
$header .= pack("v", 1); // Planes
$header .= pack("v", 24); // Bits per pixel
$header .= pack("V", 0); // Compression
$header .= pack("V", $width * $height * 3); // Image size
$header .= pack("V", 0); // Horizontal resolution
$header .= pack("V", 0); // Vertical resolution
$header .= pack("V", 0); // Colors used
$header .= pack("V", 0); // Important colors
fwrite($result, $header);
for ($y = $height - 1; $y >= 0; $y--) {
for ($x = 0; $x < $width; $x++) {
$color = imagecolorat($image, $x, $y);
$rgb = sprintf("%06x", $color);
fwrite($result, pack("C*", hexdec(substr($rgb, 4, 2)), hexdec(substr($rgb, 2, 2)), hexdec(substr($rgb, 0, 2))));
}
fwrite($result, pack("C*", 0, 0, 0, 0));
}
fclose($result);
}
// 讀取 BMP 文件
$image = imagecreatefrombmp("input.bmp");
// 保存為新的 BMP 文件
imagebmp($image, "output.bmp");
// 銷毀圖像資源
imagedestroy($image);
?>
這段代碼定義了兩個函數:imagecreatefrombmp()
用于從 BMP 文件創建 GD 圖像資源,imagebmp()
用于將 GD 圖像資源保存為 BMP 文件。請注意,這些函數僅適用于 24 位 BMP 文件。