PHPQRCode 是一个非常流行的、用 PHP 编写的二维码生成库,它基于著名的 libqrencode C 语言库,并将其封装成了易于在 PHP 项目中使用的类。
核心类
PHPQRCode 的核心是 QRcode 类,位于 phpqrcode.php 文件中,我们主要使用它的 png() 静态方法来生成二维码图片。
QRcode::png() 方法详解
这是最常用、最核心的方法,用于直接输出一个 PNG 格式的二维码图片。
方法签名
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint = false)
参数详解
下面我们逐一解释每个参数的含义和可选值。
$text (必需)
- 类型:
string - 说明: 这是你要编码生成二维码的文本内容,可以是网址、文本、电子邮件地址、电话号码等任何信息。
- 示例:
$text = 'https://www.example.com'; // 网址 $text = '你好,世界!'; // 中文文本 $text = 'mailto:someone@example.com'; // 邮箱
$outfile (可选)
-
类型:
string或boolean -
说明: 这个参数控制二维码的输出方式。
false(默认值): 直接将二维码图片以二进制流的形式输出到浏览器,当你想在网页上直接显示二维码时使用此选项。string(文件路径): 将二维码图片保存到指定的服务器路径下。'qrcodes/my_qr_code.png',如果目录不存在,你需要确保 PHP 有权限创建它。
-
示例:
// 直接输出到浏览器 QRcode::png($text); // 保存到服务器文件 QRcode::png($text, './my_qr.png');
$level (可选)
- 类型:
string或integer - 说明: 定义二维码的容错级别,容错级别越高,二维码在被部分遮挡或损坏时就越容易被扫描成功,但这也会导致二维码数据密度增加,在相同尺寸下能存储的信息变少。
- 可选值:
QR_ECLEVEL_L(或'L'): 低 (~7%),默认值,适用于对容错要求不高的场景。QR_ECLEVEL_M(或'M'): 中 (~15%),最常用的级别,在纠错能力和信息容量之间取得了很好的平衡。QR_ECLEVEL_Q(或'Q'): 四分 (~25%)。QR_ECLEVEL_H(或'H'): 高 (~30%),适用于打印在易被刮花或不平整的表面(如包装箱、金属牌)。
- 示例:
// 使用中等容错级别 QRcode::png($text, false, QR_ECLEVEL_M);
$size (可选)
- 类型:
integer - 说明: 定义二维码中每个小黑点(模块)的像素尺寸。
- 注意: 这个值不是二维码最终输出的宽高,而是单个模块的大小,二维码的总宽高 =
(模块数量 + 边距) * $size。 - 值越大,二维码图片越大,也越清晰,但过大的值可能导致二维码在尺寸有限的屏幕上显示不全。
- 有效值通常为 1 到 10 之间的整数。
- 注意: 这个值不是二维码最终输出的宽高,而是单个模块的大小,二维码的总宽高 =
- 示例:
// 每个模块用 5 个像素点绘制 QRcode::png($text, false, QR_ECLEVEL_M, 5);
$margin (可选)
- 类型:
integer - 说明: 定义二维码的空白边距大小,单位是模块数(不是像素),边距是二维码周围一圈的空白区域,有助于扫描设备识别二维码的边界。
- 值越大,二维码周围的空白越多。
- 根据二维码规范,最小边距为 4 个模块,所以此参数的最小有效值通常是 4。
- 示例:
// 设置边距为 8 个模块 QRcode::png($text, false, QR_ECLEVEL_M, 4, 8);
$saveandprint (可选)
- 类型:
boolean - 说明: 这个参数只在
$outfile不为false(即指定了保存路径)时才有效。false(默认值): 仅将二维码保存到$outfile指定的文件中。true: 在将二维码保存到文件的同时,还会将图片直接输出到浏览器,这在某些需要同时保存和预览的场景下很有用。
- 示例:
// 保存到文件,并同时显示在浏览器上 QRcode::png($text, './my_qr.png', QR_ECLEVEL_M, 4, 4, true);
其他常用功能(带参数)
除了 png() 方法,PHPQRCode 还提供了一些其他有用的静态方法,它们通常也有自己的参数。
QRcode::text() - 生成带 Logo 的二维码
这是一个非常实用的功能,但需要手动拼接图片,它本身不直接生成带 Logo 的二维码,而是返回二维码图片的资源流,供你后续处理。
工作流程:
- 使用
QRcode::png()将二维码内容保存到一个临时变量(而不是直接输出)。 - 使用 PHP 的 GD 库函数(
imagecreatefromstring,imagecreatefrompng等)创建二维码和 Logo 的图像资源。 - 计算Logo的位置(通常在二维码中心)。
- 使用
imagecopy()或imagecopyresampled()将Logo图像“画”到二维码图像上。 - 使用
imagepng()或imagejpeg()将最终合成后的图像输出或保存。
示例代码:
// 1. 生成二维码数据
$text = 'https://www.example.com';
$qrcode_data = QRcode::png($text, false, QR_ECLEVEL_H, 10, 2); // false 表示返回数据流
// 2. 创建图像资源
$qrcode_img = imagecreatefromstring($qrcode_data);
$logo_img = imagecreatefrompng('path/to/your/logo.png'); // 你的Logo图片
// 3. 获取尺寸
$qrcode_width = imagesx($qrcode_img);
$qrcode_height = imagesy($qrcode_img);
$logo_width = imagesx($logo_img);
$logo_height = imagesy($logo_img);
// 4. 计算Logo位置(居中)
$logo_x = ($qrcode_width - $logo_width) / 2;
$logo_y = ($qrcode_height - $logo_height) / 2;
// 5. 合并图像
// imagecopy($qrcode_img, $logo_img, $logo_x, $logo_y, 0, 0, $logo_width, $logo_height);
// 为了让Logo更自然,可以先给Logo加个白色背景
$white_bg = imagecreatetruecolor($logo_width, $logo_height);
imagefill($white_bg, 0, 0, imagecolorallocate($white_bg, 255, 255, 255));
imagecopy($white_bg, $logo_img, 0, 0, 0, 0, $logo_width, $logo_height);
imagecopy($qrcode_img, $white_bg, $logo_x, $logo_y, 0, 0, $logo_width, $logo_height);
imagedestroy($white_bg);
// 6. 输出最终图片
header('Content-Type: image/png');
imagepng($qrcode_img);
// 7. 释放内存
imagedestroy($qrcode_img);
imagedestroy($logo_img);
完整示例代码
这是一个完整的、可以直接运行的 PHP 文件示例,它生成了一个二维码并显示在网页上。
<?php // 引入 PHPQRCode 库 // 确保你的 phpqrcode.php 文件和这个脚本在同一目录下,或者提供正确的路径 include "phpqrcode.php"; // 1. 准备要编码的数据 $data = "https://github.com/treffynnon/PHPQRCode"; // 2. 设置二维码参数 // 文件名(false表示直接输出到浏览器) $filename = false; // 纠错级别 $errorCorrectionLevel = 'L'; // 二维码每个小点的像素尺寸 $PointSize = 10; // 二维码的边距 $margin = 2; // 3. 生成二维码 // 调用静态方法 QRcode::png() 来生成二维码 QRcode::png($data, $filename, $errorCorrectionLevel, $PointSize, $margin); ?>
将上述代码保存为 generate_qr.php,在浏览器中访问它,你就会看到一个二维码图片。
