endroid/qr-code生成二维码需php启用gd或imagick扩展,否则报错或输出乱码;中文内容必须url编码;尺寸、边距、颜色需分别用setsize()、setmargin()、setforegroundcolor()等设置,且margin不可为0。

直接用 endroid/qr-code 生成二维码图片是可行的,但「引入就能用」这个说法容易让人忽略关键前提:PHP 环境必须支持 GD 或 Imagick,且默认配置下可能导出空白图或报错。
为什么 new QrCode('xxx')->writeFile() 生成的图片打不开?
最常见原因是 PHP 缺少图像扩展支持。该库默认依赖 gd,若未启用,会静默回退到纯文本模式(输出乱码)或抛出 RuntimeException: No suitable image extension available。
- 运行
php -m | grep -i gd确认gd已加载;没输出就需安装(如 Ubuntu 上执行sudo apt install php-gd) - 若用 Docker,确保
Dockerfile中包含docker-php-ext-install gd - Windows 用户注意:php.ini 中需取消注释
extension=gd(不是php_gd2.dll) - 不依赖 GD?可显式指定
ImagickWriter,但需先装imagick扩展和系统 ImageMagick
生成中文内容二维码时出现乱码或方块
endroid/qr-code 默认使用 Latin-1 编码,直接传入 UTF-8 字符串会导致 QR 解码失败或显示异常。
- 务必对内容做 URL 编码:
urlencode($chineseString),再传给QrCode构造函数 - 若需扫码后还原为原始中文,扫码端要能正确 decode(多数现代扫码器支持,但旧设备可能只显示编码后的字符串)
- 不推荐改库源码强行设字符集——底层 QR 标准本身不内建 UTF-8 标识,靠编码层处理更可靠
如何控制二维码尺寸、边距和颜色?
尺寸和样式不能只靠 setSize(),它仅设置像素宽高;实际清晰度还取决于渲染方式与缩放逻辑。
-
setSize(300)表示输出 300×300 像素图,但若内容复杂(如长 URL),纠错等级低时可能无法容纳,应配合setMargin(10)避免边缘被裁 - 颜色通过
setForegroundColor()和setBackgroundColor()设置,参数是 RGB 数组,如[0, 0, 0](黑)或[255, 255, 255](白) - 避免用
setRoundBlockSize(true)在低分辨率下生成——圆角在小尺寸(如 100px)时易糊,建议 ≥200px 再启用 - 导出 PNG 时默认无压缩,若需减小体积,得自己用
imagepng($resource, null, 9)控制质量(但该库不暴露此接口,只能换 writer 或后处理)
真正卡住人的往往不是「会不会引 Composer」,而是环境缺 GD、中文没 urlencode、或者 margin 设为 0 导致扫码器识别率骤降——这些点不手动验证一遍,光跑通 demo 没用。











