PHP imagick或任何其他工具,如何检测gifs文件是否有可见的透明度

问题描述 投票:1回答:1

我正在开发一个可以从gif到mp4文件转换的服务(使用ffmpeg)。

我的问题是一些GIF具有可见的透明区域,当我将它们转换为mp4视频时最终变成白色。为了避免这个问题,我试图检测一个gif是否有可见的透明区域,所以我会避免将它们转换为mp4。

我尝试使用imagick的getImageAlphaChannel()函数。

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

此功能正常工作报告透明的图像如下;它有明显可见的透明区域。

但它也报告透明下面的图像;

这个结果对于想象力可能是正确的,可能上面的图像是透明的,但根据我的眼睛,没有可见的透明区域。

我的问题是,如果gif文件具有可见的透明区域,或者甚至可以使用imagick或任何其他工具,我如何才能正确识别?

php transparency gif imagick animated-gif
1个回答
0
投票

您可以使用Imagick::getImageChannelRange来评估特定颜色通道使用的值的最小值/最大值。

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

然后,您可以检查是否有任何透明度...

$hasTransparency = $alphaRange['minima'] < $alphaRange['maxima'];
  • 如果定义了通道,并且在任何帧上都有任何透明区域,那么maxima将始终大于minima
  • 如果未定义通道,则minima将为Inf占位符,maxima将为-Inf占位符,因此上述检查仍然有效。
  • 如果整个图像具有一致的alpha值(即完全透明,或没有数据变化),则此解决方案将不起作用。后退检查可能是... minima == maxima AND minima > 0

评估范围的另一个好处是,您可以检查两个最小值/最大值与阈值之间的距离,因此可以识别和隔离“小半透明度”。

$threshold = $imagick->getQuantum() * 0.1; // < 10% is okay.
$hasTransparency = $alphaRange['minima'] < $alphaRange['maxima']
                 && ($alphaRange['maxima'] - $alphaRange['minima']) < $threshold;
© www.soinside.com 2019 - 2024. All rights reserved.