在使用PHP 處理圖片時,我們常會用到GD 庫中的imagecolorallocatealpha()函數來分配具有alpha(透明度)通道的顏色。它的語法如下:
int imagecolorallocatealpha ( resource $image , int $red , int $green , int $blue , int $alpha )
其中$alpha的值範圍是0(完全不透明)到127(完全透明)。
但問題來了:即使我們在服務器端生成了帶有alpha 通道的PNG 圖片,有些老舊瀏覽器(比如早期的IE 版本)或某些不支持alpha 渲染的環境中,用戶看到的效果仍然會出現差異,比如透明部分顯示成灰色、黑色,或者直接無法正常顯示。
那麼,我們該如何在服務器端用PHP 代碼改善這種預覽效果,讓即使是不支持alpha 的瀏覽器,至少也能看到一個可接受的退化效果(graceful degradation)呢?
解決這個問題的關鍵是:
在生成帶alpha 通道的PNG 圖像的同時,針對不支持alpha 的瀏覽器,額外生成一張“平鋪”了背景的圖片。
換句話說,我們用imagecolorallocatealpha()分配顏色時,同時考慮一張去掉透明度、直接與背景合成的版本。
以下示例展示瞭如何使用PHP GD 庫生成兩張圖:一張保留alpha 通道的PNG,另一張則是與白色背景合成後的普通PNG,用於不支持透明度的瀏覽器。
<?php
// 創建畫布
$width = 300;
$height = 100;
$image = imagecreatetruecolor($width, $height);
// 打開 alpha 通道保存
imagesavealpha($image, true);
// 分配完全透明的背景色
$transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
imagefill($image, 0, 0, $transparent);
// 分配一個帶半透明的紅色
$redAlpha = imagecolorallocatealpha($image, 255, 0, 0, 63); // 50% 透明
// 畫一個半透明矩形
imagefilledrectangle($image, 50, 25, 250, 75, $redAlpha);
// 保存帶 alpha 的 PNG
imagepng($image, 'output_with_alpha.png');
// --------- 生成去 alpha 的版本 ---------
// 創建一個白色背景畫布
$background = imagecreatetruecolor($width, $height);
$white = imagecolorallocate($background, 255, 255, 255);
imagefill($background, 0, 0, $white);
// 將透明圖片拷貝到白色背景上(去除 alpha)
imagecopy($background, $image, 0, 0, 0, 0, $width, $height);
// 保存去 alpha 的 PNG
imagepng($background, 'output_no_alpha.png');
// 清理內存
imagedestroy($image);
imagedestroy($background);
echo '圖片生成完成:<a href="https://m66.net/output_with_alpha.png">帶透明通道</a> 和 <a href="https://m66.net/output_no_alpha.png">無透明版本</a>';
?>
1??分配帶alpha 的顏色<br> 使用imagecolorallocatealpha()給透明部分或半透明部分上色
2??為支持alpha 的瀏覽器生成主圖<br> 這部分只需保存成PNG 即可,現代瀏覽器都能很好支持
3??為不支持alpha 的瀏覽器生成退化圖<br> 創建一個白色或其他背景的畫布,把主圖直接拷貝上去,這樣透明部分就變成了實色背景
4??前端選擇性加載<br> 可以在網頁端通過JavaScript 檢測是否支持alpha PNG,或者直接提供兩種下載鏈接供用戶選擇