Question

Comment convertit-on une image en noir et blanc en PHP?

Non seulement le transformer en niveaux de gris, mais chaque pixel est noir ou blanc?

Était-ce utile?

La solution

Il suffit d’arrondir la couleur en niveaux de gris en noir ou en blanc.

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

Autres conseils

Utilisation de la gd bibliothèque php:

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

Vérifiez les commentaires des utilisateurs dans le lien ci-dessus pour plus d'exemples.

Vous pouvez faire appel à imagemagick, à condition que votre hébergeur le supporte. Quelle fonction voulez-vous utiliser pour décider si un pixel doit être noir ou blanc?

Si vous avez l'intention de le faire vous-même, vous devrez implémenter un algorithme de dithering . Mais comme @jonni dit, utiliser un outil existant serait beaucoup plus facile?

$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;}

Cette fonction fonctionne comme un 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);

}

Pour chaque pixel, vous devez convertir les couleurs en niveaux de gris - quelque chose comme $ grey = $ rouge * 0,299 + $ vert * 0,587 + $ bleu * 0,114; (Ce sont des facteurs de pondération NTSC; d'autres pondérations similaires existent. Cela correspond à la réactivité variable de l'œil à différentes couleurs).

Ensuite, vous devez choisir une valeur seuil - généralement la moitié de la valeur maximale du pixel, mais en fonction de l'image, vous préférerez peut-être une valeur plus élevée (rendre l'image plus sombre) ou plus basse (rendre l'image plus lumineuse).

Le simple fait de comparer chaque pixel à la valeur de coupure perd beaucoup de détails - les grandes zones sombres deviennent complètement noires - vous pouvez donc utiliser un dither pour conserver plus d'informations. Fondamentalement, commencez en haut à gauche de l'image: pour chaque pixel, ajoutez l'erreur (la différence entre la valeur d'origine et la valeur attribuée finale) pour les pixels à gauche et au-dessus avant de comparer à la valeur de coupure.

Sachez que cela va être très lent en PHP - vous seriez beaucoup plus en avance pour trouver une bibliothèque qui fournit cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top