当前位置: 首页> 最新文章列表> 使用 imagerotate 旋转透明 PNG 图像时如何保持透明度

使用 imagerotate 旋转透明 PNG 图像时如何保持透明度

gitbox 2025-09-18

1. 使用 imagerotate() 旋转 PNG 图像

首先,加载一个 PNG 图像并尝试使用 imagerotate() 进行旋转。正常情况下,如果没有额外的处理,透明区域会变成黑色:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 加载 PNG 图像</span></span><span>
</span><span><span class="hljs-variable">$imagePath</span></span><span> = </span><span><span class="hljs-string">'image.png'</span></span><span>;
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefrompng</span></span><span>(</span><span><span class="hljs-variable">$imagePath</span></span><span>);

</span><span><span class="hljs-comment">// 设置 PNG 图像为透明背景</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagealphablending</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagesavealpha</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);

</span><span><span class="hljs-comment">// 旋转图像,角度为 90 度</span></span><span>
</span><span><span class="hljs-variable">$rotatedImage</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagerotate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">90</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// 输出旋转后的图像</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$rotatedImage</span></span><span>);

</span><span><span class="hljs-comment">// 销毁图像资源</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$rotatedImage</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

上面的代码将一个 PNG 图像加载并旋转,但注意 imagerotate() 的第三个参数(即填充颜色)为 0,这意味着黑色将填充透明部分。

2. 防止黑色背景的出现

要保持透明度,关键在于告诉 PHP 保持 PNG 图像的透明度。在 imagerotate() 函数之前,需要确保禁用图像的混合模式,并启用 alpha 通道的保存:

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 加载 PNG 图像</span></span><span>
</span><span><span class="hljs-variable">$imagePath</span></span><span> = </span><span><span class="hljs-string">'image.png'</span></span><span>;
</span><span><span class="hljs-variable">$image</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagecreatefrompng</span></span><span>(</span><span><span class="hljs-variable">$imagePath</span></span><span>);

</span><span><span class="hljs-comment">// 设置 PNG 图像为透明背景</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagealphablending</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);  </span><span><span class="hljs-comment">// 禁用 alpha 混合</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagesavealpha</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);  </span><span><span class="hljs-comment">// 保存 alpha 通道</span></span><span>

</span><span><span class="hljs-comment">// 旋转图像,角度为 90 度</span></span><span>
</span><span><span class="hljs-variable">$rotatedImage</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagerotate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">90</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);

</span><span><span class="hljs-comment">// 输出旋转后的图像</span></span><span>
</span><span><span class="hljs-title function_ invoke__">header</span></span><span>(</span><span><span class="hljs-string">'Content-Type: image/png'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$rotatedImage</span></span><span>);

</span><span><span class="hljs-comment">// 销毁图像资源</span></span><span>
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">imagedestroy</span></span><span>(</span><span><span class="hljs-variable">$rotatedImage</span></span><span>);
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. 为什么要使用 imagealphablending()imagesavealpha()

  • imagealphablending($image, false); 禁用了 alpha 通道的混合模式,确保在操作过程中不会把透明区域与任何其他颜色进行混合。

  • imagesavealpha($image, true); 启用了对 alpha 通道(透明度信息)的保存,这样透明区域就不会被其他颜色填充,旋转后的图像仍会保持透明背景。

4. 填充透明背景

如果你希望在旋转图像时填充透明区域以外的颜色,而不仅仅是保持透明,可以在 imagerotate() 中设置其他填充颜色。例如,设置填充为白色:

<span><span><span class="hljs-variable">$rotatedImage</span></span><span> = </span><span><span class="hljs-title function_ invoke__">imagerotate</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">90</span></span><span>, </span><span><span class="hljs-title function_ invoke__">imagecolorallocatealpha</span></span><span>(</span><span><span class="hljs-variable">$image</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">255</span></span><span>, </span><span><span class="hljs-number">127</span></span><span>));
</span></span>

这会将透明区域填充为白色,而不是黑色。

5. 输出和保存图像

在输出旋转后的图像时,记得使用 imagepng() 函数,因为它能处理 PNG 图像的透明部分。你还可以将图像保存到文件中:

<span><span><span class="hljs-title function_ invoke__">imagepng</span></span><span>(</span><span><span class="hljs-variable">$rotatedImage</span></span><span>, </span><span><span class="hljs-string">'rotated_image.png'</span></span><span>);
</span></span>