Pregunta

Tengo un problema con ImageCopyResampled para buffers que usan valores alfa. Aparentemente, el algoritmo premultablies los valores alfa de Pixels antes del filtrado, esto resulta en los bordes negros de los objetos alrededor.

Pasos para reproducir:

  • ¡Toma una imagen que sea completamente blanca en la parte de RGB y que tiene un (antialiased!) Círculo blanco (¡vaya con un círculo, no con un cuadrado!) Sobre fondo negro en la parte alfa (por lo que la La parte alfa tendrá en su mayoría píxeles totalmente blancos y totalmente negros, así como algunos píxeles de degradado en los bordes del círculo debido a la antialiasing, esto significa que la imagen de entrada no está premultatiada, es recta / no se ha hecho, porque la parte RGB de la imagen es completamente blanco).

  • escalado la imagen mediante la mitad usando imagecopyresampled

  • componer el resultado sobre una imagen completamente blanca

    lo que espero: Imagen completamente blanca

    lo que recibo: una frontera grisácea alrededor del contorno del círculo

    Estoy bastante seguro de que esto se debe al alfa premultipliado dentro del algoritmo escalado (el algoritmo multiplica el valor alfa de los píxeles con su valor RGB para calcular el nuevo valor RGB, por lo tanto, los píxeles blancos se volverán gris)

    ¿Alguien sabe un trabajo para esto?

¿Fue útil?

Solución

Sugeriría probar imagen Magick para PHP.

http://www.php.net/manual/en/imagick.resizeimage.php

http://www.php.net/manual/en/imagick.ScaleImage.php

En mi experiencia, todas las molestias relativas a las imágenes en PHP, simplemente desaparecen.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top