PHP分享图片的生成方法


Posted in PHP onApril 25, 2018

最近工作需求需要生成分享图片,最初用js的html2canvas截图插件各种问题,后来干脆PHP的PG库在后台生成图片,很愉快的解决了各种问题,我们要实现的效果如下图:

PHP分享图片的生成方法

假设代码中用到的资源文件夹在当前code_png目录下:

php代码:

/** 
 * 分享图片生成 
 * @param $gData 商品数据,array 
 * @param $codeName 二维码图片 
 * @param $fileName string 保存文件名,默认空则直接输入图片 
 */ 
function createSharePng($gData,$codeName,$fileName = ''){ 
  //创建画布 
  $im = imagecreatetruecolor(618, 1000); 
 
  //填充画布背景色 
  $color = imagecolorallocate($im, 255, 255, 255); 
  imagefill($im, 0, 0, $color); 
 
  //字体文件 
  $font_file = "code_png/msyh.ttf"; 
  $font_file_bold = "code_png/msyh_bold.ttf"; 
 
  //设定字体的颜色 
  $font_color_1 = ImageColorAllocate ($im, 140, 140, 140); 
  $font_color_2 = ImageColorAllocate ($im, 28, 28, 28); 
  $font_color_3 = ImageColorAllocate ($im, 129, 129, 129); 
  $font_color_red = ImageColorAllocate ($im, 217, 45, 32); 
 
  $fang_bg_color = ImageColorAllocate ($im, 254, 216, 217); 
 
  //Logo 
  list($l_w,$l_h) = getimagesize('code_png/logo100_100.png'); 
  $logoImg = @imagecreatefrompng('code_png/logo100_100.png'); 
  imagecopyresized($im, $logoImg, 274, 28, 0, 0, 70, 70, $l_w, $l_h); 
 
  //温馨提示 
  imagettftext($im, 14,0, 100, 130, $font_color_1 ,$font_file, '温馨提示:喜欢长按图片识别二维码即可前往购买'); 
 
  //商品图片 
  list($g_w,$g_h) = getimagesize($gData['pic']); 
  $goodImg = createImageFromFile($gData['pic']); 
  imagecopyresized($im, $goodImg, 0, 185, 0, 0, 618, 618, $g_w, $g_h); 
 
  //二维码 
  list($code_w,$code_h) = getimagesize($codeName); 
  $codeImg = createImageFromFile($codeName); 
  imagecopyresized($im, $codeImg, 440, 820, 0, 0, 170, 170, $code_w, $code_h); 
 
  //商品描述 
  $theTitle = cn_row_substr($gData['title'],2,19); 
  imagettftext($im, 14,0, 8, 845, $font_color_2 ,$font_file, $theTitle[1]); 
  imagettftext($im, 14,0, 8, 875, $font_color_2 ,$font_file, $theTitle[2]); 
 
  imagettftext($im, 14,0, 8, 935, $font_color_2 ,$font_file, "券后价¥"); 
  imagettftext($im, 28,0, 80, 935, $font_color_red ,$font_file_bold, $gData["price"]); 
  imagettftext($im, 14,0, 8,970, $font_color_3 ,$font_file, "现价¥".$gData["original_price"]); 
 
  //优惠券 
  if($gData['coupon_price']){ 
    imagerectangle ($im, 125 , 950 , 160 , 975 , $font_color_3); 
    imagefilledrectangle ($im, 126 , 951 , 159 , 974 , $fang_bg_color); 
    imagettftext($im, 14,0, 135,970, $font_color_3 ,$font_file, "券"); 
 
    $coupon_price = strval($gData['coupon_price']); 
    imagerectangle ($im, 160 , 950 , 198 + (strlen($coupon_price)* 10), 975 , $font_color_3); 
    imagettftext($im, 14,0, 170,970, $font_color_3 ,$font_file, $coupon_price."元"); 
  } 
 
  //输出图片 
  if($fileName){ 
    imagepng ($im,$fileName); 
  }else{ 
    Header("Content-Type: image/png"); 
    imagepng ($im); 
  } 
 
  //释放空间 
  imagedestroy($im); 
  imagedestroy($goodImg); 
  imagedestroy($codeImg); 
} 
 
/** 
 * 从图片文件创建Image资源 
 * @param $file 图片文件,支持url 
 * @return bool|resource  成功返回图片image资源,失败返回false 
 */ 
function createImageFromFile($file){ 
  if(preg_match('/http(s)?:\/\//',$file)){ 
    $fileSuffix = getNetworkImgType($file); 
  }else{ 
    $fileSuffix = pathinfo($file, PATHINFO_EXTENSION); 
  } 
 
  if(!$fileSuffix) return false; 
 
  switch ($fileSuffix){ 
    case 'jpeg': 
      $theImage = @imagecreatefromjpeg($file); 
      break; 
    case 'jpg': 
      $theImage = @imagecreatefromjpeg($file); 
      break; 
    case 'png': 
      $theImage = @imagecreatefrompng($file); 
      break; 
    case 'gif': 
      $theImage = @imagecreatefromgif($file); 
      break; 
    default: 
      $theImage = @imagecreatefromstring(file_get_contents($file)); 
      break; 
  } 
 
  return $theImage; 
} 
 
/** 
 * 获取网络图片类型 
 * @param $url 网络图片url,支持不带后缀名url 
 * @return bool 
 */ 
function getNetworkImgType($url){ 
  $ch = curl_init(); //初始化curl 
  curl_setopt($ch, CURLOPT_URL, $url); //设置需要获取的URL 
  curl_setopt($ch, CURLOPT_NOBODY, 1); 
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);//设置超时 
  curl_setopt($ch, CURLOPT_TIMEOUT, 3); 
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //支持https 
  curl_exec($ch);//执行curl会话 
  $http_code = curl_getinfo($ch);//获取curl连接资源句柄信息 
  curl_close($ch);//关闭资源连接 
 
  if ($http_code['http_code'] == 200) { 
    $theImgType = explode('/',$http_code['content_type']); 
 
    if($theImgType[0] == 'image'){ 
      return $theImgType[1]; 
    }else{ 
      return false; 
    } 
  }else{ 
    return false; 
  } 
} 
 
/** 
 * 分行连续截取字符串 
 * @param $str 需要截取的字符串,UTF-8 
 * @param int $row 截取的行数 
 * @param int $number  每行截取的字数,中文长度 
 * @param bool $suffix 最后行是否添加‘...'后缀 
 * @return array  返回数组共$row个元素,下标1到$row 
 */ 
function cn_row_substr($str,$row = 1,$number = 10,$suffix = true){ 
  $result = array(); 
  for ($r=1;$r<=$row;$r++){ 
    $result[$r] = ''; 
  } 
 
  $str = trim($str); 
  if(!$str) return $result; 
 
  $theStrlen = strlen($str); 
 
  //每行实际字节长度 
  $oneRowNum = $number * 3; 
  for($r=1;$r<=$row;$r++){ 
    if($r == $row and $theStrlen > $r * $oneRowNum and $suffix){ 
      $result[$r] = mg_cn_substr($str,$oneRowNum-6,($r-1)* $oneRowNum).'...'; 
    }else{ 
      $result[$r] = mg_cn_substr($str,$oneRowNum,($r-1)* $oneRowNum); 
    } 
    if($theStrlen < $r * $oneRowNum) break; 
  } 
 
  return $result; 
} 
 
/** 
 * 按字节截取utf-8字符串 
 * 识别汉字全角符号,全角中文3个字节,半角英文1个字节 
 * @param $str 需要切取的字符串 
 * @param $len 截取长度[字节] 
 * @param int $start  截取开始位置,默认0 
 * @return string 
 */ 
function mg_cn_substr($str,$len,$start = 0){ 
  $q_str = ''; 
  $q_strlen = ($start + $len)>strlen($str) ? strlen($str) : ($start + $len); 
 
  //如果start不为起始位置,若起始位置为乱码就按照UTF-8编码获取新start 
  if($start and json_encode(substr($str,$start,1)) === false){ 
    for($a=0;$a<3;$a++){ 
      $new_start = $start + $a; 
      $m_str = substr($str,$new_start,3); 
      if(json_encode($m_str) !== false) { 
        $start = $new_start; 
        break; 
      } 
    } 
  } 
 
  //切取内容 
  for($i=$start;$i<$q_strlen;$i++){ 
    //ord()函数取得substr()的第一个字符的ASCII码,如果大于0xa0的话则是中文字符 
    if(ord(substr($str,$i,1))>0xa0){ 
      $q_str .= substr($str,$i,3); 
      $i+=2; 
    }else{ 
      $q_str .= substr($str,$i,1); 
    } 
  } 
  return $q_str; 
} 
 
 
//使用方法------------------------------------------------- 
//数据格式,如没有优惠券coupon_price值为0。 
$gData = [ 
  'pic' => 'code_png/nv_img.jpg', 
  'title' =>'chic韩版工装羽绒棉服女冬中长款2017新款棉袄大毛领收腰棉衣外套', 
  'price' => 19.8, 
  'original_price' => 119.8, 
  'coupon_price' => 100 
]; 
//直接输出 
createSharePng($gData,'code_png/php_code.jpg'); 
//输出到图片 
createSharePng($gData,'code_png/php_code.jpg','share.png');

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
多数据表共用一个页的新闻发布
Oct 09 PHP
php 应用程序安全防范技术研究
Sep 25 PHP
php下通过伪造http头破解防盗链的代码
Jul 03 PHP
php文件上传的例子及参数详解
Dec 12 PHP
php开发工具有哪五款
Nov 09 PHP
php的闭包(Closure)匿名函数初探
Feb 14 PHP
php实现生成验证码实例分享
Apr 10 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 PHP
PHP Cli 模式设置进程名称的方法
Jun 12 PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 PHP
PHP receiveMail实现收邮件功能
Apr 25 #PHP
laravel中短信发送验证码的实现方法
Apr 25 #PHP
PHP设计模式之适配器模式原理与用法分析
Apr 25 #PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 #PHP
PHP设计模式之单例模式原理与实现方法分析
Apr 25 #PHP
PHP设计模式之工厂方法设计模式实例分析
Apr 25 #PHP
原生php实现excel文件读写的方法分析
Apr 25 #PHP
You might like
php 中英文语言转换类代码
2011/08/11 PHP
php安全配置 如何配置使其更安全
2011/12/16 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
ThinkPHP框架整合微信支付之JSAPI模式图文详解
2019/04/09 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
jQuery中extend函数详解
2015/07/13 Javascript
javascript实现动态表头及表列的展现方法
2015/07/14 Javascript
JavaScript基本的输出和嵌入式写法教程
2015/10/20 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
js动态设置select下拉菜单的默认选中项实例
2018/08/21 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
js设计模式之代理模式及订阅发布模式实例详解
2019/08/15 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
js+css3实现炫酷时钟
2020/08/18 Javascript
vue element-ui中table合计指定列求和实例
2020/11/02 Javascript
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
selenium+python设置爬虫代理IP的方法
2018/11/29 Python
如何给Python代码进行加密
2020/01/10 Python
Python解析微信dat文件的方法
2020/11/30 Python
python集合的新增元素方法整理
2020/12/07 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
美国在线珠宝商店:SZUL
2017/02/11 全球购物
美国在线精品家居网站:Burke Decor
2017/04/12 全球购物
Java语言程序设计测试题判断题部分
2013/01/06 面试题
大学生素质拓展活动方案
2014/02/11 职场文书
关于元旦的广播稿
2014/02/16 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
企业理念标语
2014/06/09 职场文书
SpringBoot2零基础到精通之数据与页面响应
2022/03/22 Java/Android