在 PHP 中将学生头像(PNG)叠加到校园卡模板(PNG)上时,结果图像中头像区域显示为黑色或灰黑色——这大概是很多人踩过的坑。问题根源其实不在代码逻辑本身,而是出在源图尺寸没有精确传入 imagecopy() 函数。当指定的复制宽高(第7、8参数)超出实际图像尺寸,或者与原始 PNG 的 Alpha 通道不匹配时,GD 库会用默认黑色填充缺失区域,透明背景自然就被覆盖了。
那正确的做法是什么?始终通过 getimagesize() 动态获取头像的实际宽高,并确保目标图像(卡片)已启用 Alpha 混合与保存支持。下面这份代码可以直接拿去用:
';?>
⚠️ 有几个地方必须强调:
imagealphablending($card, false)和imagesa vealpha($card, true)这两行缺一不可,否则 PNG 的透明区域会被渲染成黑色;- 千万别硬编码宽高(比如写死成 1180、700),一定要用
getimagesize()获取实际像素尺寸; - 确保两张 PNG 都是真彩色(TrueColor)格式,可以借助 Photoshop 或在线工具检查,导出时选“PNG-24 with alpha”;
- 如果头像需要缩放,改用
imagecopyresampled()并同步调整目标尺寸参数,同时保留imagealphablending和imagesa vealpha的设置。
最终生成的 output.png 会完整保留头像的透明边缘,与卡片背景自然融合,黑色失真问题彻底消失。