PHP分享图片的生成方法

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

假设代码中用到的资源文件夹在当前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生成二维码的两种方法(带logo图像)
  • php生成二维码的几种方式整理及使用实例
  • PHP下通过QRCode类库创建中间带网站LOGO的二维码
  • php微信开发之带参数二维码的使用
(0)

相关推荐

  • php微信开发之带参数二维码的使用

    最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我的开发过程比较详细的记录下,希望对大家有所帮助. 我本次开发使用的是认证服务号. 1 接入 首先进入微信公众号 -> 基本配置  下面是基本配置的页面,在URL中填写服务器地址,这个地址就是接受微信推送事件的一个接口,我是使用thinkPHP框架开发的程序,在其中一个Module(Decorati

  • PHP下通过QRCode类库创建中间带网站LOGO的二维码

    我们要生成二维码都需要借助一些类库来实现了,下面我介绍利用PHP QR Code生成二维码吧,生成方法很简单,下面我来介绍一下. 利用php类库PHP QR Code来实现,不需要装额外的php扩展,首先下载类库包,有时候地址打不开,地址:http://phpqrcode.sourceforge.net/ 下载: 国内下载:http://www.jb51.net/codes/189897.html 国外下载:http://sourceforge.net/projects/phpqrcode/ 例

  • 使用PHP生成二维码的两种方法(带logo图像)

    一.利用Google API生成二维码  Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码: $urlToEncode="http://www.jb51.net"; generateQRfromGoogle($urlToEncode); /** * google api 二维码生成[QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式] * @param string $chl 二维码包含的信息,可以是数字.字符.二进制信

  • php生成二维码的几种方式整理及使用实例

    1.google开放api 复制代码 代码如下: $urlToEncode="http://bbs.lewanchina.com"; generateQRfromGoogle($urlToEncode); function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0') { $url = urlencode($url); echo '<img src="http://cha

  • PHP分享图片的生成方法

    最近工作需求需要生成分享图片,最初用js的html2canvas截图插件各种问题,后来干脆PHP的PG库在后台生成图片,很愉快的解决了各种问题,我们要实现的效果如下图: 假设代码中用到的资源文件夹在当前code_png目录下: php代码: /** * 分享图片生成 * @param $gData 商品数据,array * @param $codeName 二维码图片 * @param $fileName string 保存文件名,默认空则直接输入图片 */ function createSha

  • Java图片转字符图片的生成方法

    前面介绍了一篇java实现图片灰度化处理的小demo,接下来再介绍一个有意思的东西,将一个图片转换成字符图片 借助前面图片灰度化处理的知识点,若我们希望将一张图片转成字符图片,同样可以遍历每个像素点,然后将像素点由具体的字符来替换,从而实现字符化处理 基于上面这个思路,具体的实现就很清晰了 @Test public void testRender() throws IOException { String file = "http://i0.download.fd.52shubiao.com/t

  • C#(.net)水印图片的生成完整实例

    本文以一个完整实例讲述了C#水印图片的生成方法.是非常实用的技巧.分享给大家供大家参考. 具体实例代码如下: /* * * 使用说明: * 建议先定义一个WaterImage实例 * 然后利用实例的属性,去匹配需要进行操作的参数 * 然后定义一个WaterImageManage实例 * 利用WaterImageManage实例进行DrawImage(),印图片水印 * DrawWords()印文字水印 * */ using System; using System.Drawing; using

  • 批量下载对路网图片并生成html的实现方法

    对路使用ajax实现异步加载内容,在它的js代码中找到了相关代码 type : 'POST', url : '/index.php/request/new_data2/' + times + '/'+locinfo[domn][0], dataType : 'json', 返回的json字符串是一个被序列化的数组,数组中存放的是字典,其中要关注的是dict['t']以及dict['i'],dict['t']存放了图片的说明,dict['i']存放了图片的url.知道了这些后就可以开始python

  • java实现创建缩略图、伸缩图片比例生成的方法

    本文实例讲述了java实现创建缩略图.伸缩图片比例生成的方法.分享给大家供大家参考.具体实现方法如下: 该实例支持将Image的宽度.高度缩放到指定width.height,并保存在指定目录 通过目标对象的大小和标准(指定)大小计算出图片缩小的比例,可以设置图片缩放质量,并且可以根据指定的宽高缩放图片. 具体代码如下所示: 复制代码 代码如下: package com.hoo.util;   import java.awt.Image; import java.awt.image.Buffere

  • C#生成条形码图片的简单方法

    本文实例讲述了C#生成条形码图片的简单方法.分享给大家供大家参考.具体实现方法如下: 实现原理: 其实Windows本身就有一个字体是用来显示条形码的. 只要将数字改为这种字体就变成了条形码. windows字体库下,有如下八种字体可以用来将数字转换成条形码: Code39AzaleaNarrow1 Code39AzaleaNarrow2 Code39AzaleaNarrow3 Code39AzaleaRegular1 Code39AzaleaRegular2 Code39AzaleaWide1

  • Android布局生成分享图片代码实例

        首先, 第一次写博客,也不知道说点什么.写的不好的地方希望大家能理解一下! 然后,说一说自己的艰苦过程!因为没有写过这个功能,而公司又强需此功能,我也只好硬着头皮在网上艰苦的寻找此类功能.找了2天,最后还是找到了一篇类似的文章,经过一些修改终于是实现了此功能! 核心类: package app.makemone.ky.com.testapplication; import android.graphics.Bitmap; import android.graphics.Canvas; i

  • php实现图片缩略图的方法

    本段代码实现功能有这些: 支持jpg,jpeg,gif,png,bmp图片格式,支持按原图片的比例进行缩放,可以选择在图片缩放的过程中是否需要对图片进行裁切,加入了图片质量控制,可以实现缩略图片质量最高化. 完整类的代码如下: <?php /** * 功能:php生成缩略图片的类 */ class ResizeImage{ public $type;//图片类型 public $width;//实际宽度 public $height;//实际高度 public $resize_width;//改

  • php将html转为图片的实现方法

    在服务器端解析将编译好的html转换为图片. 由于html一般由客户端浏览器解析,服务器端不能直接解析html代码.所以我们需要借助php类库及扩展完成这一需求. 文件转换过程为 html -> pdf ->png. 需要借助的类库是mPDF ,imagick pdf 官方下载地址是:http://www.mpdf1.com/mpdf/index.php (推荐下在6.0 虽然大了点)这是一个类库直接下载 上传到服务器即可,里面东西不少,新建一个 html2pdf 的文件夹 引入 includ

  • jquery实现图片随机排列的方法

    本文实例讲述了jquery实现图片随机排列的方法.分享给大家供大家参考.具体如下: 该代码可刷新后实现图片随便排列的jQuery特效 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&qu

随机推荐