PHP裁切图片成圆角

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值