接上篇文章,由于体验效果不是很合理,重建使用 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;
}
到此就已经完成了类似支付宝收款码的图片了。如有参考,可将代码整合成文件直接使用
创作不易,点个赞再走呗!!!