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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top