Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

277
Visualizações
ImageMagick Blanco a fondo transparente mientras se mantiene el objeto blanco

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:

ingrese la descripción de la imagen aquí

Si no paso un valor de fuzz, obtengo un corte adecuado, pero me quedo con bordes desordenados:

ingrese la descripción de la imagen aquí

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.

about 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

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();

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

about 4 years ago · Santiago Trujillo Relatório

0

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();
about 4 years ago · Santiago Trujillo Relatório

0

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"); ?>
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda