使用PHP vips生成SVG缩略图丢失透明度问题如何解决?
问题原因
你当前代码的逻辑是只要检测到图片存在alpha透明通道,就统一执行flatten操作把透明层压成白色背景,这会直接抹掉SVG原本的透明效果。而你原本加flatten逻辑是为了兼容不支持透明的JPG/JPEG格式,只要把这个操作的触发范围限制在JPG/JPEG格式下即可。
修复方案
- 先判断源文件格式,仅对JPG/JPEG格式的图片做透明层扁平化处理,SVG、PNG这类本身支持透明的格式跳过该步骤
- 输出缩略图时选择支持透明的存储格式(如PNG、WEBP),不要输出为JPG格式
修正后代码
// 先获取源文件后缀 $ext = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); $im = Vips\Image::thumbnail($filename, 180, ['height' => 225, 'size' => 'both']); // 仅JPG/JPEG格式需要压平透明层加白色背景 if (in_array($ext, ['jpg', 'jpeg']) && $im->hasAlpha()) { $im = $im->flatten(['background' => [255, 255, 255]]); } // 要保留透明的话,存储为支持alpha的格式,例: $im->writeToFile($output_thumb_path . 'xxx.png');
补充说明
如果业务有兼容需求,需要同时输出支持透明和不支持透明的两份缩略图,单独给SVG生成的缩略图走PNG输出逻辑即可,不用统一做压平处理。
内容的提问来源于stack exchange,提问作者Vinay Kapoor
相关产品推荐
相关产品推荐

