2016-04-04 11 views
1

Ich würde gerne wissen und herausfinden, wie ich jedes Pixel eines Bildes kolorieren/ersetzen kann, das ist nicht (vollständig) transparent mit einem opaken Pixel.ImageMagick/Imagick: Konvertiere ein PNG mit Alpha-Kanal in ein 2-farbiges Bild (Farbe, Transparent)

Zum Beispiel möchte ich ein mehrfarbiges Logo mit transparenten Pixeln in ein Logo mit nur der Farbe # ff0000 konvertieren und den transparenten Hintergrund nicht ändern.

Ich möchte dies mit der PHP Imagick Library erreichen. Ich kann keine gute Dokumentation finden.

Ich dachte, dass Imagick::thresholdImage wäre ein Helfer, aber es gibt keine Dokumentation über den Schwellenwert Parameter.

Mit diesem Codefragment werden die besten Ergebnisse erzielt. Aber immer noch nicht perfekt funktioniert. Einige Pixel - ich denke, die mit Alpha> 0 und < 1 werden nicht ersetzt.

$image = new \Imagick($source); 
$image->setImageFormat('png'); 

$fill = new \ImagickPixel('#ff0000'); 
$image->thresholdImage(0); 
$image->paintOpaqueImage('#ffffff', $fill, 1); 

$image->writeImage($destination); 
+0

Ich bin nicht 100% sicher, was Sie wirklich tun wollen, aber ich denke, Sie Ihre Alpha wollen/Transparenz-Kanal auf 100% oder 0% ohne Zwischenwerte begrenzt sein, so müssen Sie Ihren Alpha-Kanal schwellen, so denke ich, dass Sie eine Hintergrundfarbe festlegen möchten und dann etwas wie 'thresholdImage (Imagick :: getQuantum() - 1, imagick :: CHANNEL_ALPHA)' –

Antwort

2

Ich würde gerne wissen, und finden Sie heraus, wie ich kann jeden Pixel eines Bildes einfärben/ersetzen, das ist nicht (vollständig) transparent mit einem undurchsichtigen Pixel.

Sie fast sicher nicht.

Der Code unten tut was Sie fragen (ich denke) und die Ausgabe sieht schrecklich aus. Vielleicht sollten Sie ein Beispiel für ein Eingabebild geben und ein Beispiel für ein Bild, das Sie hoffentlich in Photoshop bearbeitet haben, um zu zeigen, worauf Sie gehofft haben.

Eingabebild:

enter image description here

Ausgabebild:

enter image description here

$imagick = new Imagick("fnord.png"); 

// Get the alpha channel of the original image. 
$imagick->separateImageChannel(\Imagick::CHANNEL_ALPHA); 

// Make all the colors above this pure white. 
$imagick->whiteThresholdImage("rgb(254, 254, 254)"); 

// Make all the colors below this pure black. 
$imagick->blackThresholdImage("rgb(254, 254, 254)"); 

// We want the mask the other way round 
$imagick->negateImage(false); 

$imagickCanvas = new \Imagick(); 

$imagickCanvas->newPseudoImage(
    $imagick->getImageWidth(), 
    $imagick->getImageHeight(), 
    "xc:rgb(255, 0, 0)" 
); 

// Copy the mask back as the alpha channel. 
$imagickCanvas->compositeImage($imagick, \Imagick::COMPOSITE_COPYOPACITY, 0, 0); 

// Write out the image. 
$imagickCanvas->setImageFormat('png'); 
$imagickCanvas->writeImage("./output.png"); 
+0

Danke, Mann. Das ist es. Auch wenn die Ausgabe schrecklich aussieht. Das ist genau die gewünschte Ausgabe. (In meinem Anwendungsfall wird es keine großen (ger) Bereiche mit Alpha-Werten wie in Ihrem Beispiel geben. Und selbst wenn die meisten der angeforderten Bilder mehr verschwommene Konturen mit größeren halbtransparenten Bereichen enthalten, kann ich den Schwellenwert anpassen, um ein Ergebnis zu erhalten ein Kompromiss sein. –