Come si converte un’immagine in bianco e nero in PHP

Come si fa a convertire un’immagine in bianco e nero in PHP?

Non basta trasformarlo in scala di grigi ma ogni pixel diventa bianco o nero?

Basta arrotondare il colore della scala di grigi a nero o bianco.

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

Usando la libreria php gd :

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

Controlla i commenti degli utenti nel link sopra per ulteriori esempi.

Potresti sborsare a imagemagick, supponendo che il tuo host lo supporti. Quale funzione vuoi utilizzare 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 dice @jonni , 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 come $ grigio = $ rosso * 0,299 + $ verde * 0,587 + $ blu * 0,114; (questi sono fattori di ponderazione NTSC, esistono altre ponderazioni simili, che riproducono la diversa reattività dell’occhio a diversi colors).

Poi devi decidere un valore di cut-off – generalmente la metà del valore massimo del pixel, ma a seconda dell’immagine potresti preferire un valore più alto (rendere l’immagine più scura) o più bassa (rendere l’immagine più luminosa).

Il semplice confronto di ciascun pixel con il cut-off perde molti dettagli, ad esempio le ampie aree scure diventano completamente nere, quindi per conservare più informazioni è ansible eseguire il dithering. Fondamentalmente, inizia in alto a sinistra dell’immagine: per ogni pixel aggiungi l’errore (la differenza tra il valore originale e il valore finale assegnato) per i pixel a sinistra e sopra prima di comparare al valore di cut-off.

Siate consapevoli che fare questo in PHP sarà molto lento – sarete molto più avanti a trovare una libreria che fornisca questo.