印出去之前,先把二维码解码读一遍

六种内容、300 dpi 下的真实毫米、四种模块形状、三种定位块、渐变和中间图片——每一种组合都会先解码回读,读不出来就没有下载。

🔒 100% 浏览器内运行 · 零服务器上传

这个页面不会发出任何东西:没有账号、没有上传、没有图床。中间图片只从你自己的硬盘读进画布,不会发到任何地方。

马来西亚规则与特殊情况

每种内容都有自己的语法,而每种语法都保留了若干字符。手写出来的 WIFI:T:WPA;S:Kedai;P:p@ss;word;; 会在那个分号处结束密码字段:手机用 p@ss 去连接,顾客被告知密码错误,而现场没有人看得出原因。本页把每个 Wi-Fi 字段里的 \、;、,、: 和 " 都加反斜杠转义,并把转义后的内容印在二维码下面,所以印之前就能看见真正写进去的是什么。

其他类型遵守同一条规矩。联系人名片是 vCard 3.0,换行用 CRLF,不折行,属性顺序按规范来(VERSION 紧接 BEGIN,然后是 N 和 FN)。电话是 tel:,短信是 SMSTO:,电子邮件是 mailto:,主题和正文做百分号编码,所以主题里的 & 到达时还是 &,不会把参数截断。

  • 对比度按更浅的那个色标算。渐变是两种墨色,整块码只跟它最浅的一半一样能扫:顶部 21:1 并不能说明底部那个快要融进纸里的浅色。4.5:1 的下限套在更浅的色标与背景之间,低于它就不提供下载。
  • 静区是二维码的一部分。四周各四个浅色模块(ISO 18004)。没有它,阅读器找不到符号的边界,所以固定为四模块,不是可以调小的选项。
  • 中间图片是有限额的损伤。它坐在两模块宽的白色垫底里,边长上限是码面边长的 30%,有图片时纠错强制为 H——H 能恢复约三分之一的码字,这正是一块 15 毫米 logo 的代价。超过 30% 直接拒绝,并在句子里写出实际百分比。
  • 整数像素,诚实的毫米。300 dpi 下一个模块必须是整数像素,所以要求 50 毫米会印成取整后的真实尺寸;页面报的是打印机真正产出的尺寸,PNG 里带真正的 pHYs 块,Word 或 Canva 才会按这个尺寸放置,而不是按 96 dpi 缩小。
  • 能下载,是因为读得回来。画完之后,画布按它被绘制时的尺寸解码——最近邻取样,绝不用平滑放大的副本,因为平滑会把圆点模块之间一像素的缝隙糊成灰网格,把好码报成坏码。解出来的字符串不一致,按钮就不会出现。

处理前后

处理前

tools.hoelee.com/qr-code-generator

处理后

https://tools.hoelee.com/qr-code-generator

使用方法

  1. 选内容类型——文本或网址、Wi-Fi、联系人名片、电话、短信、电子邮件——只填那一块。真正写进码里的字符串会随输入出现在二维码下面。
  2. 调整外观:模块形状、角落定位块形状、颜色、可选的双色渐变、以毫米计的打印尺寸,以及说明文字。每次改动都会重新绘制并重新验证。
  3. 回读那一行变绿再下载。PNG 是带真实 pHYs 块的 300 dpi 文件,SVG 是同一套几何的矢量文件。

常见问题

为什么有时候不让我下载?

因为画出来的二维码没有解码回原来的内容。常见原因是中间图片太大、渐变较浅的一端太接近背景,或者尺寸小到一个模块只有一个像素。二维码下面的那句话会点明是哪一个原因,字符串不一致就不会有文件。

加了 logo 会不会扫不出来?

有可能,所以工具给它设了上限。中间图片连同白色垫底会盖住码字,纠错等级 H 大约能重建其中 30%。logo 占码面 20% 时用 H 是安全的;超过 30% 余量就不够了,工具会直接拒绝这个尺寸,而不是印出一张在桌上扫不出来的卡片。

渐变真的会让二维码失效吗?

只有一端太浅时才会。摄像头需要浅底深码;从黑色渐变到浅灰,最后几行的模块几乎和纸一个颜色,解码器就会一行一行地丢掉它们。所以对比度检查量的是更浅的色标,不是平均值。

到底应该印多大才扫得出来?

桌面立牌大约 5 厘米,小贴纸 3 厘米,带网址的码不要小于 2.5 厘米——廉价手机摄像头在店铺灯光下每模块大约需要八个像素。页面报的是取整到整数像素之后剩下的尺寸,也就是打印机真正产出的尺寸。

加图片的时候会上传什么吗?

不会。文件只从你的硬盘读进浏览器里的画布,再写进你下载的 PNG 和 SVG。这个工具没有服务器、没有账号、没有图床,页面自带的审计也会确认没有任何请求发出去。