在PHP 的圖像處理庫GD 中, imagecopymerge()是一個常用函數,用來將一個圖像合併到另一個圖像上,並允許設置合併的透明度(實際上是合併的“混合程度”)。但如果你想要更精細地控制透明效果,比如使用真正的alpha 通道(而不僅僅是簡單的不透明度調整),就需要搭配imagecolorallocatealpha()一起使用。
本文將介紹如何用imagecolorallocatealpha()定義帶alpha 通道(透明度)的顏色,並結合imagecopymerge() ,實現帶透明效果的圖層合併。
imagecolorallocatealpha(resource $image, int $red, int $green, int $blue, int $alpha)
用來為指定的圖像分配一個帶有alpha 通道的顏色。 $alpha的值從0(完全不透明)到127(完全透明)。
imagecopymerge(resource $dst_im, resource $src_im, int $dst_x, int $dst_y, int $src_x, int $src_y, int $src_w, int $src_h, int $pct)
將$src_im圖像拷貝到$dst_im ,並用$pct設置混合程度(0 = 完全透明,100 = 完全不透明)。
需要注意的是, imagecopymerge()實際上並不支持真正的alpha 通道混合,它只是通過調整像素亮度模擬透明效果。如果需要更精細的半透明合併,可以使用imagecopy() ,並在源圖像中使用imagecolorallocatealpha()填充帶透明色的區域。
以下是一個完整示例,展示如何創建一個透明背景的圖層並將其合併到主圖上。
<?php
// 創建主圖像(背景)
$background = imagecreatetruecolor(400, 300);
$white = imagecolorallocate($background, 255, 255, 255);
imagefilledrectangle($background, 0, 0, 400, 300, $white);
// 創建透明圖層
$layer = imagecreatetruecolor(200, 150);
imagesavealpha($layer, true);
$transparent = imagecolorallocatealpha($layer, 0, 0, 0, 127); // 完全透明
imagefill($layer, 0, 0, $transparent);
// 在圖層上畫一個半透明紅色矩形
$red_alpha = imagecolorallocatealpha($layer, 255, 0, 0, 63); // 半透明
imagefilledrectangle($layer, 20, 20, 180, 130, $red_alpha);
// 將圖層合併到主圖像(注意 imagecopymerge 不支持 alpha 通道)
imagecopy($background, $layer, 100, 75, 0, 0, 200, 150);
// 輸出結果
header('Content-Type: image/png');
imagepng($background);
// 清理內存
imagedestroy($background);
imagedestroy($layer);
?>
imagecreatetruecolor()用來創建一塊真彩色畫布。
imagesavealpha()打開保存alpha 通道的標誌,確保透明信息不會丟失。
imagecolorallocatealpha()定義一個帶透明度的顏色,這裡我們用它創建了完全透明的背景和半透明的紅色。
imagecopy()而不是imagecopymerge()用來保留alpha 通道。如果用imagecopymerge() ,GD 庫會強制關閉alpha 混合,僅使用$pct模擬透明度。
最後用imagepng()輸出生成的圖像。