2017-04-21 5 views
2

Ich verwende ImageMagick in PHP, um den weißen Hintergrund eines Bildes transparent zu machen. Ich übergebe die Bild-URL an dieses PHP-Skript und es gibt das Bild zurück.ImageMagick Weiß zu transparentem Hintergrund, während weißes Objekt beibehalten

<?php 

    // grab the remote image URL 
    $imgUrl = $_GET['img']; 

    // create new ImageMagick object 
    $im = new Imagick($imgUrl); 

    // remove extra white space 
    $im->clipImage(0); 

    // convert white background to transparent 
    $im->paintTransparentImage($im->getImageBackgroundColor(), 0, 3000); 

    // resize image --- passing 0 as width invokes proportional scaling 
    $im->resizeImage(0, 200, Imagick::FILTER_LANCZOS, 1); 

    // set resulting image format as png 
    $im->setImageFormat('png'); 

    // set header type as PNG image 
    header('Content-Type: image/png'); 

    // output the new image 
    echo $im->getImageBlob(); 

?> 

Dies funktioniert genau so, wie ich es brauche - mit einer Ausnahme. Wenn ich ein Bild mit einem weißen Objekt habe, funktioniert es nicht so gut, wenn ich einen fuzz-Wert an paintTransparentImage übergebe; So säubere ich gezackte Kanten.

Hier ist ein Beispiel für das Ergebnis, beachten Sie das weiße Sofa:

enter image description here

Wenn ich dann keinen Flaum Wert übergeben, ich einen richtigen Schnitt zu bekommen, aber ich bin links mit unordentlich Kanten:

enter image description here

ich versucht habe, mit resizeImage(), was jemand 'räumlichem Anti-Aliasing' (sprengen das Bild wirklich groß genannt -> verwenden paintTransparentBac kground() -> verkleinern das Bild, aber ich habe keine wesentlichen Änderungen bemerkt.

Gibt es etwas, was ich tun kann, um diese wirklich weißen Bilder besser zu handhaben? Ich habe ungefähr mit trimImage() und edgeImage() gespielt, aber ich bin nicht in der Lage, die Ergebnisse zu erhalten, nach denen ich bin.

Worst Case Szenario, (obwohl nicht ideal), gibt es eine Möglichkeit zu identifizieren, ob ein Bild einen bestimmten Prozentsatz einer bestimmten Farbe enthält? IE. Wenn das Bild etwa 90% weiße Pixel enthält, könnte ich paintTransparentImage mit einem Fuzz-Wert von 0 anstelle von 3000 ausführen, was mir zumindest einen korrekten Schnitt geben würde.

Danke.

+0

gelöst. Bearbeiteter Beitrag, um die Lösung zu zeigen. – Crayons

Antwort

1

LöSUNG:

weißen Hintergrund mit einiger anderen Farbe ersetzen zuerst, dann diese Farbe transparent ändern.

<?php 

    // get img url 
    $imgUrl = $_GET['img']; 

    // create new ImageMagick object from image url 
    $im = new Imagick($imgUrl); 

    // replace white background with fuchsia 
    $im->floodFillPaintImage("rgb(255, 0, 255)", 2500, "rgb(255,255,255)", 0 , 0, false); 

    //make fuchsia transparent 
    $im->paintTransparentImage("rgb(255,0,255)", 0, 10); 

    // resize image --- passing 0 as width invokes proportional scaling 
    $im->resizeImage(0, 200, Imagick::FILTER_LANCZOS, 1); 

    // set resulting image format as png 
    $im->setImageFormat('png'); 

    // set header type as PNG image 
    header('Content-Type: image/png'); 

    // output the new image 
    echo $im->getImageBlob(); 

?> 

enter image description here

enter image description here

enter image description here

enter image description here

Verwandte Themen