Estoy usando ImageMagick de PHP para convertir el fondo blanco de una imagen en transparente. Paso la URL de la imagen a este script PHP y devuelve la imagen.
<?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();Estas transformaciones funcionan bastante bien. Sin embargo, si tengo una imagen con un objeto blanco, no funciona muy bien como resultado de pasar un valor fuzz a paintTransparentImage() ; así es como estoy limpiando los bordes irregulares.
Aquí hay un ejemplo del resultado, observe el sofá blanco:
Si no paso un valor de fuzz, obtengo un corte adecuado, pero me quedo con bordes desordenados:
Intenté usar resizeImage() en un esfuerzo por lograr lo que se llama 'anti-aliasing espacial' (ampliar la imagen realmente grande -> usar paintTransparentImage() -> reducir la imagen hacia abajo), pero no noté nada significativo cambios.
¿Hay algo que pueda hacer para manejar mejor estas imágenes realmente blancas? He jugado con trimImage() y edgeImage() , pero no puedo obtener los resultados que busco.
En el peor de los casos (aunque no el ideal), ¿existe algún medio para identificar si una imagen contiene algún porcentaje de un color en particular? ES DECIR. si la imagen contiene> 90% de píxeles blancos, entonces podría ejecutar paintTransparentImage() con un valor de fuzz de 0 en lugar de 3000, lo que al menos me daría un corte adecuado.
Gracias.
SOLUCIÓN:
Reemplace el fondo blanco con algún otro color primero, luego cambie ese color a transparente.
<?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();actualización en 2021 => módulo imagick versión 3.4.4 (de nada :o) ):
$imgick = new Imagick($pathToFile); $aTaille=$imgick->getImageGeometry(); $colorToTransparent=$imgick->getImagePixelColor(0,0); $imgick->borderImage($colorToTransparent, 10, 10); $imgick->floodFillPaintImage("rgb(255, 0, 255)", 2500, $colorToTransparent, 0 , 0, false); $imgick->transparentPaintImage("rgb(255,0,255)", 0, 100, false); $imgick->cropImage($aTaille['width'], $aTaille['height'], 10, 10); $imgick->setImageFormat('png'); # set header type as PNG image header('Content-Type: image/png'); # output the new image echo $im->getImageBlob();Puedes probar el comando exec. Funcionó para mí. Puede consultar este enlace,
<?php $rand_new = rand(); $target_dir = 'yourFolder/'; $imageName = 'yourImage'; $image = $target_dir.$imageName; $imageFileType = strtolower(pathinfo($image,PATHINFO_EXTENSION)); $new_image = time().".png"; exec("convert $image -fill none -fuzz 10% -draw 'matte 0,0 floodfill' -flop -draw 'matte 0,0 floodfill' -flop $new_image"); ?>