2011-11-15 12 views
9

Estoy tratando de reducir el tamaño de algunas imágenes transparentes en PHP con GD, y cada vez que lo hago, hay un extraño borde negro que se agrega alrededor de él.PHP GD cambio de tamaño de imagen transparente dando borde negro

Antes before

Después enter image description here

Código

<?php 
    $image = imagecreatefromstring(file_get_contents('logo.png')); 
    $width = imagesx($image); 
    $height = imagesy($image); 

    $newWidth = $width - 1; 
    $newHeight = $height - 1; 
    $output = imagecreatetruecolor($newWidth, $newHeight); 
    imagecolortransparent($output, imagecolorallocatealpha($output, 0, 0, 0, 127)); 
    imagealphablending($output, false); 
    imagesavealpha($output, true); 
    imagecopyresampled($output, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height); 

    header('Content-Type: image/png'); 
    imagepng($output); 
?> 

Parece que si cambio el código para las nuevas dimensiones a ser el mismo que el viejo (eliminar - 1), no aparecen bordes negros. Entonces, el cambio de tamaño está causando el problema.

¿Alguien tiene una idea de lo que podría estar mal?

Edición: Me acabo de dar cuenta de que solo ocurre con imagecopyresampled y no con imagecopyresized. Sin embargo, imagecopyresampled da un mejor efecto visual y me gustaría que funcione si es posible.

+0

Parece que el suavizado está utilizando negro para un color mate. – Brad

+0

@Brad de hecho lo hace. Sin embargo, la página de documentación dice que el anti-aliasing está desactivado por defecto, y que solo viene con la versión incluida de GD, que no estoy usando. Tal vez alguna otra función lo está causando, pero no veo ningún otro parámetro por lo que puedo decir ... –

+0

Me acabo de dar cuenta de que solo sucede con ['imagecopyresampled'] (http://php.net/manual/en /function.imagecopyresampled.php) y no ['imagecopyresized'] (http://php.net/manual/en/function.imagecopyresized.php). Sin embargo, 'imagecopyresampled' da un mejor efecto visual y me gustaría hacer que funcione si es posible. –

Respuesta

3

Creo que el problema aquí es su imagen de origen.

Lo que tiene no es un PNG a color real con canal alfa, sino un PNG de color indexado con un color transparente. Esto es evidente si se abre la imagen en Photoshop:

Image as seen in Photoshop

Esta imagen fue creada con anti-aliasing ya (que da el texto amarillo que borde blanco-ish ver aquí), pero cuando se vuelva a tamaño esto, los cálculos de subpíxeles pueden salir un poco de sus fronteras.

Sospecho que si arreglas la imagen, convirtiéndola en RGB completa con un canal alfa, no tendrás este problema.

+0

Gracias por la respuesta. ¿Sabría posiblemente alguna forma de hacerlo funcionar programáticamente o es imposible de hacer? –

+0

Lo mejor que puedes hacer es obtener una buena imagen de origen. Esto fue fácil de arreglar para ti en Photoshop. Envíeme un correo electrónico a [email protected], y le enviaré el archivo actualizado. – Brad

+0

muchas gracias por su ayuda. El problema es que esto lo hacen nuestros clientes en la interfaz web. Supongo que tendrán que conformarse. Gracias de nuevo. –

Cuestiones relacionadas