Come si converte un'immagine in bianco e nero in PHP
-
05-07-2019 - |
Domanda
Come si fa a convertire un'immagine in bianco e nero in PHP?
Non solo trasformandolo in scala di grigi ma ogni pixel diventa bianco o nero?
Soluzione
Basta arrotondare il colore della scala di grigi al nero o al bianco.
float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
Altri suggerimenti
Uso della libreria php gd :
imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);
Controlla i commenti degli utenti nel link sopra per altri esempi.
Potresti sborsare a imagemagick, supponendo che il tuo host lo supporti. Quale funzione vuoi usare per decidere se un pixel deve essere bianco o nero?
Se hai intenzione di farlo da solo, dovrai implementare un algoritmo di dithering . Ma come @jonni dice, l'utilizzo di uno strumento esistente sarebbe molto più semplice?
$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;}
Questa funzione funziona come un fascino
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);
}
Per ogni pixel devi convertire da colore a scala di grigi - qualcosa del genere $ grigio = $ rosso * 0,299 + $ verde * 0,587 + $ blu * 0,114; (questi sono fattori di ponderazione NTSC; esistono altri coefficienti di ponderazione simili. Questo imita la reattività variabile dell'occhio a colori diversi).
Quindi devi decidere un valore di cut-off - generalmente metà del valore massimo di pixel, ma a seconda dell'immagine potresti preferire un valore più alto (rendere l'immagine più scura) o inferiore (rendere l'immagine più luminosa).
Il solo confronto di ciascun pixel con il cut-off perde molti dettagli, ovvero le grandi aree scure diventano completamente nere, quindi per conservare più informazioni, puoi dithering. Fondamentalmente, inizia nella parte superiore sinistra dell'immagine: per ogni pixel aggiungi l'errore (la differenza tra il valore originale e il valore assegnato finale) per i pixel a sinistra e sopra prima di confrontare il valore di cut-off.
Sii consapevole del fatto che farlo in PHP sarà molto lento - sarai molto più avanti nel trovare una libreria che fornisca questo.