1

我不知道这是否可能。

我有两张图片,一张是颜色渐变,另一张是带有纹理的透明图片。我想用渐变图像填充第二张图像的纹理。我在谷歌上搜索并尝试了相同的示例,但没有找到解决方案。

透明纹理图像:

透明纹理图像

渐变彩色图像:

渐变彩色图像

最终图像:

最终图像

请忽略最终图像的黑色背景。

4

1 回答 1

0

这就是你的做法:

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

?>

输出:

在此处输入图像描述

于 2013-11-12T10:55:15.813 回答