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

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

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

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

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

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

прозрачный GIF 1

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

ложный прозрачный GIF 1

ложный прозрачный GIF 2

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

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

1

Решение

Вы можете использовать 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;
0

Другие решения

Других решений пока нет …