123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <?php
- namespace app\common\util;
- class QrcodeUtil
- {
- /**
- * @param $yqcode 二维码内容
- * @param int $type 0=二维码输出内容 1=保存二维码到指定位置
- * @param string $savepath
- * @return bool|false|resource
- */
- static public function create($yqcode,$type=0,$savepath='',$size=6){
- try{
- //生成二维码图片
- $errorCorrectionLevel = 3 ;//容错级别
- $matrixPointSize = $size;//生成图片大小
- $temp = './uploads/temp/'.md5($yqcode).mt_rand(1000,9999).'.png';
- if($type == 1){
- $dirfile = dirname($savepath);
- if(!file_exists($dirfile)){
- @mkdir($dirfile,0777);
- }
- $matrixPointSize = 4;
- }
- //判断本地是否存在临时的先删了
- if (file_exists($temp)) {
- @unlink($temp);
- }
- //生成二维码图片
- include_once env('root_path').'/extend/phpqrcode/phpqrcode.php';
- \QRcode::png($yqcode, $temp, $errorCorrectionLevel, $matrixPointSize, 2);
- $logo = env('root_path').'/public/logo.png';
- if (!empty($logo)) {
- $QRBuffer = self::addLogoQrcode($temp, $logo);
- } else {
- $QRBuffer = imagecreatefromstring(self::print72dip300dip(file_get_contents($temp)));
- }
- //删除临时文件
- if (file_exists($temp)) {
- @unlink($temp);
- }
- if($type == 0){
- return $QRBuffer;
- }else{
- imagejpeg($QRBuffer,$savepath,100);
- ImageDestroy($QRBuffer);
- return true;
- }
- }catch (\Exception $e){
- return false;
- }
- }
- //添加LOGO
- public static function addLogoQrcode($QRTempPath, $logoPath)
- {
- $QRBuffer = imagecreatefromstring(self::print72dip300dip(file_get_contents($QRTempPath)));
- $logo = imagecreatefromstring(self::print72dip300dip(file_get_contents($logoPath)));
- $QR_width = imagesx($QRBuffer);//二维码图片宽度
- $QR_height = imagesy($QRBuffer);//二维码图片高度
- $logo_width = imagesx($logo);//logo图片宽度
- $logo_height = imagesy($logo);//logo图片高度
- $logo_qr_width = $QR_width / 5;
- $scale = $logo_width/$logo_qr_width;
- $logo_qr_height = $logo_height/$scale;
- $from_width = ($QR_width - $logo_qr_width) / 2;
- //重新组合图片并调整大小
- imagecopyresampled(
- $QRBuffer,
- $logo,
- $from_width,
- $from_width,
- 0,
- 0,
- $logo_qr_width,
- $logo_qr_height,
- $logo_width,
- $logo_height
- );
- return $QRBuffer;
- }
- //浏览器默认输出为72DPI,打印要求为300DPI
- public static function print72dip300dip($QRBufferStr)
- {
- //数据块长度为9
- $len = pack("N", 9);
- //数据块类型标志为pHYs
- $sign = pack("A*", "pHYs");
- //X方向和Y方向的分辨率均为300DPI(1像素/英寸=39.37像素/米),单位为米(0为未知,1为米)
- $data = pack("NNC", 300 * 39.37, 300 * 39.37, 0x01);
- //CRC检验码由数据块符号和数据域计算得到
- $checksum = pack("N", crc32($sign . $data));
- $phys = $len . $sign . $data . $checksum;
- $pos = strpos($QRBufferStr, "pHYs");
- if ($pos > 0) {
- //修改pHYs数据块
- $QRBufferStr = substr_replace($QRBufferStr, $phys, $pos - 4, 21);
- } else {
- //IHDR结束位置(PNG头固定长度为8,IHDR固定长度为25)
- $pos = 33;
- //将pHYs数据块插入到IHDR之后
- $QRBufferStr = substr_replace($QRBufferStr, $phys, $pos, 0);
- }
- return $QRBufferStr;
- }
- }
|