一. 看效果(需求是将用户的微信头像变成水印打在背景图上)
二.看代码
//准备绘图元素
$location= array(); //坐标 可写在配置文件里
$headImg = $userInfo['headimgurl']; //头像
$time= date("Y/m/d",time()); //日期
//相关证书背景图存在,则以为背景,重新合成图(打上头像、日期)
$BG_URL= '/bg.jpg';
$imageUrl= $this->createImg ($BG_URL, $headImg, $time,$FONT, $location);
private function createImg($source, $text1, $text2, $font ,$L) {
$file_root = '/tmp/';
$file_name = md5 ( $source . $text1 . $text2) . '.jpg';
if(!file_exists ($source ) or !file_exists ($font ) ){
die("资源不存在!");
}
if(@!file_get_contents($file_root.$file_name)){
$main = imagecreatefromjpeg ( $source );
$w = imagesx ( $main );
$h = imagesy ( $main );
$target = imagecreatetruecolor ( $width, $height );
$white = imagecolorallocate ( $target, 255, 255, 255 );
imagefill ( $target, 0, 0, $white );
imagecopyresampled ( $target, $main, 0, 0, 0, 0, $w, $h, $w, $h );
$fontColor = imagecolorallocate ( $target, 22,172,169 ); //字的RGB颜色
//打上文字
imagettftext ( $target, n,n,n,n, $fontColor, $font, $text2 );
//获取头像图(将图像存在本地)
$head_file = 'tx'.md5 ($text1) . '.jpg';
$localPath = $file_root.$head_file;
//如文件不存在,将远程文件下载到本地
if (!file_exists($localPath)) {
$image = $this->getImage($text1); //获取远程文件,用curl请求
file_put_contents($localPath,$image);
}
$localPath = $this->circular($localPath,$file_root); //将头像处理成圆形
$localPath = imagecreatefromstring(file_get_contents($localPath));
//打印水印
imagecopy ( $target, $localPath,n,n,n,n,n,n);
imagejpeg ( $target, $file_root.$file_name, 95 ); // 输出合成的新图象到文件
imagedestroy ( $main );
imagedestroy ( $target );
}
//同步图片到专门存储图片的服务器(这个具体看公司业务)
$file_path =$this->synchronou($file_root.$file_name);
$data = json_decode($file_path,true);
if ($data['ret_code']==1) {
return "www.xxx.com/".$data['filename'];
}
}
//下载远程图片
private function getImage($url ){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
三.小结
主要用到的是GD库知识,不清楚的地方可去看官方手册,注意函数参数。
获取远程图片资源使用curl,比如获取微信头像存到本地curl不到1秒时间,
使用file_get_contents()竟然要花费18秒。
网友评论