“php图像过滤器”;“着色”;破坏图像细节

“php图像过滤器”;“着色”;破坏图像细节,php,image,gd,imagefilter,colorize,Php,Image,Gd,Imagefilter,Colorize,我正在尝试在我的服务器上为黑白图片着色 我尝试了多种方法,唯一有效的方法是gdimagefiltervia filter IMG\u filter\u COLORIZE 它确实会以我想要的完全相同的颜色给图像上色,但是它会丢失图像上的所有细节,就好像它只是修剪了不够黑的黑点,稀释了所有的黑线,使它们几乎看不见一样。以下是我要说的: 这个结果是用这个代码实现的 $im=imagecreatefromjpeg($orig_file); imagefilter($im, IMG_FILTER_CO

我正在尝试在我的服务器上为黑白图片着色

我尝试了多种方法,唯一有效的方法是gd
imagefilter
via filter IMG\u filter\u COLORIZE

它确实会以我想要的完全相同的颜色给图像上色,但是它会丢失图像上的所有细节,就好像它只是修剪了不够黑的黑点,稀释了所有的黑线,使它们几乎看不见一样。以下是我要说的:

这个结果是用这个代码实现的

$im=imagecreatefromjpeg($orig_file);
imagefilter($im, IMG_FILTER_COLORIZE, 71, 92, 10);
imagejpeg($im, $output_file, 95);

为什么会这样?有没有其他方法可以使图像着色?我的原始图像相当大,我无法迭代,因为它太慢了;这就是为什么我尝试使用一个库来实现这一点

在Imagick和compositeImage的帮助下,我成功地实现了预期的结果。结果如下

我是如何做到这一点的,这是一种只有在非常特定的条件下才有效的技巧——即需要背景为白色,并且只有黑色/灰色的对象在前面(或者正好相反)。这种技术在透明的背景下不起作用

这个想法是有两层-下面是一层原始灰度图像和顶层-完全填充所需的颜色。然后,您可以使用“composite_lighte”合成这些图像(您可以使用其他方法,例如变暗-如果您在黑色背景上有白色对象)

这是密码

$base_color="#475c0a";
$im=new Imagick($orig_file);

$im2 = new Imagick();
$im2->newImage($im->getImageWidth(), $im->getImageHeight(), new ImagickPixel($base_color) );

$im->compositeImage($im2, Imagick::COMPOSITE_LIGHTEN, 0, 0);

$im->writeImage($new_image_path);
希望这能帮助别人