使用php实现背景图上添加圆形logo

使用 php 实现背景图上添加圆形 logo,说一下步骤,总共分 3 步:

  1. 压缩 logo 成固定大小的方形图片
  2. 将 logo 转成圆形 logo
  3. 将 logo 与背景图合并

废话不多说,直接上代码:

class ImageController extends CI_Controller{  
    public function __construct()  
    {  
        parent::__construct();  
        date_default_timezone_set('Asia/Shanghai');  
        error_reporting( E_ALL&~E_NOTICE&~E_WARNING);  
        $this->load->library('curl');  
    }  
  
    /** 
     * @todo : 本函数用于 将方形的图片压缩后 
     *         再裁减成圆形 做成 logo 
     *         与背景图合并 
     * @return 返回 url 
     */  
    public function index(){  
        //头像  
        $headimgurl = 'a.jpg';  
        //背景图  
        $bgurl = './aa.png';  
        $imgs['dst'] = $bgurl;  
        //第一步 压缩图片  
        $imggzip = $this->resize_img($headimgurl);  
        //第二步 裁减成圆角图片  
        $imgs['src'] = $this->test($imggzip);  
        //第三步 合并图片  
        $dest = $this->mergerImg($imgs);  
    }  
  
    public function resize_img($url,$path='./'){  
        $imgname = $path.uniqid().'.jpg';  
        $file = $url;  
        list($width, $height) = getimagesize($file); //获取原图尺寸  
        $percent = (110/$width);  
        //缩放尺寸  
        $newwidth = $width * $percent;  
        $newheight = $height * $percent;  
        $src_im = imagecreatefromjpeg($file);  
        $dst_im = imagecreatetruecolor($newwidth, $newheight);  
        imagecopyresized($dst_im, $src_im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);  
        imagejpeg($dst_im, $imgname); //输出压缩后的图片  
        imagedestroy($dst_im);  
        imagedestroy($src_im);  
        return $imgname;  
    }  
  
    //第一步生成圆角图片  
    public function test($url,$path='./'){  
        $w = 110;  $h=110; // original size  
        $original_path= $url;  
        $dest_path = $path.uniqid().'.png';  
        $src = imagecreatefromstring(file_get_contents($original_path));  
        $newpic = imagecreatetruecolor($w,$h);  
        imagealphablending($newpic,false);  
        $transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127);  
        $r=$w/2;  
        for($x=0;$x<$w;$x++)  
            for($y=0;$y<$h;$y++){  
                $c = imagecolorat($src,$x,$y);  
                $_x = $x - $w/2;  
                $_y = $y - $h/2;  
                if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){  
                    imagesetpixel($newpic,$x,$y,$c);  
                }else{  
                    imagesetpixel($newpic,$x,$y,$transparent);  
                }  
            }  
        imagesavealpha($newpic, true);  
        // header('Content-Type: image/png');  
        imagepng($newpic, $dest_path);  
        imagedestroy($newpic);  
        imagedestroy($src);  
        unlink($url);  
        return $dest_path;  
    }  
  
    //php 合并图片  
    public function mergerImg($imgs,$path='./') {  
        $imgname = $path.rand(1000,9999).uniqid().'.jpg';  
        list($max_width, $max_height) = getimagesize($imgs['dst']);  
        $dests = imagecreatetruecolor($max_width, $max_height);  
        $dst_im = imagecreatefrompng($imgs['dst']);  
        imagecopy($dests,$dst_im,0,0,0,0,$max_width,$max_height);  
        imagedestroy($dst_im);  
  
        $src_im = imagecreatefrompng($imgs['src']);  
        $src_info = getimagesize($imgs['src']);  
        imagecopy($dests,$src_im,270,202,0,0,$src_info[0],$src_info[1]);  
        imagedestroy($src_im);  
  
        // var_dump($imgs);exit;  
        // header("Content-type: image/jpeg");  
        imagejpeg($dests,$imgname);  
        // unlink($imgs['dst']);  
        unlink($imgs['src']);  
        return $imgname;  
    }  
}  

效果如题图。当然没有外围的光圈啦,需要自己加。

发表评论

发表评论

*

沙发空缺中,还不快抢~