Как конвертировать изображение в черно-белое в PHP - PullRequest
12 голосов
/ 31 октября 2008

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

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

Ответы [ 7 ]

20 голосов
/ 31 октября 2008

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

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

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

10 голосов
/ 31 октября 2008

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

float gray = (r + g + b) / 3
if(gray > 0x7F) return 0xFF;
return 0x00;
6 голосов
/ 31 октября 2008

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

2 голосов
/ 31 октября 2008

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

1 голос
/ 12 января 2013

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

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

}
1 голос
/ 25 апреля 2012
$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;}
0 голосов
/ 01 ноября 2008

Для каждого пикселя вы должны преобразовать цвет в оттенки серого - что-то вроде $ серый = $ красный * 0,299 + $ зеленый * 0,587 + $ синий * 0,114; (это весовые коэффициенты NTSC; существуют другие подобные весовые коэффициенты. Это имитирует различную чувствительность глаза к разным цветам).

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

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

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

...