Skip to content

PHP GD crop image into circle

Задача: на лету обрезать изображение, чтобы оно было в кружочке.

Стандартная библиотека, идущая в комплекте с цмс-кой, обрезала. Но делала это не совсем кошерно. Обрезанную часть заполнян белый цвет. А нужно чтобы там была прозрачность.

Весь день ипался над прозрачным фоном, в конце вспомнил что у формата jpeg нет и не может быть альфа-канала блеать. Нужно для начала в png сконвертировать штоле =)

UPD: После мучений, когда уже немного начал понимать как работать с gd, в интернетах был найден способ взять изображение, засунуть его в круг и сделать обрезанные края прозрачными.

UPD2: Добавлено сглаживание изображения. Сглаживание достигается масштабированием.

Вот она, рыба моей мечты:

function img_circle($file_name = false, $param = 20){
$err = true;
$image = imagecreatefromjpeg($file_name);

$inCore = cmsCore::getInstance();
$cfg = $inCore->loadComponentConfig('users');
$width=$cfg['medw'];
$height=$cfg['medh'];

if($image){
$err = false;
}
if(!$err){

$x=$width ;
$y=$height;
$img2 = imagecreatetruecolor($x, $y);
$bg = imagecolorallocate($img2, 255, 255, 255);
imagefill($img2, 0, 0, $bg);
$e = imagecolorallocate($img2, 0, 0, 0);
$r = $x <= $y ? $x : $y;

imagefilledellipse($img2, ($x/2), ($y/2), $r, $r, $e);
imagecolortransparent($img2, $e);
imagecopymerge($image, $img2, 0, 0, 0, 0, $x, $y, 100);

imagecolortransparent($image, $bg);

$W=$cfg['medw'];
$H=$cfg['medh'];

// Исходный код построения карты России пропущен.
// Смотрите урок №8

$img3=imagecreatetruecolor($W/2,$H/2);
imagecolortransparent($img3, $bg);

imagecopyresampled($img3,$image,0,0,0,0,$W/2,$H/2,$W,$H);

header("Content-type: image/png");
imagepng($img3, $file_name);
imagedestroy($img2);
imagedestroy($img3);
imagedestroy($image);
}}

 

Leave a Reply

Your email address will not be published. Required fields are marked *

π