← 全部文章

艺术二维码为什么还能扫:半色调的思路

2026-10-17 · 更新于 2026-10-26 artistic halftone scannability design

艺术二维码之所以还能扫,是因为有些解码器并不会把每个模块当作整体来判断。开源解码器 ZXing 就是在每个模块计算出的中心点读取一个像素。Chu 等人在 2013 年提出的半色调方法正是基于这一点:每个模块的中心保留一个颜色正确的点,图片从它周围透出来。一旦模糊或覆盖物碰到了中心,这个技巧就会失效,所以每个设计都需要解码测试和印刷样张。

事实核查于 2026 年 10 月 17 日。

扫码器看哪里,跳过哪里

下面的结构出自 ISO/IEC 18004 的 2006 年版;第四版于 2024 年 8 月发布,我们没有读过它的全文。二维码有三个相同的定位图形,由深色 7×7、浅色 5×5 和深色 3×3 模块组成,比例为 1:1:3:1:1;找到这三个图形,识别器就知道码在哪里、旋转了多少。之后,定时图形和校正图形帮助它确定模块网格的位置。

网格确定后,解码器对每个模块取样。一篇 2022 年的 EUSIPCO 论文以「只对每个模块的中心像素取样」为前提,但补充说,如果取样网格的估计有误差,附近的像素也可能被取到。我们没有核实 iPhone 和安卓手机自带相机是怎么解码的,所以请把 ZXing 当作一个例子,而不是所有手机的情况。

半色调的思路

Chu、Chang、Lee 和 Mitra 于 2013 年 11 月在《ACM Transactions on Graphics》上发表了《Halftone QR Codes》。论文的模型把每个模块分成 3×3 个子模块,把模块的颜色绑定在中心那一个上,其余八个可以自由地跟随半色调图像。他们指出,在理想条件下,只要中心颜色正确,任何图案都应该能让模块被读出。他们只改动数据模块。

可以把它理解为对每个模块的承诺:中心永远是对的,其余部分可以显示图片。如果解码器恰好取中心,图片就不会破坏任何码字,纠错能力就留作后备(这是我们的理解,不是论文的说法)。实际取样并不完美,后备就是在这里被用掉的。作者还介绍了一个可选步骤,在他们的测试中会有意用掉最多一半的纠错容量。

论文坦率地说明了代价:它把下采样造成的模糊列为局限,因为承载数据的中心像素很容易被相邻像素污染。在一项针对五个码、三名用户和四款手机条码识别应用的测试中,半色调码在高斯模糊半径 2 像素、视角 40 度时就失效了;对应的普通码要到 6 像素和 60 度才失效。同一篇论文报告,用默认设置生成的 100 个码中,有 91 个能被全部四款识别应用读出。测试用的是一部 800 万像素的手机和显示器上显示的码,所以请把结果当作方向,而不是对今天手机的预测。

艺术码会坏在哪里

每一行要么破坏了「只取中心」的假设,要么用掉了纠错容量。最后一列标出了哪些是我们自己的推理。

你做了什么出了什么问题依据
在深色背景上放浅色模块2006 年版允许深底浅码,但是否尝试反色图像由各个解码器自己决定。ZXing 只有在调用方设置提示参数时才会尝试;jsQR 默认两种都试,速度约降低 50%。标准、两个解码器;未核实手机相机
在三个角的图形上作画它们负责定位和确定方向,而 Chu 等人只改动数据模块。2006 年版;Chu 等人
边距不足四个模块2006 年版要求四个模块宽的静区。DENSO WAVE 说,码周围有文字或图片就无法保证所需的边距。2006 年版;DENSO WAVE
缩小中心点以露出更多图片当取样网格略有偏差时余量更小;在 2013 年的测试中,半色调码能承受的模糊和角度也更小。EUSIPCO 2022;Chu 等人;与点大小的关联是我们的推论
用图片的颜色给点着色深浅差距可能变小。ZXing 的二值化器会把最亮和最暗像素相差不超过 24 级(0 到 255 的刻度)的 8×8 像素块视为只含浅色或只含深色像素,并改用另一种方式估算阈值。ZXing 源码;与着色的关联是我们的推论

为什么「30% 纠错」不等于 30% 的面积

2006 年版给出 L、M、Q、H 四级的大致恢复能力分别为 7%、15%、25% 和 30%,计算的是码字所占的比例。DENSO WAVE 同样用占总码字的比例来表示纠错率。标准还说,翻转一个模块会让它所在的字符被解码成一个看似有效、实则不同的码字,修复它需要两个纠错码字。它举的例子是:版本 6-H 的码有 172 个码字,其中 112 个用于纠错,可以修复 56 个误码,即容量的 32.6%。

所以任何面积百分比都只是猜测。按我们对标准中位排布图的理解,规则码中一个码字占据两列宽、四行高的区域,因此据我们推断,零散的小斑点可能比同样面积的一整块碰到更多码字。我们不对一个设计可以覆盖多少面积作任何断言。如何选择纠错级别,请看纠错级别详解;成品示例请看按行业划分的设计思路。

印刷前怎样检查艺术码

  1. 从 H 级纠错和尽可能短的内容开始。 在相同印刷尺寸下,内容越长模块越小,而 DENSO WAVE 说模块越大越稳定、越容易读取。数据容量指南展示了码会长得多快。
  2. 检查每一处的深浅对比。 把设计转成灰度。不论在图片的亮部还是暗部,每个深色点都应当明显比它旁边的浅色点更深。
  3. 以多种尺寸做数字解码。 免费的可扫性检查在你的浏览器里运行,不上传图片,会测试对比度和静区,在缩小的尺寸下复测,并标出只有反色后才能解码的码。
  4. 打印样张,用不同手机扫描。 标准的资料性附录要求在最终的标签或包装形态下验证码,因为「覆盖层、透印以及弯曲或不规则的表面都会影响码的可读性」。Chu 等人看到同一部手机上的四款条码识别应用表现各不相同,所以至少用两部手机,在实际距离和光线下测试。最小宽度请看印刷尺寸指南。
  5. 如果失败,每次只改一处。 放大中心点、降低图片对比度、印大一些或删减内容,然后重复第 3 和第 4 步。

内置检查能告诉你什么,不能告诉你什么

在 QR Maker AI 编辑器中,节日主题和像「福」字这样的图案半色调是免费的;截至 2026 年 10 月,图片融合(把你自己的图片放在点下面)是 Pro 功能(见价格方案)。对于图案半色调和图片融合,编辑器在每个模块只画一个中心点,在定位图形、校正图形和 logo 区域下面铺一块实心浅色底,并把纠错级别设为 H。

编辑器的 Scan Guard 检查会在你的浏览器里,以正常尺寸和几个更小的尺寸解码渲染出的码,使用的是一个开源解码器,且只按浅底深码的模式解码。它无法测试深底浅码、纸张、油墨、弯曲表面或任何手机的相机,所以第 4 步的印刷样张不能省。可以在编辑器里试试设计。

常见问题

艺术二维码是怎么工作的?

半色调风格的码在每个模块的中心保留一个颜色正确的点,并在它周围画出图片,因为像 ZXing 这样的解码器只在模块中心附近取样。纠错能力则是额外的安全余量。

在二维码后面放一张照片,还能扫吗?

如果各个点仍明显比周围更深或更浅、三个角和边距保持干净、纠错级别为 H,就可能行得通。没有哪个设计一定能扫,所以请测试印刷样张。

可以在深色背景上用白点吗?

标准允许深底浅码,但支持与否取决于应用:ZXing 只有被告知时才会尝试反色图像。浅底深码更稳妥;任何反色设计都请在受众的手机上测试。

设计最多可以覆盖二维码的多少面积?

纠错级别无法换算成面积百分比。纠错级别是按码字比例定义的,翻转一个模块就会毁掉它所在的整个码字。请测试实际文件。

为什么我设计的二维码扫不出来?

检查是否颜色反转、角被遮盖、边距不足四个模块、深浅点对比太弱,以及印得太小。排错清单涵盖了其他原因。

参考来源

  1. ZXing project — DefaultGridSampler.java. Undated source file. Accessed 17 October 2026.
  2. Chu, H.-K., et al. — Halftone QR Codes. ACM Transactions on Graphics 32(6), Article 217, SIGGRAPH Asia 2013 (author-hosted PDF, National Tsing Hua University; publisher record: ACM Digital Library). Published 1 November 2013. Accessed 17 October 2026.
  3. ISO/IEC — ISO/IEC 18004:2006, QR Code 2005 bar code symbology specification. Second edition, published 1 September 2006 (copy hosted by Public.Resource.Org). Accessed 17 October 2026.
  4. ISO — ISO/IEC 18004:2024 standard page. Fourth edition, published August 2024. Accessed 17 October 2026.
  5. Pena-Pena, K., Lau, D. L., Arce, G. R. — Colored-QRNet: Fast QR Code Color Image Embedding. EUSIPCO 2022 proceedings. Published 2022. Accessed 17 October 2026.
  6. ZXing project — DecodeHintType.java. Undated source file. Accessed 17 October 2026.
  7. jsQR project — README. Undated. Accessed 17 October 2026.
  8. DENSO WAVE — Examples of problems encountered in reading a code. QRcode.com, undated. Accessed 17 October 2026.
  9. ZXing project — HybridBinarizer.java. Undated source file. Accessed 17 October 2026.
  10. DENSO WAVE — Error correction feature. QRcode.com, undated. Accessed 17 October 2026.
  11. DENSO WAVE — Point for setting the module size. QRcode.com, undated. Accessed 17 October 2026.

免费创建一个动态二维码:印出去后也能随时改链接,每次扫码都有统计。

制作你的二维码 →