Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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
Javascript PHP或JS:将图像转换为黑白时调整颜色通道级别_Javascript_Php_Image Processing_Imagemagick_Gd - Fatal编程技术网

Javascript PHP或JS:将图像转换为黑白时调整颜色通道级别

Javascript PHP或JS:将图像转换为黑白时调整颜色通道级别,javascript,php,image-processing,imagemagick,gd,Javascript,Php,Image Processing,Imagemagick,Gd,我正在寻找有关如何调整黑白(或灰度)图像的颜色通道级别的帮助。在photoshop中,此功能称为黑白滤镜 下面的例子演示了我的过程。红色衬衫(完美的中灰色)在最终图像中为黑色 原始图像 将色调更改为绿色 最终图像现在为黑白(中灰色/红色衬衫黑色) 使用Imagemagick,您可以使用操作符来调整黑白端点,这反过来又可以应用于特定的颜色 例如: convert source.png -level 45%,80% out.png convert green.png -fill gray2

我正在寻找有关如何调整黑白(或灰度)图像的颜色通道级别的帮助。在photoshop中,此功能称为黑白滤镜

下面的例子演示了我的过程。红色衬衫(完美的中灰色)在最终图像中为黑色

原始图像

将色调更改为绿色

最终图像现在为黑白(中灰色/红色衬衫黑色)

使用Imagemagick,您可以使用操作符来调整黑白端点,这反过来又可以应用于特定的颜色

例如:

 convert source.png -level 45%,80% out.png
convert green.png  -fill gray20 -fuzz 30% -opaque hsl\(33%,100%,50%\) black80.png
convert black80.png -colorspace Gray bw_shirt.png
对于PHP,您将使用该方法

$img=newimagick('source.png');
$quantum=$img->getQuantumRange()['quantumRangeLong'];
$img->levelImage(0.45*$quantum、1.0、0.80*$quantum、Imagick::CHANNEL_ALL);
更新

要生成中间图像(绿色衬衫),可以使用“红色->绿色”色调调制。文档中的示例

现在要将颜色替换为黑色,只需使用和。但老实说,所有的绿色都让我想起了它被定义为

一旦隔离了遮罩,就可以很容易地交换颜色、背景或更复杂的图像

convert green.png -fx '1 * b - 1 * g + 1' mask.png

遮罩方法的主要优点是颜色细节(阴影、高光和线条)将保留在最终图像中。在PHP中将这一切结合在一起:

$img=newimagick(“source.jpg”);
$org=clone$img;//复制最终合成的源
$img->modulateImage(100100166.6);//将色调从红色转换为绿色
/*
应用外汇操作。记住:K0、K1和K2是常数
需要对其进行调整,以匹配所需的色度键
我想击倒你。
*/
$mask=$img->fxImage('1.35*b-0.95*g+1');
//将遮罩复制为新的alpha通道
$org->compositeImage($mask,Imagick::COMPOSITE_copycopacity,0,0,Imagick::CHANNEL_ALPHA);

用于将衬衫填充为黑色80%(或灰色20%)。在纯彩色图像上合成新图像,并降到灰度

$fin=new Imagick();
$fin->setSize($org->宽度,$org->高度);
$fin->readImage(“xc:gray20”);
$fin->compositeImage($org,Imagick::COMPOSITE_DEFAULT,0,0);
$fin->setImageColorspace(Imagick::COLORSPACE\U GRAY);
$fin->writeImage('fin.jpg');

下面是用图案填充衬衫的示例

$pattern=new Imagick();
$pattern->setSize($org->width,$org->height);
$pattern->readImage(“pattern:VERTICALSAW”);
$pattern->negateImage(false);
$pattern->compositeImage($org,Imagick::COMPOSITE_DEFAULT,0,0);
$pattern->setImageColorspace(Imagick::COLORSPACE\u GRAY);
$pattern->writeImage('pattern.jpg');

同样,如果您想保留细节,这是理想的。如果你想做一个完整的淘汰赛(如全绿到黑80%),只需使用,&

例如:

 convert source.png -level 45%,80% out.png
convert green.png  -fill gray20 -fuzz 30% -opaque hsl\(33%,100%,50%\) black80.png
convert black80.png -colorspace Gray bw_shirt.png

您要找的是这个命令吗

convert                              \
  http://i.stack.imgur.com/QW5M0.jpg \
 -colorspace gray                    \
  b+w.jpg
结果(左侧为原始红色衬衫,右侧为黑色+白色图像):

还是你想让与原版不同的红色色调变成(几乎)纯黑色在这种情况下,添加一些
-gamma
调整,可能:

convert                              \
  http://i.stack.imgur.com/QW5M0.jpg \
 -colorspace gray                    \
 -level 0%,100%,0.5                  \
  b+w-2.jpg

以下是两张生成的图像:

当然,你可以用我在这里使用的精确参数玩得更多一些

更新 以下命令首先更改红色通道的颜色级别,然后将此中间结果转换为灰度:

convert              \
   red---QW5M0.jpg   \
  -channel R         \
  -level 0%,40%      \
  -colorspace gray   \
  -level 0%,100%,0.5 \
   b+w-4.jpg


我在问题中的示例中添加了图像。我将示例中的中间(绿色)图像上载到Imagick库中,levelImage没有调整绿色。第二个图像(绿色色调)非常完美,正是我想要的!第三幅图像上的遮罩很好理解(特别是对于未来的项目),但我真的在寻找一种方法,使第三幅图像看起来像我的示例中的那样。有可能吗?顺便问一句,PHP语法是什么呢?convert green.png-fx'1*b-1*g+1'mask.png另一个想法。。。在色调变为绿色后,可以用80%的黑色来代替绿色吗?我不理解你的说法:“红色衬衫(这是一种完美的中灰色)”??在黑白摄影中,红色被认为是一种中灰色,是一种可以测量光线的好颜色。衬衫能在不使肤色和背景色变暗的情况下变暗吗?(这就是为什么我添加了一个中间层以将色调更改为绿色)@Jeffrey:那么你希望这件衬衫是(almoste)纯黑色(没有不同的灰色)但其他灰度应该保持大致不变?Photoshop中有一个名为“黑白”的过滤器,它可以将彩色照片更改为黑白,但仍然可以更改各个颜色级别。那正是我要找的for@Jeffrey:我没有可用的Photoshop,并且我不熟悉它,因此我不完全理解您关于它如何工作的解释,因此我无法真正将其重新实现为ImageMagick命令行…:-(基本上,我需要从第一张彩色图像转换到第三张黑白图像,并能够在转换过程中改变颜色通道。您的第二张到最后一张图像很接近。是否可以使用这种方法使用我的第二张图像(绿色)来获得我的第三张图像(黑白)?
convert              \
   red---QW5M0.jpg   \
  -channel R         \
  -level 0%,80%      \
  -colorspace gray   \
  -level 0%,100%,0.5 \
   b+w-5.jpg