首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

使用 phpqrcode 库生成二维码的完整指南与固定尺寸技巧

     編輯:PHP 相關知識

phpqrcode 简介

phpqrcode 是基于 libqrencode C 库的纯 PHP 实现,LGPL 协议开源,支持 QR Code 版本 1-40、数字/字母/8位/Kanji 编码,输出 PNG/JPEG/位表,无依赖(仅需 GD2),易配置,含缓存加速、调试基准、30+ 示例。

核心痛点:生成固定尺寸图片

库原生按模块大小(pixelPerPoint)生成,图片尺寸随内容长度变化。若需固定宽高(如 500x500px),需修改源码 qrimage.php 的 imageCreate 与 ImageCopyResized 逻辑。

补丁文件(diff 格式)

--- 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。

完整示例:生成带 Logo 的固定尺寸二维码

<?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'; 避免重复计算。
  • 高并发场景考虑使用 chillerlan/php-qrcode(现代重写、Composer 支持、更多输出格式)。
  • 生产环境建议预生成静态二维码文件,前端直接 <img src="qrcode.png">,减少 PHP 动态渲染压力。

常见问题 FAQ

Q: 为什么不定义常量也能生成图片?
A: 未定义常量时走原逻辑,尺寸由 $size * 模块数 决定,随内容长度变化。
Q: 定义常量后图片变模糊?
A: ImageCopyResized 非插值缩放,放大时有锯齿。可改用 ImageCopyResampled(需修改补丁),或增大 $size 参数生成更大源图再缩小。
Q: 支持中文内容吗?
A: 支持 UTF-8 编码字符串直接传入,库内部按 8-bit 模式编码。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved