如何在 PHP ImageMagick 中使用 -auto-level +level-colors 命令参数

how to use -auto-level +level-colors command argument into PHP ImageMagick

我正在转换具有特定颜色的图像,使用 magick 命令可以正常工作,下面是我的命令,

magick image.png -channel RGB -colorspace gray -auto-level +level-colors '#f48023', result.png

它工作得很好,现在我正在将此命令转换为 PHP 代码,但不确定 -auto-level+level-colors 参数。这是我的代码,

$image = new Imagick('image.png');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$image->setImageColorspace(Imagick::COLORSPACE_RGB);
$image->setImageType(Imagick::IMGTYPE_GRAYSCALE);
$image->opaquePaintImage('','#f48023', 0, true);
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);
header("Content-Type: image/png");
echo $image->getImageBlob();

输出看起来一点也不好,

这是我的原图

**编辑(更新代码)**

$im = new Imagick();
$image = new Imagick('logo3.jpg');
list ($width, $height) = array_values ($image->getImageGeometry ());
$im->newImage(1, $height,new ImagickPixel('#f48023'));
$im->newImage(1, $height,new ImagickPixel('#FFF'));
$im->resetIterator();
$combine  =$im->appendImages(true);

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$image->setImageColorspace(Imagick::COLORSPACE_GRAY);
$image->contrastStretchImage(1,1,Imagick::CHANNEL_GRAY);
$image->clutImage($combine);
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);

header("Content-Type: image/png");
echo $image;

此代码的输出如下

logo3.jpg 在这里

请参阅 https://www.php.net/manual/en/imagick.autolevelimage.php

处的 autoLevelImage

我没有看到任何等同于 +level-colors 的东西。但是您可以通过创建一个双像素彩色贴图图像来获得类似的效果,通过附加两个 1 像素图像,两种颜色各有一个像素。参见 https://www.php.net/manual/en/imagick.appendimages.php

然后使用 clutImage 将颜色映射图像中的颜色应用到处理后的图像。参见 https://www.php.net/manual/en/imagick.clutimage.php

加法:

我的意思是使用 ImageMagick 命令行替代 -auto-level 和 +level-colors。在第一个命令中,我使用了 -auto-level 和 +level-colors。在第二个命令中,我使用 -contrast-stretch 0(相当于 -auto-level)和带有 -clut 的彩色贴图图像相当于 +level-colors.


输入:

magick lorem_ipsum.png -colorspace gray -contrast-stretch 0 +level-colors '#f48023,' lorem_ipsum_recolor1.png 

magick \( lorem_ipsum.png -colorspace gray -contrast-stretch 0 \) \
\( -size 1x1 xc:"#f48023" xc:white +append -filter cubic -resize 1024 \) \
-clut lorem_ipsum_recolor2.png 

我认为不需要 -colorspace RGB,这会使颜色呈线性且更暗。如果您想从其他颜色空间转换,请使用 -colorspace sRGB。

在 PHP Imagick 中试试这个,我已将 resizeImage 添加到您的组合图像中。您可以尝试 FILTER_TRIANGLE 代替 FILTER_CUBIC,看看您更喜欢哪一个。我还将您的 contrastStretchImage 替换为 autoLevelImage。

$im = new Imagick();
$image = new Imagick('logo3.jpg');
list ($width, $height) = array_values ($image->getImageGeometry ());
$im->newImage(1, $height,new ImagickPixel('#f48023'));
$im->newImage(1, $height,new ImagickPixel('#FFF'));
$im->resetIterator();
$combine  =$im->appendImages(true);
$combine->resizeImage(1024,1,Imagick::FILTER_CUBIC,1)

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_DEACTIVATE);
$image->setImageColorspace(Imagick::COLORSPACE_GRAY);
$image->autoLevelImage();
$image->clutImage($combine);
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_ACTIVATE);

header("Content-Type: image/png");
echo $image;