ImageCopyResampled en PHP - Número de alfa premultipliado
-
12-11-2019 - |
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?
Solución
Sugeriría probar imagen Magick para 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.