Pergunta

Como se converter uma imagem em preto e branco em PHP?

Não apenas transformando -o em escala de cinza, mas todos os pixels eram pretos ou brancos?

Foi útil?

Solução

Basta arredondar a cor da escala de cinza para preto ou branco.

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

Outras dicas

Usando o PHP GD biblioteca:

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

Verifique os comentários do usuário no link acima para obter mais exemplos.

Você pode desembolsar a ImageMagick, assumindo que seu host a apoie. Que função você deseja usar para decidir se um pixel deve ser preto ou branco?

Se você pretende fazer isso sozinho, precisará implementar um Algoritmo de Dithering. Mas como @jonni Diz, usar uma ferramenta existente seria muito mais 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 função funciona como um charme

    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 pixel, você deve converter da cor em escala de cinza - algo como $ cinza = $ vermelho * 0,299 + $ verde * 0,587 + $ azul * 0,114; (Esses são fatores de ponderação do NTSC; outros ponderações semelhantes existem. Isso imita a resposta variável do olho a cores diferentes).

Em seguida, você precisa decidir sobre um valor de corte - geralmente metade do valor máximo de pixels, mas, dependendo da imagem, você pode preferir um valor mais alto (torne a imagem mais escura) ou menor (torne a imagem mais brilhante).

Basta comparar cada pixel com o ponto de corte perde muitos detalhes - ou seja, grandes áreas escuras ficam completamente pretas - para manter mais informações, você pode fazer. Basicamente, comece no canto superior esquerdo da imagem: para cada pixel, adicione o erro (a diferença entre o valor original e o valor final atribuído) para os pixels à esquerda e acima antes de comparar com o valor de corte.

Esteja ciente de que fazer isso no PHP será muito lento - você estaria muito à frente para encontrar uma biblioteca que forneça isso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top