php 圆角图片处理

   /**
     * 把图片转换成圆角
     * @param string $imgpath
     * @param int $radius
     * @return resource
     */
    public function radius_img_url($imgpath = './t.png', $radius = 15) {
        $ext     = pathinfo($imgpath);
        $src_img = null;
        switch ($ext['extension']) {
            case 'jpg':
                $src_img = imagecreatefromjpeg($imgpath);
                break;
            case 'png':
                $src_img = imagecreatefrompng($imgpath);
                break;
        }
        $wh = getimagesize($imgpath);
        $w  = $wh[0];
        $h  = $wh[1];
        return $this->radius_img($src_img, $w,$h, $radius);
    }
    public function radius_img($src_img, $width,$height, $radius = 15) {

        $w  = &$width;
        $h  = &$height;
        // $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
        $img = imagecreatetruecolor($w, $h);
        //这一句一定要有
        imagesavealpha($img, true);
        //拾取一个完全透明的颜色,最后一个参数127为全透明
        $bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
        imagefill($img, 0, 0, $bg);
        $r = $radius; //圆 角半径
        for ($x = 0; $x < $w; $x++) {
            for ($y = 0; $y < $h; $y++) {
                $rgbColor = imagecolorat($src_img, $x, $y);
                if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
                    //不在四角的范围内,直接画
                    imagesetpixel($img, $x, $y, $rgbColor);
                } else {
                    //在四角的范围内选择画
                    //上左
                    $y_x = $r; //圆心X坐标
                    $y_y = $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //上右
                    $y_x = $w - $r; //圆心X坐标
                    $y_y = $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //下左
                    $y_x = $r; //圆心X坐标
                    $y_y = $h - $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                    //下右
                    $y_x = $w - $r; //圆心X坐标
                    $y_y = $h - $r; //圆心Y坐标
                    if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
                        imagesetpixel($img, $x, $y, $rgbColor);
                    }
                }
            }
        }
        return $img;
    }

  直接在背景图片上面画圆

    /**
     * 直接把圆角图片画在背景图片上
     * @param $bg_img 背景图片
     * @param $x 背景图片位置
     * @param $y 背景图片位置
     * @param $src_img 要画的圆角的图片
     * @param $width 圆角图片的尺寸
     * @param $height 圆角图片的尺寸
     * @param int $radius 圆角尺寸
     * @return resource
     */
    public static function radius_img_bg($bg_img, $x, $y, $src_img, $width,$height, $radius = 15) {
        $ob_x = $x;
        $ob_y = $y;
        $max_x  = $ob_x + $width;
        $max_y  = $ob_y + $height;
        $start_y = $y;
        // $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
        $r = $radius; //圆 角半径
        for ($x; $x < $max_x; $x++) {
            for ($y=$start_y; $y < $max_y; $y++) {
                $rgbColor = imagecolorat($src_img, $x-$ob_x, $y-$ob_y);
                if (
                    ($x >= $ob_x + $radius && $x <= ($max_x - $radius)) ||
                    ($y >= $ob_y + $radius && $y <= ($max_y - $radius))
                ) {
                    //不在四角的范围内,直接画
                    imagesetpixel($bg_img, $x, $y, $rgbColor);
                } else {
                    //在四角的范围内选择画
                    //上左
                    $y_x = $ob_x + $r; //圆心X坐标
                    $y_y = $ob_y + $r; //圆心Y坐标
                    if ((pow($x - $y_x, 2) + pow($y - $y_y, 2) <= pow($r,2))) {
                        imagesetpixel($bg_img, $x, $y, $rgbColor);
                    }
                    //上右
                    $y_x = $max_x - $r; //圆心X坐标
                    $y_y = $ob_y + $r; //圆心Y坐标
                    if ((pow($x - $y_x, 2) + pow($y -$y_y, 2) <= pow($r,2))) {
                        imagesetpixel($bg_img, $x, $y, $rgbColor);
                    }
                    //下左
                    $y_x = $ob_x + $r; //圆心X坐标
                    $y_y = $max_y - $r; //圆心Y坐标
                    if (pow($x - $y_x,2) + pow($y - $y_y,2) <= pow($r, 2)) {
                        imagesetpixel($bg_img, $x, $y, $rgbColor);
                    }
                    //下右
                    $y_x = $max_x - $r; //圆心X坐标
                    $y_y = $max_y - $r; //圆心Y坐标
                    if (pow($x - $y_x,2) + pow($y - $y_y,2) <= pow($r, 2)) {
                        imagesetpixel($bg_img, $x, $y, $rgbColor);
                    }
                }
            }
        }
        return $bg_img;
    }

  

posted @ 2018-10-29 11:14  兔六哥  阅读(1670)  评论(0编辑  收藏  举报