Pregunta

¿Cómo se puede convertir una imagen a blanco y negro en PHP?

¿No solo se convierte en escala de grises, sino en cada píxel hecho en blanco o negro?

¿Fue útil?

Solución

Simplemente redondee el color de la escala de grises a negro o blanco.

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;

Otros consejos

Utilizando la php gd library:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);

Revisa los comentarios de los usuarios en el enlace de arriba para ver más ejemplos.

Podrías pagar por imagemagick, asumiendo que tu host lo admita. ¿Qué función desea utilizar para decidir si un píxel debe ser blanco o negro?

Si pretende hacer esto usted mismo, deberá implementar un algoritmo de dithering . Pero como @jonni dice, usar una herramienta existente sería mucho más fácil?

$rgb = imagecolorat($original, $x, $y);
        $r = ($rgb >> 16) & 0xFF;
        $g = ($rgb >> 8 ) & 0xFF;
        $b = $rgb & 0xFF;

        $gray = $r + $g + $b/3;
        if ($gray >0xFF) {$grey = 0xFFFFFF;}
        else { $grey=0x000000;}

Esta función funciona como un encanto

    public function ImageToBlackAndWhite($im) {

    for ($x = imagesx($im); $x--;) {
        for ($y = imagesy($im); $y--;) {
            $rgb = imagecolorat($im, $x, $y);
            $r = ($rgb >> 16) & 0xFF;
            $g = ($rgb >> 8 ) & 0xFF;
            $b = $rgb & 0xFF;
            $gray = ($r + $g + $b) / 3;
            if ($gray < 0xFF) {

                imagesetpixel($im, $x, $y, 0xFFFFFF);
            }else
                imagesetpixel($im, $x, $y, 0x000000);
        }
    }

    imagefilter($im, IMG_FILTER_NEGATE);

}

Para cada píxel debe convertir de color a escala de grises, algo así como $ gris = $ rojo * 0.299 + $ verde * 0.587 + $ azul * 0.114; (Estos son factores de ponderación NTSC; existen otras ponderaciones similares. Esto imita la capacidad de respuesta variable del ojo a diferentes colores).

Luego debe decidir un valor de corte, generalmente la mitad del valor máximo de píxeles, pero dependiendo de la imagen, puede preferir un valor más alto (hacer que la imagen sea más oscura) o más bajo (hacer que la imagen sea más brillante).

La simple comparación de cada píxel con el recorte pierde muchos detalles, es decir, las grandes áreas oscuras se vuelven completamente negras, por lo que, para retener más información, puede vacilar. Básicamente, comience en la parte superior izquierda de la imagen: para cada píxel agregue el error (la diferencia entre el valor original y el valor final asignado) para los píxeles a la izquierda y arriba antes de compararlos con el valor de corte.

Tenga en cuenta que hacer esto en PHP será muy lento. Estaría mucho más adelante para encontrar una biblioteca que proporcione esto.

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