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