Я работаю над сервисом, который может делать преобразования из файлов GIF в MP4 (с ffmpeg
).
Моя проблема в том, что некоторые из картинок имеют видимый прозрачные области, которые становятся белым цветом, когда я конвертирую их в видео mp4.
Чтобы избежать этой проблемы, я пытаюсь определить, видимый прозрачные области, поэтому я не буду конвертировать их в mp4.
Я пытался использовать getImageAlphaChannel()
функция от Imagick.
if ($imagick->getImageAlphaChannel()) {
echo 'transparent image';
} else {
echo 'not transparent image';
}
Эта функция работает правильно, отчеты прозрачны для изображений, как показано ниже; который имеет очевидные видимые прозрачные области.
Но он также показывает прозрачность для изображений, как показано ниже;
Этот результат, вероятно, правильный для imagick, возможно, изображения выше прозрачны, но, на мой взгляд, нет видимый прозрачные участки.
У меня вопрос, как я могу правильно определить, если GIF-файл, который имеет видимый прозрачные участки или это вообще возможно с помощью imagick или любого другого инструмента?
Вы можете использовать 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;
Других решений пока нет …