gpt4 book ai didi

imagick - 如何在 Imagick 中仅使用两个颜色索引将图像转换为 GIF

转载 作者:行者123 更新时间:2023-12-01 12:28:41 25 4
gpt4 key购买 nike

我想把一张图片转成只有黑白两种颜色的GIF格式

因此输出图像中的每个像素都将是黑色或白色

有人知道在 imagick 中进行转换的方法吗?

最佳答案

虽然写出双色 gif 的最终转换是相同的,但将图像转换为黑白双色的方法有细微的不同。

下面是一些方法:

实际强制图像像素值为 0,0,0 和 255,255,255 的辅助方法

function forceBlackAndWhite(Imagick $imagick, $ditherMethod = \Imagick::DITHERMETHOD_NO)
{
$palette = new Imagick();
$palette->newPseudoImage(1, 2, 'gradient:black-white');
$palette->setImageFormat('png');
//$palette->writeImage('palette.png');

// Make the image use these palette colors
$imagick->remapImage($palette, $ditherMethod);
$imagick->setImageDepth(1);
}

只需使用重新映射到调色板即可将图像强制为 2 种颜色而无需任何抖动。

function twoColorPaletteOnly()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
forceBlackAndWhite($imagick, \Imagick::DITHERMETHOD_NO);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputPalette.gif");
}

调色板输出:

enter image description here

使用 http://phpimagick.com/Imagick/posterizeImage允许对抖动过程进行不同的控制。

function twoColorViaPosterize()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
$imagick->transformImageColorspace(\Imagick::COLORSPACE_GRAY);
$imagick->posterizeImage(2, \Imagick::DITHERMETHOD_RIEMERSMA);
forceBlackAndWhite($imagick);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputPosterize.gif");
}

色调分离输出:

enter image description here

thresholdImage 函数允许我们控制图像从黑色变为白色的“级别”。

function twoColorViaThreshold()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
$imagick->transformImageColorspace(\Imagick::COLORSPACE_GRAY);
$imagick->thresholdImage(0.5 * \Imagick::getQuantum());
forceBlackAndWhite($imagick);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputThreshold.gif");

}

阈值输出:

enter image description here

使用 blackThresholdImage 和 whiteThresholdImage 函数允许我们控制每个 channel 的颜色阈值

function twoColorViaColorThreshold()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
$thresholdColor = "RGB(127, 100, 100)";
$imagick->blackThresholdImage($thresholdColor);
$imagick->whiteThresholdImage($thresholdColor);
forceBlackAndWhite($imagick);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputColorThreshold.gif");
}

颜色阈值输出

enter image description here

提取单个图像 channel 可以产生“更干净”的输出图像。

function twoColorViaColorChannelThreshold()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
$imagick->separateImageChannel(\Imagick::CHANNEL_RED);
$imagick->thresholdImage(0.5 * \Imagick::getQuantum());
forceBlackAndWhite($imagick);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputColorChannelThreshold.gif");
}

颜色 channel 阈值

enter image description here

我们可以使用 colorMatrixImage 函数更精确地组合 RGB channel ,这使我们可以完全控制单独的 R G B 值应该如何影响输出图像。

function twoColorViaColorMatrixChannelThreshold()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");

// The only
$colorMatrix = [
0.6, 0.2, 0.2, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 0.0, 0.0,
];

// The intensity of the red channel after applying this color matrix takes
// the values from the pixels before the transformation of:
// 60% of the red, 20% blue, 20% green
$imagick->colorMatrixImage($colorMatrix);
$imagick->separateImageChannel(\Imagick::CHANNEL_RED);
$imagick->thresholdImage(0.5 * \Imagick::getQuantum());
forceBlackAndWhite($imagick);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputColorMatrixChannelThreshold.gif");
}

colorMatrixChannelThreshold 输出

enter image description here

上面代码的输出图像是:

关于imagick - 如何在 Imagick 中仅使用两个颜色索引将图像转换为 GIF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36833163/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com