qrcode
问题起源
最近尝试了一下用phpqrcode生成二维码的功能,发现没有添加中间logo的功能,于是自己改了源码写了一个功能。百度能搜到的都是在phpqrcode生成文件的基础上二次添加的,这样对于强迫症来说是有一点性能损耗的,因为每次都伴随着文件的生成和读取,于是自己添加了一个直接在原基础上生成带logo的二维码。可选是否生成文件。
使用方法
代码语言:javascript复制类库下载地址 :https://github.com/ShyZhen/phpqrcode
require_once '../phpqrcode.php';
$text = 'https://www.litblc.com';
$level = 1;
$size = 10;
$margin = 1;
$logo = './logo.png';
$saveName = false;
/**
* 生成中间带有logo的二维码
* @Author huaixiu.zhen
* http://litblc.com
* @param string $text 要生成的url
* @param int $level 容错率 推荐使用 >= 1 的值
* @param int $size 控制生成图片的大小
* @param int $margin 控制生成二维码的空白区域大小
* @param string $logo 中间要加的logo的物理地址
* @param string $saveName 是否保存,可以输入路径和文件名
*/
QRcode::addLogo($text, $level, $size, $margin, $logo, $saveName);
源码解读
代码语言:javascript复制 /**
* 生成中间带有logo的二维码
* @Author huaixiu.zhen
* http://litblc.com
* @param string $text 要生成的url
* @param int $level 容错率 推荐使用 >= 1 的值
* @param int $size 控制生成图片的大小
* @param int $margin 控制生成二维码的空白区域大小
* @param string $logo 中间要加的logo物理地址
* @param string $saveName 是否保存,可以输入路径和文件名
*/
public static function addLogo($text, $level, $size, $margin, $logo, $saveName = '')
{
// Copyright 2018 litblc, shyZhen
// May be used under the terms of the GNU Lesser General Public License (LGPL)
$img = self::png($text, 'resource', $level, $size, $margin, false);
if (file_exists($logo)) {
$logo = imagecreatefromstring (file_get_contents($logo));
} else {
die('logo file not exists');
}
// 真彩色图像转换为调色板图像,防止颜色失真
if (imageistruecolor($logo)) {
imagetruecolortopalette($logo, false, 65535);
}
$QR_width = imagesx($img);
$logo_width = imagesx($logo);
$logo_height = imagesy($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($img, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
header("content-type: image/png");
if ($saveName) {
ImagePng($img, $saveName);
ImagePng($img);
} else {
imagepng ($img);
}
}
主要是修改源码使之返回图像资源,在图像资源上进行操作。其他部分修改不在这里展示了,缺点是只对生成png格式的二维码方法进行了修改,满足了我大部分的要求。