Como você converte uma imagem em preto e branco em php
-
05-07-2019 - |
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?
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.