我正在开发一个可以从gif到mp4文件转换的服务(使用ffmpeg
)。
我的问题是一些GIF具有可见的透明区域,当我将它们转换为mp4视频时最终变成白色。为了避免这个问题,我试图检测一个gif是否有可见的透明区域,所以我会避免将它们转换为mp4。
我尝试使用imagick的getImageAlphaChannel()
函数。
if ($imagick->getImageAlphaChannel()) {
echo 'transparent image';
} else {
echo 'not transparent image';
}
此功能正常工作报告透明的图像如下;它有明显可见的透明区域。
但它也报告透明下面的图像;
这个结果对于想象力可能是正确的,可能上面的图像是透明的,但根据我的眼睛,没有可见的透明区域。
我的问题是,如果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;