PHP生成小程序二维码合成图片生成文字
这部分代码是写在项目上的代码,THINKPHP3.1如果迁移到其他的地方应该要稍稍改动一下以适合自己的项目
function get_bbox($text,$fsize,$ffile){ return imagettfbbox($fsize, 0, $ffile, $text); } function text_height ($text ,$fsize,$ffile) { $box = $this->get_bbox($text,$fsize,$ffile); $height = $box[3] - $box[5]; return $height; } //上传到aliyun function uploadtooss($bucket, $localfilepath, $objname) { $uploadoss = new Aliyunoss($bucket); return $uploadoss->upload_by_file($objname, $localfilepath); } function getalluser(){ $data=M('kuaidati_user')->order('id desc')->select(); dump($data); } function ifexsitobj($bucket, $objname) { $uploadoss = new Aliyunoss($bucket); return $uploadoss->is_object_exist($objname); } function autowrap($fontsize, $angle, $fontface, $string, $width) { // 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度 $content = ""; // 将字符串拆分成一个个单字 保存到数组 letter 中 for ($i=0;$i<mb_strlen($string,'utf8');$i++) { $letter[] = mb_substr($string, $i, 1,'utf-8'); } foreach ($letter as $l) { $teststr = $content." ".$l; $testbox = imagettfbbox($fontsize, $angle, $fontface, $teststr);//这个里面是磅值 // 判断拼接后的字符串是否超过预设的宽度 if ((($testbox[2]-$testbox[0]) > $width) && ($content !== "")) { $content .= "\n"; } $content .= $l; } return $content; } function api_notice_increment($url, $data){ $ch = curl_init(); $header = "Accept-Charset: utf-8"; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($url, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)'); curl_setopt($ch, CURLOPT_FOLLOWLOdCATION, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tmpInfo = curl_exec($ch); if (curl_errno($ch)) { return false; }else{ return $tmpInfo; } } public function get_random_key($len=8) { $key = ""; $pattern = '1234567890abcdefghijklmnopqrstuvwxyz'; for ($i = 0; $i < $len; $i++) { $key.= $pattern{mt_rand(0, 35)}; //生成php随机数 } return $key; } public function circle($url,$path){ $w = 430; $h=430; // original size $dest_path=$path; $src = imagecreatefromstring($url); $newpic = imagecreatetruecolor($w,$h); imagealphablending($newpic,false); $transparent = imagecolorallocatealpha($newpic, 233, 40, 59, 0); $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; } public function getimage(){ $id=145; $Qsubject="测试PHP在图片上面文字生成"; $answer=array( array('answer_key'=>'测试选项1'), array('answer_key'=>'测试选项2'), array('answer_key'=>'测试选项3'), array('answer_key'=>'测试选项4') ); $customermessage=new WechatSendCustomerMessage("VQSKmPFVS1532925182"); //内部方法获取微信的access_token $access_token=$customermessage->get_token(); //获取二维码 $path="pages/userceter/userceter?id=".$id; $width=430; $post_data='{"path":"'.$path.'","width":'.$width.'}'; //$url="https://api.weixin.qq.com/cgi-bin/wxaapp/createwxaqrcode?access_token=".$access_token; //获取小程序码 $url="https://api.weixin.qq.com/wxa/getwxacode?access_token=".$access_token; $result=$this->api_notice_increment($url,$post_data); if($result){ //服务器上面的路径 $returnpath = dirname(__FILE__) . '/' . '../../../../wemarkdata/updatedata/tmp/'; $itype = 'jpg'; $filename = time() . $this->get_random_key(8) . '.' . $itype; $filepath = $returnpath . $filename; //文件路径 $urlprefix = 'xcximg.xxx.cn'; //域名 $bucket = 'cardzan'; //阿里云的bucket // $file_name = time() . $this->get_random_key(8) . '.png'; if (!file_exists($filepath)) { $this->circle($result,$filepath); //生成圆形的二维码图片,放在服务器上面 $bg2="https://www.xxx.cn/themes/Xcxdati/bg2.png"; //背景图片路径 $a="https://www.xxx.cn/themes/Xcxdati/a.png"; $b="https://www.xxx.cn/themes/Xcxdati/b.png"; $c="https://www.xxx.cn/themes/Xcxdati/c.png"; $d="https://www.xxx.cn/themes/Xcxdati/d.png"; $txturl="http://test.xxx.cn/themes/Xcxdati/txt.png"; //文字图片路径 $txt = imagecreatefromstring(file_get_contents($txturl)); $answeroption=array( imagecreatefromstring(file_get_contents($a)), imagecreatefromstring(file_get_contents($b)), imagecreatefromstring(file_get_contents($c)), imagecreatefromstring(file_get_contents($d)) ); $tempfilename=time().$this->get_random_key(8).'.png'; $tempurl = $returnpath.$tempfilename; $BGT = imagecreatefromstring(file_get_contents($bg2)); $code = imagecreatefromstring(file_get_contents($filepath)); //注意字体文件的位置,自己文件路径错误文字显示不出来 $font = dirname(__FILE__)."/./../Xcxdati/fonts/msyh.ttc"; // 字体文件 $color = imagecolorallocate($BGT,102,102,102); // 文字颜色 $content=$this->autowrap(28,0,$font,$Qsubject,620); //autowrap($fontsize, $angle, $fontface, $string, $width) // 这几个变量分别是 字体大小, 角度, 字体名称, 字符串, 预设宽度 $posY = $this->text_height($content,28,$font); //问题的高度 imagettftext($BGT,28,0,70,300,$color,$font,$content); // 创建文字 $posY+=300; for($k=0;$k<count($answer);$k++){ $text = $this->autowrap(28,0,$font,$answer[$k]['answer_key'],620); $posY =$posY+$this->text_height($answer[$k]['answer_key'],28,$font)+40; imagettftext($BGT,28,0,130,$posY,$color,$font,$text); // 创建文字 imagecopyresampled($BGT, $answeroption[$k], 70,($posY-35), 0, 0,42,42,42,42); } $logo_width = imagesx($code);//二维码图片宽度 $logo_height = imagesy($code);//二维码图片高度 imagecopyresampled($BGT, $code, 290,1030, 0, 0,170,170,$logo_width,$logo_height); imagecopyresampled($BGT, $txt, 160,1245, 0, 0,418,37,836,74); imagepng($BGT, $tempurl); //合成图片 $filename = time() . $this->get_random_key(8) . '.png'; $ossfilename = 'xcximg/pic/' . $filename; $status = $this->uploadtooss($bucket, $tempurl, $ossfilename); //上传到阿里云 $src= 'https://'.$urlprefix .'/'.$ossfilename; if($status){ // $res['status']=1; // $res['data']=array('src'=>$src); // echo json_encode($res); echo '<img src="'.$src.'">'; } }else{ echo 0; } }else{ echo 0; } }