Comment convertir une image en noir et blanc en PHP
-
05-07-2019 - |
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?
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.