在 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() 输出生成的图像。