Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
vp-webdev
6 лет назад

Работа с изображением средствами PHP. Получение цвета пикселя

Предисловие

В своё время появилась функция в Яндекс.Браузер: вкладки красились в цвет favicon.
Imgur

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

Хочу отметить, что Вам понадобятся установить библиотеку функций изображений GD.

Реализация

Допустим, что надо получить количество белых пикселей на загружаемых фото.

Делать будем в одном скрипте и вывод формы, и саму реализацию.

<form action="/" enctype="multipart/form-data" method="post">
        <input type="file" name="foto" />
        <input type="submit" name="submit" />
</form>

Думаю всё понятно. Форма самая обычная, не забываем про параметр
enctype="multipart/form-data" - он необходим для отправки файла.

Укажем список mime типов. Я их просто скопировал в массив.

$mime = [
    'image/png',
    'image/jpeg',
    'image/jpg',
    'image/gif',
    'image/bmp',
    'image/vnd.microsoft.icon',
    'image/tiff',
    'image/tiff',
    'image/svg+xml',
    'image/svg+xml',
];

Далее проверим, была ли отправлена форма с данными.

if($_POST['submit'])
{
  ...
}

Внутри условия реализуем код.
Для начала объявим начальное количество белых пикселей, их 0:
$sum = 0;

Объявим имя файла. Присвоим временное имя файла tmp_name.

$name = $_FILES['foto']['tmp_name'];

Получим mime и размеры файла. С помощью getimagesize

$sizes = getimagesize($name);

Проверяем есть ли в массиве $mime значение mime нашего файла.

if(in_array($sizes['mime'], $mime)){

}

Если всё хорошо с mime, то получим тип файла.

Первым делом из mime получаем тип расширения файла.
Сегодня мы будем работать с png или jpeg.

Далее, в зависимости от типа, создаём изображение из загружаемого.

$type = explode('/', $sizes['mime']);
if($type[1] == 'png')
{
  $photo = imagecreatefrompng($name);
}elseif($type[1] == 'jpeg')
{
  $photo = imagecreatefromjpeg($name);
}

Затем проходим циклом каждый пиксель по ширине и высоте.

Выше мы получали параметры фото, из них получим ширину - индекс 0, и высоту - индекс 1.

 for($w = 0; $w <= $sizes[0]; $w++)
{
   for($h=0; $h <= $sizes[1]; $h++)
  {

  }
}
 $color = imagecolorat($photo, $w, $h);
// получаем цвета
$arr_col = imagecolorsforindex($photo, $color);

if($arr_col['red'] == 255 and $arr_col['green'] == 255 and $arr_col['blue'] == 255)
{
    $sum = $sum + 1;
}

Получаем индекс пикселя. Через функцию imagecolorat

С помощью imagecolorsforindex получаем ассоциативный массив с ключами red(красный), green(зелёный) и blue(синий).

Если все три значения равны 225, то плюсуем к переменной $sum.

$color = imagecolorat($photo, $w, $h);
// получаем цвета
$arr_col = imagecolorsforindex($photo, $color);

if($arr_col['red'] == 255 and $arr_col['green'] == 255 and $arr_col['blue'] == 255)
{
    $sum = $sum + 1;
}

Заключение

Вот так, просто мы получим количество белых пикселей. С помощью двух основных функций imagecolorat и imagecolorsforindex. Как именно реализовать это решение каждого. Дерзайте!!)) Создавайте великое)))

Листинг

Материал подготовлен автором @zheev

6
12.740 GOLOS
На Golos с August 2017
Комментарии (2)
Сортировать по:
Сначала старые