Obwohl die endgültige Konvertierung zum Ausgeben eines zweifarbigen GIFs gleich ist, gibt es subtil verschiedene Möglichkeiten, ein Bild in zwei Farben Schwarz und Weiß zu konvertieren.
Hier sind einige Methoden unter:
Helper-Methode, um tatsächlich Bilder zu zwingen Pixel von Werten 0,0,0 und 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);
}
nur verwenden, um die Wiederabbildungs-zu-Palette zu sein, das Bild zu zwingen, 2 Farben ohne Dithering.
function twoColorPaletteOnly()
{
$imagick = new Imagick(__DIR__."/../images/Biter_500.jpg");
forceBlackAndWhite($imagick, \Imagick::DITHERMETHOD_NO);
$imagick->setImageFormat('gif');
$imagick->writeImage("./outputPalette.gif");
}
Palette Ausgabe:

Mit der http://phpimagick.com/Imagick/posterizeImage ermöglicht es, verschiedene Kontrolle über den Dithering-Prozess.
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");
}
Posterize Ausgang:

Die thresholdImage Funktion ermöglicht es uns, auf zu kontrollieren, was auf 'Ebene' ändert sich das Bild von Schwarz auf Weiß.
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");
}
Schwellenausgangs:

die blackThresholdImage whiteThresholdImage und Funktionen verwenden, können wir die Farbschwelle pro Kanal
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");
}
colorThreshold Ausgang
steuern,
Das Extrahieren eines einzelnen Bildkanals kann zu einem saubereren Ausgabebild führen.
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");
}
colorChannelThreshold

Wir mehr die RGB-Kanäle kombinieren können genau die colorMatrixImage-Funktion nutzen, die uns die vollständige Kontrolle darüber, wie die einzelnen R G B-Werte gibt sollte das Ausgangsbild beeinflussen.
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 Ausgang

Die Ausgangsbilder für den Code oben sind:
Diese aufwendige Antwort verdient wirklich ein "Thank you!". Besonders die letzte beschriebene Methode ist sehr lehrreich. – Ideogram