• 售前

  • 售后

热门帖子
入门百科

PHP分享图片的天生方法

[复制链接]
薛建朝 显示全部楼层 发表于 2021-10-25 19:50:02 |阅读模式 打印 上一主题 下一主题
近来工作需求必要生身分享图片,最初用js的html2canvas截图插件各种题目,后来干脆PHP的PG库在背景天生图片,很舒畅的解决了各种题目,我们要实现的效果如下图:

假设代码中用到的资源文件夹在当前code_png目录下:
php代码:
  1. /**
  2. * 分享图片生成
  3. * @param $gData 商品数据,array
  4. * @param $codeName 二维码图片
  5. * @param $fileName string 保存文件名,默认空则直接输入图片
  6. */
  7. function createSharePng($gData,$codeName,$fileName = ''){
  8.   //创建画布
  9.   $im = imagecreatetruecolor(618, 1000);
  10.   //填充画布背景色
  11.   $color = imagecolorallocate($im, 255, 255, 255);
  12.   imagefill($im, 0, 0, $color);
  13.   //字体文件
  14.   $font_file = "code_png/msyh.ttf";
  15.   $font_file_bold = "code_png/msyh_bold.ttf";
  16.   //设定字体的颜色
  17.   $font_color_1 = ImageColorAllocate ($im, 140, 140, 140);
  18.   $font_color_2 = ImageColorAllocate ($im, 28, 28, 28);
  19.   $font_color_3 = ImageColorAllocate ($im, 129, 129, 129);
  20.   $font_color_red = ImageColorAllocate ($im, 217, 45, 32);
  21.   $fang_bg_color = ImageColorAllocate ($im, 254, 216, 217);
  22.   //Logo
  23.   list($l_w,$l_h) = getimagesize('code_png/logo100_100.png');
  24.   $logoImg = @imagecreatefrompng('code_png/logo100_100.png');
  25.   imagecopyresized($im, $logoImg, 274, 28, 0, 0, 70, 70, $l_w, $l_h);
  26.   //温馨提示
  27.   imagettftext($im, 14,0, 100, 130, $font_color_1 ,$font_file, '温馨提示:喜欢长按图片识别二维码即可前往购买');
  28.   //商品图片
  29.   list($g_w,$g_h) = getimagesize($gData['pic']);
  30.   $goodImg = createImageFromFile($gData['pic']);
  31.   imagecopyresized($im, $goodImg, 0, 185, 0, 0, 618, 618, $g_w, $g_h);
  32.   //二维码
  33.   list($code_w,$code_h) = getimagesize($codeName);
  34.   $codeImg = createImageFromFile($codeName);
  35.   imagecopyresized($im, $codeImg, 440, 820, 0, 0, 170, 170, $code_w, $code_h);
  36.   //商品描述
  37.   $theTitle = cn_row_substr($gData['title'],2,19);
  38.   imagettftext($im, 14,0, 8, 845, $font_color_2 ,$font_file, $theTitle[1]);
  39.   imagettftext($im, 14,0, 8, 875, $font_color_2 ,$font_file, $theTitle[2]);
  40.   imagettftext($im, 14,0, 8, 935, $font_color_2 ,$font_file, "券后价¥");
  41.   imagettftext($im, 28,0, 80, 935, $font_color_red ,$font_file_bold, $gData["price"]);
  42.   imagettftext($im, 14,0, 8,970, $font_color_3 ,$font_file, "现价¥".$gData["original_price"]);
  43.   //优惠券
  44.   if($gData['coupon_price']){
  45.     imagerectangle ($im, 125 , 950 , 160 , 975 , $font_color_3);
  46.     imagefilledrectangle ($im, 126 , 951 , 159 , 974 , $fang_bg_color);
  47.     imagettftext($im, 14,0, 135,970, $font_color_3 ,$font_file, "券");
  48.     $coupon_price = strval($gData['coupon_price']);
  49.     imagerectangle ($im, 160 , 950 , 198 + (strlen($coupon_price)* 10), 975 , $font_color_3);
  50.     imagettftext($im, 14,0, 170,970, $font_color_3 ,$font_file, $coupon_price."元");
  51.   }
  52.   //输出图片
  53.   if($fileName){
  54.     imagepng ($im,$fileName);
  55.   }else{
  56.     Header("Content-Type: image/png");
  57.     imagepng ($im);
  58.   }
  59.   //释放空间
  60.   imagedestroy($im);
  61.   imagedestroy($goodImg);
  62.   imagedestroy($codeImg);
  63. }
  64. /**
  65. * 从图片文件创建Image资源
  66. * @param $file 图片文件,支持url
  67. * @return bool|resource  成功返回图片image资源,失败返回false
  68. */
  69. function createImageFromFile($file){
  70.   if(preg_match('/http(s)?:\/\//',$file)){
  71.     $fileSuffix = getNetworkImgType($file);
  72.   }else{
  73.     $fileSuffix = pathinfo($file, PATHINFO_EXTENSION);
  74.   }
  75.   if(!$fileSuffix) return false;
  76.   switch ($fileSuffix){
  77.     case 'jpeg':
  78.       $theImage = @imagecreatefromjpeg($file);
  79.       break;
  80.     case 'jpg':
  81.       $theImage = @imagecreatefromjpeg($file);
  82.       break;
  83.     case 'png':
  84.       $theImage = @imagecreatefrompng($file);
  85.       break;
  86.     case 'gif':
  87.       $theImage = @imagecreatefromgif($file);
  88.       break;
  89.     default:
  90.       $theImage = @imagecreatefromstring(file_get_contents($file));
  91.       break;
  92.   }
  93.   return $theImage;
  94. }
  95. /**
  96. * 获取网络图片类型
  97. * @param $url 网络图片url,支持不带后缀名url
  98. * @return bool
  99. */
  100. function getNetworkImgType($url){
  101.   $ch = curl_init(); //初始化curl
  102.   curl_setopt($ch, CURLOPT_URL, $url); //设置需要获取的URL
  103.   curl_setopt($ch, CURLOPT_NOBODY, 1);
  104.   curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);//设置超时
  105.   curl_setopt($ch, CURLOPT_TIMEOUT, 3);
  106.   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //支持https
  107.   curl_exec($ch);//执行curl会话
  108.   $http_code = curl_getinfo($ch);//获取curl连接资源句柄信息
  109.   curl_close($ch);//关闭资源连接
  110.   if ($http_code['http_code'] == 200) {
  111.     $theImgType = explode('/',$http_code['content_type']);
  112.     if($theImgType[0] == 'image'){
  113.       return $theImgType[1];
  114.     }else{
  115.       return false;
  116.     }
  117.   }else{
  118.     return false;
  119.   }
  120. }
  121. /**
  122. * 分行连续截取字符串
  123. * @param $str 需要截取的字符串,UTF-8
  124. * @param int $row 截取的行数
  125. * @param int $number  每行截取的字数,中文长度
  126. * @param bool $suffix 最后行是否添加‘...'后缀
  127. * @return array  返回数组共$row个元素,下标1到$row
  128. */
  129. function cn_row_substr($str,$row = 1,$number = 10,$suffix = true){
  130.   $result = array();
  131.   for ($r=1;$r<=$row;$r++){
  132.     $result[$r] = '';
  133.   }
  134.   $str = trim($str);
  135.   if(!$str) return $result;
  136.   $theStrlen = strlen($str);
  137.   //每行实际字节长度
  138.   $oneRowNum = $number * 3;
  139.   for($r=1;$r<=$row;$r++){
  140.     if($r == $row and $theStrlen > $r * $oneRowNum and $suffix){
  141.       $result[$r] = mg_cn_substr($str,$oneRowNum-6,($r-1)* $oneRowNum).'...';
  142.     }else{
  143.       $result[$r] = mg_cn_substr($str,$oneRowNum,($r-1)* $oneRowNum);
  144.     }
  145.     if($theStrlen < $r * $oneRowNum) break;
  146.   }
  147.   return $result;
  148. }
  149. /**
  150. * 按字节截取utf-8字符串
  151. * 识别汉字全角符号,全角中文3个字节,半角英文1个字节
  152. * @param $str 需要切取的字符串
  153. * @param $len 截取长度[字节]
  154. * @param int $start  截取开始位置,默认0
  155. * @return string
  156. */
  157. function mg_cn_substr($str,$len,$start = 0){
  158.   $q_str = '';
  159.   $q_strlen = ($start + $len)>strlen($str) ? strlen($str) : ($start + $len);
  160.   //如果start不为起始位置,若起始位置为乱码就按照UTF-8编码获取新start
  161.   if($start and json_encode(substr($str,$start,1)) === false){
  162.     for($a=0;$a<3;$a++){
  163.       $new_start = $start + $a;
  164.       $m_str = substr($str,$new_start,3);
  165.       if(json_encode($m_str) !== false) {
  166.         $start = $new_start;
  167.         break;
  168.       }
  169.     }
  170.   }
  171.   //切取内容
  172.   for($i=$start;$i<$q_strlen;$i++){
  173.     //ord()函数取得substr()的第一个字符的ASCII码,如果大于0xa0的话则是中文字符
  174.     if(ord(substr($str,$i,1))>0xa0){
  175.       $q_str .= substr($str,$i,3);
  176.       $i+=2;
  177.     }else{
  178.       $q_str .= substr($str,$i,1);
  179.     }
  180.   }
  181.   return $q_str;
  182. }
  183. //使用方法-------------------------------------------------
  184. //数据格式,如没有优惠券coupon_price值为0。
  185. $gData = [
  186.   'pic' => 'code_png/nv_img.jpg',
  187.   'title' =>'chic韩版工装羽绒棉服女冬中长款2017新款棉袄大毛领收腰棉衣外套',
  188.   'price' => 19.8,
  189.   'original_price' => 119.8,
  190.   'coupon_price' => 100
  191. ];
  192. //直接输出
  193. createSharePng($gData,'code_png/php_code.jpg');
  194. //输出到图片
  195. createSharePng($gData,'code_png/php_code.jpg','share.png');
复制代码
以上就是本文的全部内容,希望对各人的学习有所资助,也希望各人多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作