查看: 80|回复: 1

扣丁学堂PHP培训之PHP如何生成带二维码图片并强制下载功能

发表于 2018-7-9 13:14:43
本篇文章扣丁学堂PHP培训小编和读者们分享一下PHP如何实现生成带二维码图片并强制下载功能,对此不了解或者是想要学习一下的小伙伴可以仔细阅读,下面随着小编一起来看一下吧。





代码如下:

/* 下载二维码 */

public function 测试(){

  // 接收传递的参数

  $data['keys'] = [ 'b01id'=>trim(I('get.b01id')),

       'b02id'=>trim(I('get.b02id')),

       'b03id'=>trim(I('get.b03id')),

       'brid'=>trim(I('get.brid')),

       'unicon'=>trim(I('get.unicon'))];

  if(empty($data['keys']['b01id'])) $this->error('商户不存在',U('Seller/index'),3);

  $res = D('Sellerbrcode')->download($data); //方法在下面

  if(!is_array($res)) $this->error($res,U('Seller/index'),3);

  if(!empty($res['error'])) $this->error($res['error'],U('Seller/seebrcode?'.$res['url']),3);

  // 制作扫码牌

  $bgimg = imagecreatefromstring(file_get_contents($res['bgimg'])); // 拿到背景图做画布

  import('Component/phpqrcode',APP_PATH,'.php');  // 引入二维码生成类

  // 如果有扫码123二维码,则生成扫码123二维码

  if('' != $res['codea']){

   /* 参数说明:

    * 参数1:二维码需要保持的值

    * 参数2:false代表直接输出,其他则是生成的文件名

    * 参数3:纠错级别:L、M、Q、H

    * 参数4:点的大小,数值越大图片越大

    * */

   \QRcode::png($res['codea'], $res['codeimg'], 'H', 18);

   /* 使用图片缩放方法

   bool imagecopyresized($dst_im,$src_im,$dst_x,$dst_y,$src_x,$src_y,$dst_w,$dst_h,$src_w,$src_h)

     dst_im 目标图像链接的资源。

     src_im 源图像链接的资源。

     dst_x X坐标的目的地。

     dst_y y坐标目的地。

     src_x X坐标的源点。

     src_y y坐标源点。

     dst_w 目的地宽度。

     dst_h 目标高度。

     src_w 源宽度。

     src_h 源高度。

    * */

   $codeimg = imagecreatefromstring(file_get_contents($res['codeimg'])); // 拿到二维码图片

   $bg_info = getimagesize($res['codeimg']);        // 得到原二维码图片的大小

   imagecopyresized($bgimg,$codeimg,1520,550,0,70,700,666,$bg_info[0],$bg_info[1]-36);

  }

  // 如果存在银联云闪付二维码,则生成银联云闪付二维码图片

  if('' != $res['codeb']){

   \QRcode::png($res['codeb'], $res['paycodeimg'], 'H', 18);

   $codeimg = imagecreatefromstring(file_get_contents($res['paycodeimg']));// 拿到二维码图片

   $bg_info = getimagesize($res['paycodeimg']);       // 得到原二维码图片的大小

   imagecopyresized($bgimg,$codeimg,236,536,0,80,750,670,$bg_info[0],$bg_info[1]-80);

  }

  // 如果存在商户推广二维码,则生成商户推广二维码图片

  if('' != $res['codec']){

   \QRcode::png($res['codec'], $res['bridimg'], 'H', 18);

   $codeimg = imagecreatefromstring(file_get_contents($res['bridimg'])); // 拿到二维码图片

   $bg_info = getimagesize($res['bridimg']);        // 得到原二维码图片的大小

   imagecopyresized($bgimg,$codeimg,1375,1288,0,0,230,230,$bg_info[0],$bg_info[1]);

  }

  // 如果存在商户名称

  if('' != $res['bName']){

   // 为了让文字居中,需要计算左偏移量

   preg_match_all("/[0-9]{1}/",$res['bName'],$len1);     // 得到字符串中的字数量

   preg_match_all("/[a-zA-Z]{1}/",$res['bName'],$len2);    // 得到字符串中的字母数量

   preg_match_all("/([\x{4e00}-\x{9fa5}]){1}/u",$res['bName'],$len3); // 得到字符串中的中文数量

   $left = 610 - (count($len1[0]) * 16) - (count($len2[0]) * 15) - (count($len3[0]) * 28);

   $res['filename'] .= '_' . $res['bName'];       // 追加二维码名称

   $black = imagecolorallocate($bgimg, 0x20, 0x57, 0xa0);    // 字体颜色

   imagefttext($bgimg, 42, 0, $left, 480, $black,'./Public/font/msyh.ttf',$res['bName']);

  }

  // 如果存在二维码编号,则写入二维码编号

  if('' != $res['brid']){

   $black = imagecolorallocate($bgimg, 0x3e, 0x75, 0xc7);    //字体颜色

   imagefttext($bgimg, 30, 0, 1720,1190, $black,'./Public/font/msyh.ttf',$res['brid']);

  }

  // 添加银联云闪付logo

  $codeimg = imagecreatefromstring(file_get_contents($res['union']));  // 拿到二维码图片

  $bg_info = getimagesize($res['union']);         // 得到原logo图片的大小

  imagecopyresized($bgimg,$codeimg,550,760,0,0,120,120*$bg_info[1]/$bg_info[0],$bg_info[0],$bg_info[1]);

  // 添加添加扫码123logo

  $codeimg = imagecreatefromstring(file_get_contents($res['logo']));  // 拿到二维码图片

  $bg_info = getimagesize($res['logo']);         // 得到原logo图片的大小

  imagecopyresized($bgimg,$codeimg,1805,770,0,0,120,120*$bg_info[1]/$bg_info[0],$bg_info[0],$bg_info[1]);

  $res['filename'] .= '_' . date('Y-m-d',time()) . '.png';    // 追加二维码名称

  header('Pragma: public'); // required

  header('Expires: 0');  // no cache

  header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

  header('Cache-Control: private',false);

  header('Content-Type: application/force-download');

  header('Content-Disposition: attachment; filename="'.$res['filename'].'"');

  header('Content-Transfer-Encoding: binary');

  header('Connection: close');

  imagepng($bgimg);

}

/* 生成图片前 拼接数据 */

public function download($data){

$tool = D('Tool');

// 得到公共类

$mysql = M();

$admin = I('session.admin');

/* 拼接url,方便以下错误时,跳转使用 */

$show['url'] = 'b01id='.$data['keys']['b01id'];

// 如果传递了用户id,那么判断该用户是否属于该商户

if($data['keys']['b03id'])

$show['url'].= '&b03id='.$data['keys']['b03id'];

// 如果传递了二维码id

if($data['keys']['b02id'])

$show['url'].= '&b02id='.$data['keys']['b02id'];

// 如果传递了银联云闪付

if($data['keys']['unicon']) $show['url'].= '&unicon='.$data['keys']['unicon'];

// 如果传递了推广二维码

if($data['keys']['brid'])

$show['url'].= '&brid='.$data['keys']['brid'];

// 调用上部方法得到数据

$data = $this->seebrcode($data,$tool,$mysql,$admin,false);

if(!is_array($data)){ return ['error'=>$data,'url'=>$show['url']]; }

/* 得到要展示的数据

*/

$show['bgimg']

= './Public/img/qrcode/qrcode.png';

// 背景图片地址

$show['logo']

= './Public/img/qrcode/logo.png';

// 扫码123的logo地址

$show['union']

= './Public/img/qrcode/unionPay.png';

// 银联logo地址

$show['codeimg']

= './Public/img/qrcode/code.png';

// 普通二维码生成的保存地址

$show['paycodeimg'] = './Public/img/qrcode/paycode.png';

// 银联二维码生成的保存地址

$show['bridimg']

= './Public/img/qrcode/brid.png';

// 商户推广二维码图片的保存地址

$show['filename']

= '扫码123收款二维码';

// 二维码名称

// 扫码123二维码内容

$show['codea']

= (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? $data['url1'].$data['qrcode'][$data['keys']['b02id']]['brCode'] : '';

// 扫码123二维码编号

$show['brid']

= (!$data['keys']['b02id']) ? '' : isset($data['qrcode'][$data['keys']['b02id']]) ? 'NO.'.$data['keys']['b02id'] : '';

// 银联二维码

$show['codeb']

= (!$data['keys']['unicon']) ? '' : isset($data['qrcode'][$data['keys']['unicon']]) ? $data['qrcode'][$data['keys']['unicon']]['brCode'] : '';

以上就是扣丁学堂PHP在线学习小编给大家分享的PHP如何实现生成带二维码图片并强制下载功能,希望对小伙伴们有所帮助,想要了解更多内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂是专业的PHP培训机构,不仅有专业的老师和与时俱进的课程体系,还有大量的PHP在线教程供学员观看学习,心动的小伙伴快快行动吧。扣丁学堂PHP技术交流群:374332265。


文章转载自:扣丁学堂http://www.codingke.com/

点评

海!外直播 t.cn/RxmJTRo 禁闻视频 t.cn/RJJZmvp 一男子带11罐奶粉过关被抓。网友评论不少:带白粉被抓的见过不少,但是带奶粉被抓还真没见识过。郑渊洁:卖坏奶粉的不坐牢,买好奶粉的坐牢,童话故事都不敢这么写..  发表于 2018-7-9 22:50


回复

使用道具 举报