當前位置: 首頁> 最新文章列表> 與imagecopymerge() 實現透明圖層合併

與imagecopymerge() 實現透明圖層合併

M66 2025-05-23

在PHP 的圖像處理庫GD 中, imagecopymerge()是一個常用函數,用來將一個圖像合併到另一個圖像上,並允許設置合併的透明度(實際上是合併的“混合程度”)。但如果你想要更精細地控制透明效果,比如使用真正的alpha 通道(而不僅僅是簡單的不透明度調整),就需要搭配imagecolorallocatealpha()一起使用。

本文將介紹如何用imagecolorallocatealpha()定義帶alpha 通道(透明度)的顏色,並結合imagecopymerge() ,實現帶透明效果的圖層合併。

1?? 基礎介紹

  • 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()填充帶透明色的區域。

2?? 示例代碼:帶透明效果的圖層合併

以下是一個完整示例,展示如何創建一個透明背景的圖層並將其合併到主圖上。

 <?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);
?>

3?? 代碼解析

  • imagecreatetruecolor()用來創建一塊真彩色畫布。

  • imagesavealpha()打開保存alpha 通道的標誌,確保透明信息不會丟失。

  • imagecolorallocatealpha()定義一個帶透明度的顏色,這裡我們用它創建了完全透明的背景和半透明的紅色。

  • imagecopy()而不是imagecopymerge()用來保留alpha 通道。如果用imagecopymerge() ,GD 庫會強制關閉alpha 混合,僅使用$pct模擬透明度。

  • 最後用imagepng()輸出生成的圖像。