當前位置: 首頁> 最新文章列表> 使用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>