我想知道并了解如何着色/替换图像的任何像素,这对于不透明像素不是(完全)透明。
例如,拥有带有透明像素的多色徽标,我想将其转换为仅使用#ff0000颜色的徽标,而不是更改透明背景。
我想通过PHP Imagick Library实现这一目标。我找不到任何好的文件。
我认为 Imagick::thresholdImage 是一个帮手,但没有关于阈值参数的文档。
使用此代码片段可以获得最佳效果。但仍然没有完美的工作。一些像素 - 我猜那些有alpha> 0和< 1不会被替换。
$image = new \Imagick($source);
$image->setImageFormat('png');
$fill = new \ImagickPixel('#ff0000');
$image->thresholdImage(0);
$image->paintOpaqueImage('#ffffff', $fill, 1);
$image->writeImage($destination);
答案 0 :(得分:2)
我想知道并了解如何着色/替换图像的任何像素,这对于不透明像素不是(完全)透明。
你几乎肯定不会。
下面的代码完成了你的要求(我认为),输出看起来很糟糕。也许您应该给出一个示例输入图像,以及您在Photoshop中编辑过的希望的示例输出图像,以显示您希望的内容。
输入图片:
输出图片:
$imagick = new Imagick("fnord.png");
// Get the alpha channel of the original image.
$imagick->separateImageChannel(\Imagick::CHANNEL_ALPHA);
// Make all the colors above this pure white.
$imagick->whiteThresholdImage("rgb(254, 254, 254)");
// Make all the colors below this pure black.
$imagick->blackThresholdImage("rgb(254, 254, 254)");
// We want the mask the other way round
$imagick->negateImage(false);
$imagickCanvas = new \Imagick();
$imagickCanvas->newPseudoImage(
$imagick->getImageWidth(),
$imagick->getImageHeight(),
"xc:rgb(255, 0, 0)"
);
// Copy the mask back as the alpha channel.
$imagickCanvas->compositeImage($imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0);
// Write out the image.
$imagickCanvas->setImageFormat('png');
$imagickCanvas->writeImage("./output.png");