1、使用PHP Imagick库进行图片圆角处理,Imagick是自带的图片圆角处理,在执行效率上也比GD的要胜上一筹
/**
* Imagick裁剪圆形图片
* @param strimg $imgPath 图片路径
* @param string $saveName 保存路径
* @param string $size 圆角尺寸 0 则为圆形图
* @return source 生成的图片
*/
function roundImg_bak($imgPath, $saveName,$size=0)
{
//图片裁切圆形
$image = new \Imagick($imgPath);
$image->setImageFormat('png');
if (empty($size)){
$width = $image->getImageWidth();
$height = $image->getImageHeight();
}else{
$width = $size;
$height = $size;
}
$image->roundCorners($width / 2, $height / 2);
$saveName = $saveName ?: substr(md5(time()), 0, 5) . '.png';
$image->writeImage($saveName);
$image->destroy();
}
php7, ImageMagick-7.0.8-3 生成圆形图片 会出现这个错误
Call to undefined method Imagick::roundCorners
所以这个方法有点鸡肋
2、当前利用php自带的函数,实现原理是在透明画布上描点的方式
/**
* 图片圆角处理函数
* @param source $srcFile 本地图片路径
* @param source $img_path 保存路径
* @param string $size 圆角尺寸 0 则为圆形图
*/
function roundImg($srcFile,$img_path, $size=0) {
//得到图片后缀
$ext = pathinfo($srcFile);
//设定圆形图片名称为“当前图片名称_cir”,并组装成本地圆形图片路径
//$img_path = $ext['dirname']."/".$ext['filename']."_cir.".$ext['extension'];
//检测圆形图片存在的时候直接当前图片返回
$data = getimagesize($srcFile);
switch ($data['2']) {
case 1:
$im = imagecreatefromgif($srcFile);
break;
case 2:
$im = imagecreatefromjpeg($srcFile);
break;
case 3:
$im = imagecreatefrompng($srcFile);
break;
case 6:
$im = imagecreatefromwbmp($srcFile);
break;
}
$srcImg = $im;
$w = imagesx($srcImg);
$h = imagesy($srcImg);
if (empty($size)){
$radius = min($w, $h) / 2;
}else{
$radius = $size / 2;
}
$img = imagecreatetruecolor($w, $h);
imagesavealpha($img, true); // 设置透明通道
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127); // 拾取一个完全透明的颜色, 最后一个参数127为全透明
imagefill($img, 0, 0, $bg);
$r = $radius; // 圆 角半径
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbColor = imagecolorat($srcImg, $x, $y);
if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
imagesetpixel($img, $x, $y, $rgbColor); // 不在四角的范围内,直接画
} else { // 在四角的范围内选择画
// 上左
$yx = $r; // 圆心X坐标
$yy = $r; // 圆心Y坐标
if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
// 上右
$yx = $w - $r; // 圆心X坐标
$yy = $r; // 圆心Y坐标
if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
// 下左
$yx = $r; // 圆心X坐标
$yy = $h - $r; // 圆心Y坐标
if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
// 下右
$yx = $w - $r; // 圆心X坐标
$yy = $h - $r; // 圆心Y坐标
if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
}
switch ($data['2']) {
case 1:
imagegif($img,$img_path);
break;
case 2:
imagejpeg($img,$img_path);
break;
case 3:
imagepng($img,$img_path);
break;
case 6:
image2wbmp($img,$img_path);
break;
}
imagedestroy($img);
return $img_path;
}
9292

被折叠的 条评论
为什么被折叠?



