PHP Imagick или любой другой инструмент, как определить, есть ли видимая прозрачность в файлах GIF - PullRequest
0 голосов
/ 12 сентября 2018

Я работаю над службой, которая может выполнять преобразования из файлов gif в mp4 (с ffmpeg).

Моя проблема заключается в том, что некоторые из картинок имеют видимых прозрачных областей, которые заканчиваютсякак белый цвет, когда я конвертирую их в MP4 видео.Чтобы избежать этой проблемы, я пытаюсь определить, есть ли у gif видимые прозрачные области, поэтому я не буду преобразовывать их в mp4.

Я пытался использовать функцию getImageAlphaChannel() из imagick.

   if ($imagick->getImageAlphaChannel()) {
      echo 'transparent image';
   } else {
      echo 'not transparent image';   
   }

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

transparent gif 1

Но он также отображает прозрачность для изображений, как показано ниже;

false transparent gif 1

false transparent gif 2

Этот результат, вероятно, правильный для imagick, возможно, изображения выше прозрачные, но, на мой взгляд, не видно прозрачных областей.

Мой вопрос: как мне правильно определить, если gif-файл имеет видимые прозрачные области или это возможно даже с помощью imagick или любого другого инструмента?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете использовать Imagick::getImageChannelRange для оценки мин / макс значений, используемых конкретным цветным каналом.

$alphaRange = $imagick->getImageChannelRange(Imagick::CHANNEL_ALPHA);

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

$hasTransparency = $alphaRange['minima'] < $alphaRange['maxima'];
  • Если канал определен и имеет какие-либо прозрачные области в любом кадре, то maxima всегда будет больше minima.

  • Если канал НЕ определен, то minima будет Inf заполнителем, а maxima будет -Inf заполнителем, поэтому вышеуказанная проверка будет работать.

  • Если у всего изображения есть постоянное альфа-значение (т. Е. Полная прозрачность или отсутствие изменений данных), это решение не будет работать.Резервная проверка может быть чем-то вроде ... minima == maxima AND minima > 0

Еще одним большим преимуществом оценки диапазонов является то, что вы можете проверить расстояние между двумя минимальными / максимальными значениями по отношению к порогу, поэтому«небольшая полупрозрачность» может быть идентифицирована и изолирована.

$threshold = $imagick->getQuantum() * 0.1; // < 10% is okay.
$hasTransparency = $alphaRange['minima'] < $alphaRange['maxima']
                 && ($alphaRange['maxima'] - $alphaRange['minima']) < $threshold;
...