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

StackOverflow https://stackoverflow.com/questions/254388

  •  05-07-2019
  •  | 
  •  

Вопрос

Как можно преобразовать изображение в черно-белое в 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);

}

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top