2016-04-25 10 views
2

Ich möchte konvertieren ein Bild GIF-Format mit nur zwei Farben, schwarz und weißWie mit nur zwei Farbindex in Imagick

so dass jedes Pixel im Ausgangsbild Bild zu GIF konvertieren schwarz oder weiß sein

kennt jemand irgendeine Möglichkeit, im imagick zu konvertieren?

Antwort

2

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:

enter image description here

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:

enter image description here

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:

enter image description here

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

enter image description here

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

enter image description here

Die Ausgangsbilder für den Code oben sind:

+0

Diese aufwendige Antwort verdient wirklich ein "Thank you!". Besonders die letzte beschriebene Methode ist sehr lehrreich. – Ideogram