(1 май 2016, 06:55) (
3/
0)
[
3]
Для этого необходимо воспользоваться дополнительной картинкой такого же размера. Потому что по углам нужно создать области равномерно залитые одним, прозрачным цветом.
На исходной картинке такое сделать нельзя, потому что заливка возможна только либо при создании примитива (заполненный эллипс или заполненный прямоугольник), либо на области равномерно закрашенной каким-либо одним цветом.
Поэтому последовательность действий у меня следующая:
на временной картинке рисую те части, которые должны стать прозрачными в результате;
накладываю на исходное изображение;
по нужным координатам заполняю прозрачным цветом.
Чтобы прозрачность работала, у исходной картинки необходимо установить соответствующий флаг при помощи функции:
imagesavealpha($img_res, true);
, а вот наличие альфа канала у временного изображения не важно (я использовал true color, потому что в этом случае на один вызов функции imagecolortransparent() меньше).
Решение:
class ImgUtils
{
public static function imageToRes($img_file)
{
$img_res = false;
list($tmp, $tmp, $type) = getimagesize($img_file);
switch ($type)
{
case 2: // JPEG
$img_res = imagecreatefromjpeg($img_file);
break;
case 1: // GIF
$img_res = imagecreatefromgif($img_file);
break;
case 3: // PNG
$img_res = imagecreatefrompng($img_file);
break;
}
return $img_res;
}
public static function roundedCorners($img_res, $radius)
{
$width = imagesx($img_res);
$height = imagesy($img_res);
imagesavealpha($img_res, true);
// corners START
$img_tmp = imagecreate($width, $height);
$black = imagecolorallocate($img_tmp, 0, 0, 0);
$transp = imagecolorallocatealpha($img_tmp,
0, 0, 0, 127);
imagefill($img_tmp, $width / 2, $height / 2, $transp);
// left upper
imagearc($img_tmp, $radius / 2 - 1,
$radius / 2 - 1,
$radius,
$radius, 180, 270, $black);
imagefill($img_tmp, 0, 0, $black);
// right upper
imagearc($img_tmp, $width - $radius / 2,
$radius / 2 - 1,
$radius,
$radius, 270, 0, $black);
imagefill($img_tmp, $width - 1, 0, $black);
// right lower
imagearc($img_tmp, $width - $radius / 2,
$height - $radius / 2,
$radius,
$radius, 0, 90, $black);
imagefill($img_tmp, $width - 1, $height - 1, $black);
// left lower
imagearc($img_tmp, $radius / 2 - 1,
$height - $radius / 2,
$radius,
$radius, 90, 180, $black);
imagefill($img_tmp, 0, $height - 1, $black);
// corners END
imagecopyresampled($img_res, $img_tmp,
0, 0, 0, 0,
$width, $height, $width, $height);
$transp = imagecolorallocatealpha($img_res,
0, 0, 0, 127);
imagefill($img_res, 0, 0, $transp);
imagefill($img_res, $width - 1, 0, $transp);
imagefill($img_res, $width - 1, $height - 1, $transp);
imagefill($img_res, 0, $height - 1, $transp);
imagedestroy($img_tmp);
return $img_res;
}
}
Изначально я пытался нарисовать «уголки» на временном изображении при помощи одного прямоугольника и одного эллипса наложенного поверх. Оказалось что в таких условиях трудно контролировать радиусь углов — тогда я стал рисовать на каждый угол по своей окружности.