Как преобразовать изображение в черно-белое в PHP

Как можно преобразовать изображение в черно-белое в PHP?

не просто превращая его в оттенки серого, но каждый пиксель сделал черный или белый?

7 ответов


просто округлите цвет оттенков серого до черного или белого.

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);

}

для каждого пикселя необходимо преобразовать цвет в оттенки серого - что-то вроде $ grey = $red * 0.299 + $green * 0.587 + $ blue * 0.114; (это весовые коэффициенты NTSC; существуют и другие аналогичные весовые коэффициенты. Это имитирует различную реакцию глаза на различные цвета).

затем вам нужно выбрать значение отсечки-обычно половину максимального значения пикселя, но в зависимости от изображения вы можете предпочесть более высокое значение (сделать изображение темнее) или ниже (сделать изображение ярче.)

просто сравнивая каждый пиксель с отсечкой теряет много деталей-т. е. большие темные области становятся полностью черными - поэтому, чтобы сохранить больше информации, вы можете дрожать. В принципе, начните с верхнего левого края изображения: для каждого пикселя добавьте ошибку (разницу между исходным значением и конечным назначенным значением) для пикселей слева и выше, прежде чем сравнивать со значением отсечки.

имейте в виду, что делать это в PHP будет очень медленно - вы будете намного дальше вперед, чтобы найти библиотеку, которая предоставляет это.