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

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

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

Ответ 1

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

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;

Ответ 2

Использование библиотеки php gd:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, -100);

Подробнее см. комментарии пользователей в приведенной выше ссылке.

Ответ 3

Вы можете обмануть изображение imagemagick, предполагая, что ваш хост поддерживает его. Какую функцию вы хотите использовать для определения того, должен ли пиксель быть черным или белым?

Ответ 4

Если вы намереваетесь сделать это самостоятельно, вам нужно будет реализовать алгоритм @jonni говорит, что использование существующего инструмента было бы намного проще?

Ответ 5

$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;}

Ответ 6

Эта функция работает как шарм

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

}

Ответ 7

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

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

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

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

Ответ 8

Использование библиотеки php gd:

imagefilter($im, IMG_FILTER_GRAYSCALE);
imagefilter($im, IMG_FILTER_CONTRAST, 1000);