Обнаружение пустых изображений с помощью php? - PullRequest
7 голосов
/ 06 мая 2011

Как бы я мог обнаружить, что изображение пустое (только одного, произвольного цвета или, с gif, кадров случайных произвольных цветов), используя PHP и / или imagemagick?

Я думаю, это то, что я собираюсь попробовать: http://www.php.net/manual/en/function.imagecolorat.php#97957

Ответы [ 4 ]

2 голосов
/ 06 августа 2014

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

вероятность нахождения непустого пикселя = 1 - e ^ (- n * p)

где n - количество выборок, а p - процент пикселей, которые, как ожидается, будут непустыми. Решите для n, чтобы получить соответствующее количество образцов, чтобы попробовать:

n = -log (1 - x) / p

где x - желаемая вероятность, а log - натуральный логарифм. Например, если вы уверены, что 0,1% изображения должно быть непустым, и вы хотите с вероятностью 99,99% найти хотя бы один непустой пиксель,

n = -log (1-.9999) /. 001 = 9210 необходимых образцов.

Гораздо быстрее, чем проверка каждого пикселя. Чтобы быть на 100% уверенным, вы всегда можете вернуться и проверить их все, если выборка не обнаружит их.

2 голосов
/ 06 мая 2011

http://www.php.net/manual/en/function.imagecolorstotal.php дает количество цветов в изображении.Хм, в моей демонстрации это не работает, извините :( созданное мной изображение (полностью красное, 20x20 пикселей) дает 0 цветов для PNG и 3 цвета для GIF.на 2-й кусок кода. Протестировано здесь: http://www.pendemo.nl/totalcolors.php

1 голос
/ 06 августа 2014

Вы можете проверить изображение внутри PHP, используя imagecolorat (это может быть медленно, но работает):

function isPngValidButBlank($filename) {
  $img = imagecreatefrompng($filename);
  if(!$img)
    return false;
  $width = imagesx($img);
  $height = imagesy($img);
  if(!$width || !$height)
    return false;
  $firstcolor = imagecolorat($img, 0, 0);
  for($i = 0; $i < $width; $i++) { 
    for($j = 0; $j < $height; $j++) {
      $color = imagecolorat($img, $i, $j);
      if($color != $firstcolor)
        return false;
    }
  }
  return true;
}
0 голосов
/ 06 мая 2011

Получите стандартное отклонение от подробной статистики для каждой плитки. Если стандартное отклонение равно 0, то изображение имеет один цвет.

Предположительно, «количество цветов» также сделает это; будет 1.

Используйте параметр -format: http://www.imagemagick.org/script/escape.php

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