phpqrcode 是基于 libqrencode C 库的纯 PHP 实现,LGPL 协议开源,支持 QR Code 版本 1-40、数字/字母/8位/Kanji 编码,输出 PNG/JPEG/位表,无依赖(仅需 GD2),易配置,含缓存加速、调试基准、30+ 示例。
库原生按模块大小(pixelPerPoint)生成,图片尺寸随内容长度变化。若需固定宽高(如 500x500px),需修改源码 qrimage.php 的 imageCreate 与 ImageCopyResized 逻辑。
--- original/phpqrcode/qrimage.php 2010-08-18 07:06:24.000000000 -0700
+++ qrimage.php 2012-07-13 00:51:57.000000000 -0700
@@ -86,10 +86,15 @@
}
}
- $target_image = ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
- ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+
+ $targetW = (defined('IMAGE_WIDTH') ? IMAGE_WIDTH : $imgW * $pixelPerPoint);
+ $targetH = (defined('IMAGE_HEIGHT') ? IMAGE_HEIGHT : $imgH * $pixelPerPoint);
+
+ $target_image = ImageCreate($targetW, $targetH);
+
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $targetW, $targetH, $imgW, $imgH);
ImageDestroy($base_image);
return $target_image;
}
-}
\ No newline at end of file
+}
<?php
// 生成前定义常量(必须在 include phpqrcode.php 之前)
define('IMAGE_WIDTH', 500);
define('IMAGE_HEIGHT', 500);
require_once 'phpqrcode/qrlib.php'; // 或 qrimage.php
QRcode::png('https://www.example.com/');
// 输出 500x500 像素的 PNG 二维码图片
?>
| 方法 | 说明 |
|---|---|
QRcode::png($text, $outfile=false, $level='L', $size=3, $margin=4) | 生成 PNG,$outfile 为 false 直接输出,为路径则保存文件。 |
QRcode::text($text, $outfile=false, $level='L', $size=3, $margin=4) | 输出 ASCII 字符画。 |
QRcode::svg($text, $outfile=false, $level='L', $size=3, $margin=4) | 生成 SVG 矢量图(需库支持)。 |
$level | 纠错级别:L(7%)、M(15%)、Q(25%)、H(30%)。 |
$size | 每个模块像素大小(应用补丁后仅作初始画布参考,最终尺寸由常量决定)。 |
$margin | 静区宽度(模块数),建议 ≥4。 |
<?php
define('IMAGE_WIDTH', 600);
define('IMAGE_HEIGHT', 600);
require_once 'phpqrcode/qrlib.php';
// 1. 生成二维码到临时文件
$tmpFile = sys_get_temp_dir() . '/qr_' . md5('https://example.com') . '.png';
QRcode::png('https://example.com', $tmpFile, 'H', 4, 2);
// 2. 合成 Logo(需 GD 支持)
$qr = imagecreatefrompng($tmpFile);
$logo = imagecreatefrompng('logo.png'); // 透明背景 PNG
$qrW = imagesx($qr);
$qrH = imagesy($qr);
$logoW = imagesx($logo);
$logoH = imagesy($logo);
// Logo 占二维码 1/5 面积,居中
$dstX = ($qrW - $logoW) / 2;
$dstY = ($qrH - $logoH) / 2;
imagecopy($qr, $logo, $dstX, $dstY, 0, 0, $logoW, $logoH);
// 3. 输出最终图片
header('Content-Type: image/png');
imagepng($qr);
imagedestroy($qr);
imagedestroy($logo);
unlink($tmpFile);
?>
QRcode::$cacheDir = '/tmp/phpqrcode_cache'; 避免重复计算。<img src="qrcode.png">,减少 PHP 动态渲染压力。$size * 模块数 决定,随内容长度变化。ImageCopyResized 非插值缩放,放大时有锯齿。可改用 ImageCopyResampled(需修改补丁),或增大 $size 参数生成更大源图再缩小。