在介紹實現方法之前,先了解兩個關鍵函數:
imageellipse(resource $image, int $cx, int $cy, int $width, int $height, int $color) :在圖像中繪製一個橢圓。
imageantialias(resource $image, bool $enabled) :開啟或關閉抗鋸齒功能。
但需要注意的是, imageantialias()僅對使用如imageline() 、 imagerectangle()等函數繪製的圖形起作用,對imageellipse()並不生效。這是許多開發者容易忽略的一個坑。
我們需要換一種策略,使用更高分辨率繪製圖形後縮小圖像,或者手動模擬抗鋸齒效果。下面介紹一種通用的做法:使用高分辨率繪製+縮放,這是在不借助額外圖形庫的情況下實現抗鋸齒效果的一個簡單方法。
<?php
// 設置縮放倍數,例如3倍分辨率繪製
$scale = 3;
$width = 200;
$height = 200;
$scaledWidth = $width * $scale;
$scaledHeight = $height * $scale;
// 創建大圖像資源
$largeImage = imagecreatetruecolor($scaledWidth, $scaledHeight);
imageantialias($largeImage, true);
// 設置背景色為白色並填充
$white = imagecolorallocate($largeImage, 255, 255, 255);
imagefill($largeImage, 0, 0, $white);
// 設置圓形顏色
$circleColor = imagecolorallocate($largeImage, 0, 0, 255);
// 繪製橢圓(其實是圓)
$cx = $scaledWidth / 2;
$cy = $scaledHeight / 2;
$radius = min($scaledWidth, $scaledHeight) * 0.4;
imageellipse($largeImage, $cx, $cy, $radius * 2, $radius * 2, $circleColor);
// 創建目標小圖像資源
$finalImage = imagecreatetruecolor($width, $height);
// 縮小圖像以達到抗鋸齒效果
imagecopyresampled($finalImage, $largeImage, 0, 0, 0, 0, $width, $height, $scaledWidth, $scaledHeight);
// 輸出圖像
header('Content-Type: image/png');
imagepng($finalImage);
// 清理內存
imagedestroy($largeImage);
imagedestroy($finalImage);
?>
在這個例子中,我們先使用原始尺寸的3 倍繪製一個更大的圓形,然後使用imagecopyresampled()函數將圖像縮小至目標尺寸。這個過程等效於模擬抗鋸齒處理,輸出的圖像邊緣會顯得更平滑。
雖然imageantialias()對imageellipse()無效,但通過縮放策略我們仍然可以繞過這個限制,生成質量更高的圖像。如果你對圖像處理要求較高,考慮使用如ImageMagick 這樣的專業圖像處理庫會更為合適。
如果你希望將圖像保存至服務器而不是輸出瀏覽器,可以用如下方式:
imagepng($finalImage, '/path/to/save/image.png');
或者生成一個訪問鏈接:
$filename = 'https://m66.net/images/circle.png';
imagepng($finalImage, '/var/www/m66.net/images/circle.png');
請確保m66.net對應的路徑具有寫入權限。
這種縮放法同樣適用於繪製其他圖形,如多邊形、自由曲線等,是一種在GD 庫中通用的抗鋸齒技巧。