Как можно сделать преобразование изображения в черно-белое в PHP?
Не просто превратить его в оттенки серого, но каждый пиксель сделал черным или белым?
Просто округлите цвет в оттенках серого до черного или белого.
float gray = (r + g + b) / 3 if(gray > 0x7F) return 0xFF; return 0x00;
Использование библиотеки php gd :
imagefilter($im, IMG_FILTER_GRAYSCALE); imagefilter($im, IMG_FILTER_CONTRAST, -100);
Для получения дополнительных примеров просмотрите комментарии пользователей по ссылке выше.
Вы можете выложить изображение в воображении, предполагая, что ваш хост поддерживает его. Какую функцию вы хотите использовать для определения того, должен ли пиксель быть черным или белым?
Если вы намереваетесь сделать это самостоятельно, вам нужно будет реализовать алгоритм сглаживания . Но, как говорит @jonni , использование существующего инструмента было бы намного проще?
$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;}
Эта функция работает как шарм
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); }
Для каждого пикселя вы должны преобразовать из цвета в оттенки серого – что-то вроде $ grey = $ red * 0.299 + $ green * 0.587 + $ blue * 0.114; (это коэффициенты взвешивания NTSC, другие подобные весовые коэффициенты существуют, что имитирует изменяющуюся чувствительность глаз к разным цветам).
Затем вам нужно определить значение отсечки – как правило, половину максимального значения пикселя, но в зависимости от изображения вы можете предпочесть более высокое значение (сделать изображение темнее) или ниже (сделать изображение ярче).
Простое сравнение каждого пикселя с отсечкой теряет много деталей, т. Е. Большие темные области идут полностью черными, поэтому чтобы сохранить дополнительную информацию, вы можете сгладить. В основном, начните в левом верхнем углу изображения: для каждого пикселя добавьте ошибку (разницу между исходным значением и конечным назначенным значением) для пикселей слева и выше, прежде чем сравнивать с значением отсечки.
Имейте в виду, что выполнение этого в PHP будет очень медленным – вы будете намного дальше, чтобы найти библиотеку, которая предоставляет это.
Использование библиотеки php gd:
imagefilter($im, IMG_FILTER_GRAYSCALE); imagefilter($im, IMG_FILTER_CONTRAST, 1000);