我不知道这是否可能。
我有两张图片,一张是颜色渐变,另一张是带有纹理的透明图片。我想用渐变图像填充第二张图像的纹理。我在谷歌上搜索并尝试了相同的示例,但没有找到解决方案。
透明纹理图像:
渐变彩色图像:
最终图像:
请忽略最终图像的黑色背景。
这就是你的做法:
<?php
$img1 = imagecreatefrompng('1.png');
$img2 = imagecreatefrompng('2.png');
$imgFinal = alphaOverlay($img1, $img2, 181, 181);
header('Content-Type: image/png');
imagepng($imgFinal);
imagedestroy($img1);
imagedestroy($img2);
imagedestroy($imgFinal);
function alphaOverlay($destImg, $overlayImg, $imgW, $imgH)
{
for($y=0;$y<$imgH;$y++)
{
for($x=0;$x<$imgW;$x++)
{
$ovrARGB = imagecolorat($overlayImg, $x, $y);
$ovrA = ($ovrARGB >> 24) << 1;
$ovrR = $ovrARGB >> 16 & 0xFF;
$ovrG = $ovrARGB >> 8 & 0xFF;
$ovrB = $ovrARGB & 0xFF;
$change = false;
if($ovrA == 0)
{
$dstR = $ovrR;
$dstG = $ovrG;
$dstB = $ovrB;
$change = true;
}
elseif($ovrA < 254)
{
$dstARGB = imagecolorat($destImg, $x, $y);
$dstR = $dstARGB >> 16 & 0xFF;
$dstG = $dstARGB >> 8 & 0xFF;
$dstB = $dstARGB & 0xFF;
$dstR = (($ovrR * (0xFF-$ovrA)) >> 8) + (($dstR * $ovrA) >> 8);
$dstG = (($ovrG * (0xFF-$ovrA)) >> 8) + (($dstG * $ovrA) >> 8);
$dstB = (($ovrB * (0xFF-$ovrA)) >> 8) + (($dstB * $ovrA) >> 8);
$change = true;
}
if($change)
{
$dstRGB = imagecolorallocatealpha($destImg, $dstR, $dstG, $dstB, 0);
imagesetpixel($destImg, $x, $y, $dstRGB);
}
}
}
return $destImg;
}
?>
输出: