Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php ImageMagick/Imagick:将带有Alpha通道的PNG转换为双色图像(彩色,透明)_Php_Imagemagick_Imagick - Fatal编程技术网

Php ImageMagick/Imagick:将带有Alpha通道的PNG转换为双色图像(彩色,透明)

Php ImageMagick/Imagick:将带有Alpha通道的PNG转换为双色图像(彩色,透明),php,imagemagick,imagick,Php,Imagemagick,Imagick,我想知道并找出,我如何用不透明像素着色/替换图像中(完全)不透明的任何像素 例如,有一个带有透明像素的多色徽标,我希望将其转换为只有颜色#ff0000的徽标,而不更改透明背景 我想通过PHPImagick库实现这一点。我找不到任何好的文件 我认为将是一个帮助器,但是没有关于threshold参数的文档 使用这段代码可以获得最佳结果。但仍然不能很好地工作。一些像素-我猜那些alpha>0和

我想知道并找出,我如何用不透明像素着色/替换图像中(完全)不透明的任何像素

例如,有一个带有透明像素的多色徽标,我希望将其转换为只有颜色#ff0000的徽标,而不更改透明背景

我想通过PHPImagick库实现这一点。我找不到任何好的文件

我认为将是一个帮助器,但是没有关于threshold参数的文档

使用这段代码可以获得最佳结果。但仍然不能很好地工作。一些像素-我猜那些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);
我想知道并找出,我如何用不透明像素着色/替换图像中(完全)不透明的任何像素

你几乎肯定不会

下面的代码执行了您的要求(我认为),输出看起来很糟糕。也许您应该给出一个示例输入图像,以及一个您在Photoshop中编辑的示例输出图像,以显示您所希望的内容

输入图像:

输出图像:


我不能100%确定您实际想要做什么,但我认为您希望alpha/透明度通道限制为100%或0%,没有中间值,因此需要设置alpha通道的阈值,因此我认为您需要设置背景颜色,然后执行类似于阈值图像的操作(Imagick::getQuantum()-1,Imagick::channel_alpha)谢谢,伙计。就是这样。即使输出看起来很糟糕。这正是期望的输出。(在我的使用案例中,不会有像您的示例中那样具有alpha值的大(ger)区域。即使大多数请求的图像包含更模糊的轮廓和更大的半透明区域,我也可以调整阈值以获得折衷的结果。
$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");