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