彩色叠加在白色PNG图像上,具有透明度


Color overlay on white PNG image with transparency

我有以下图像:https://i.stack.imgur.com/mM8cY.png

我想做的是创建一个"颜色叠加"的效果,就像在Photoshop。我需要某种代码,允许我将每个白色像素更改为以0-255的RGB数字指定的值。我听说过ImageMagick类,但我在任何地方都找不到它,而且我甚至不知道如何使用该类。我目前正在尝试使用imagefilter,但它不适用于白色图像。这是我当前的代码:

<?php
$match = array();
if (isset($_GET['c']) && preg_match('/^#?(?:[A-Fa-f0-9]{2}){3}$/',$_GET['c'],$match)){
    $match = str_split($match[0],2);
    foreach ($match as $k=>$m){ $match[$k] = intval($match[$k],16); }
    $img = imageCreateFromPng('splat.png');
    $background = imagecolorallocate($img, 0, 0, 0);
    imagecolortransparent($img, $background);
    imagealphablending($img, false);
    imagesavealpha($img, true);
    //Transformation code
    imagefilter($img, IMG_FILTER_COLORIZE, $match[0], $match[1], $match[2]);
    header('Content-type: image/png');
    imagePng($img);
    exit;
}
?>

我找到了解决方案。我所做的只是使用Photoshop在图像上添加了一个红色覆盖层,所以现在看起来是这样的:https://i.stack.imgur.com/mVARN.png

然后使用了以下PHP代码:

<?php
$match = array();
$color = isset($_GET['c']) ? $_GET['c'] : false;
if ($color === false) isset($_GET['color']) ? $_GET['color'] : false;
$color = preg_replace('/^#/','',$color);
if (strlen($color) == 3) $color = $color[0].$color[0].$color[1].$color[1].$color[2].$color[2];
if (preg_match('/^(?:[A-Fa-f0-9]{2}){3}$/',$color,$match)){
    $match = str_split($match[0],2);
    foreach ($match as $k=>$m){ $match[$k] = intval($match[$k],16); }
    // Load image
    $img = imageCreateFromPng('splat.png');
    $background = imagecolorallocate($img, 0, 0, 0);
    imagecolortransparent($img, $background);
    imagealphablending($img, false);
    imagesavealpha($img, true);
    imagefilter($img, IMG_FILTER_COLORIZE, intval( intval($match[0],16) - 255 ,16), $match[1], $match[2]);
    header('Content-type: image/png');
    imagePng($img);
    exit;
}
?>

这里的关键是,我用以下内容减去输入的255红色值:

intval( intval($match[0],16) - 255 ,16)

这就适当地改变了颜色。