phpqrcode生成含logo二维码

接上篇文章,由于体验效果不是很合理,重建使用 php 的 GD库进构建新的方法,所需文件:phpqrcode.php
下载方法很多,可官网自行解决问题
话不多说,直接切入正题:
首先 php文件中引入 phpqrcode.php文件

require "./phpqrcode.php";
$text = "******************"; //二维码展示的内容
$logoDir = "./images/shoplogo.png";//二维码中间 logo
$QRDir = "./images/base.png"; //生成的图片路径
if (file_exists($QRDir)) {
    unlink($QRDir);
}
$errorCorrectionLevel = 'H';//容错率
$matrixPointSize = 20;//生成的图片的大小
$margin = 2;
$qrcode = new QRcode();
$qrcode->png($text, $QRDir, $errorCorrectionLevel, $matrixPointSize, $margin);
$resource = imagecreatefrompng($logoDir);
$image_width = imagesx($resource);
$image_height = imagesy($resource);

$targetImg = imagecreatetruecolor($image_width, $image_height);
imagesavealpha($targetImg, true);//保留图片的透明通道
$targetImgBackground = imagecolorallocatealpha($targetImg, 255, 255, 255, 127);//将目标图片设置成透明背景
imagefill($targetImg, 0, 0, $targetImgBackground);//填充透明背景

处理中部的 logo图片

$radius = 15; //圆角半径
// lt(左上角)
$lt_corner = litter_corner($radius);
imagecopymerge($resource, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100);
// lb(左下角)
$lb_corner = imagerotate($lt_corner, 90, 0);
imagecopymerge($resource, $lb_corner, 0, $image_height - $radius, 0, 0, $radius, $radius, 100);
// rb(右上角)
$rb_corner = imagerotate($lt_corner, 180, 0);
imagecopymerge($resource, $rb_corner, $image_width - $radius, $image_height - $radius, 0, 0, $radius, $radius, 100);
// rt(右下角)
$rt_corner = imagerotate($lt_corner, 270, 0);
imagecopymerge($resource, $rt_corner, $image_width - $radius, 0, 0, 0, $radius, $radius, 100);
$image = "./images/logoFinal.png";//过渡圆角 logo
imagepng($resource, $image);

二维码与 logo合并

$QRHasLogo = mergeImg($QRDir, $image);
if (file_exists($image)) {
    unlink($image);
}
//与背景合并
$path_1 = './images/fkpay11.jpg'; //背景图片
// 图片二
$path_2 = $QRHasLogo;
// 创建图片对象
$image_1 = imagecreatefromjpeg($path_1);
$image_2 = imagecreatefrompng($path_2);
// 合成图片
imagecopymerge($image_1, $image_2, 167, 500, 0, 0, imagesx($image_2), imagesy($image_2), 100);
// 输出合成图片
imagepng($image_1, $QRDir);

店铺名称转图片

$save_path = "./images/texttopng.png";
$text = "小二郎的店铺";//显示的文字
$font_size = 70;//字体大小
$save_path = textToPng($save_path,$text,$font_size);

将文件与生成好的二维码图片进行合并

$QRDir = mergeImg($QRDir,$save_path,820,120,50);

处理的几个方法:

/**
 * 设置 logo 圆角
 * @param $radius
 * @return resource
 */
function litter_corner($radius)
{
    $img = imagecreatetruecolor($radius, $radius);
    imagesavealpha($img, true);
    $bgcolor = imagecolorallocatealpha($img, 0, 0, 0, 127);
    $fgcolor = imagecolorallocate($img, 0, 0, 0);
    imagefill($img, 0, 0, $bgcolor);
    imagefilledarc($img, $radius, $radius, $radius * 2, $radius * 2, 180, 270, $fgcolor, IMG_ARC_PIE);
    imagecolortransparent($img, $fgcolor);
    return $img;
}

/**
 * 二维码与 logo合并
 * @param $QRDir 背景图片
 * @param $image 小图片
 * @return mixed
 */
function mergeImg($QRDir, $image,$height = 0,$logow=0,$logoh=0)
{
//二维码与 logo合并
    $QR = imagecreatefrompng($QRDir);//这里qr.png是二维码的图片
    $logo = imagecreatefrompng($image);//圆角二维码logo
    $QR_width = imagesx($QR);//二维码图片宽度
    $QR_height = imagesy($QR);//二维码图片高度
    $logo_width = imagesx($logo);//logo图片宽度
    $logo_height = imagesy($logo);//logo图片高度
    $logo_qr_width = $QR_width / 5 + $logow;
    $scale = $logo_width / $logo_qr_width;
    $logo_qr_height = $logo_height / $scale + $logoh;
    $from_width = ($QR_width - $logo_qr_width) / 2;
//重新组合图片并调整大小
    imagecopyresampled($QR, $logo, $from_width, $from_width+$height, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
    $QRHasLogo = $QRDir;//最终得到的带有logo的二维码
//$QRHasLogo = "./images/QRHasLogo.png";//最终得到的带有logo的二维码
    imagepng($QR, $QRHasLogo);
    return $QRHasLogo;
}

/**
 * 文本转图片
 * @param $save_path 文本图片存储路径
 * @param $text   将要转的文本
 * @param $font_size 文本大小
 * @return mixed
 */
function textToPng($save_path,$text,$font_size){
    $font = "./font/msyh.TTF";//字体类型
    $fontarea = imagettfbbox($font_size, 0, $font, $text); //确定会变化的字符串的位置
    $text_width = $fontarea[2] - $fontarea[0] + ($font_size / 3); //字符串文本框长度
    $text_height = $fontarea[1] - $fontarea[7] + ($font_size / 3); ////字符串文本框高度
    $img = imagecreate($text_width, $text_height);
//$img = imagecreate(500, 30);//创建一个长为500高为16的空白图片
    imagecolorallocate($img, 255, 255, 255);//设置图片背景颜色,这里背景颜色为#ffffff,也就是白色
    $black = imagecolorallocate($img, 0, 0, 0);//设置字体颜色,这里为#000000,也就是黑色
    imagettftext($img, $font_size, 0, 6, $font_size + 18, $black, $font, $text);//将ttf文字写到图片中
    header('Content-Type: image/png');//发送头信息
    imagepng($img, $save_path);//输出图片

    return $save_path;
}

到此就已经完成了类似支付宝收款码的图片了。如有参考,可将代码整合成文件直接使用
创作不易,点个赞再走呗!!!

你可能感兴趣的:(qrcode)