文章摘要
该文章介绍了如何制作抖动处理的二维码,指出二维码由功能图案和数据模块组成,功能图案需清晰以方便扫描,数据模块可稍作修改,常用于品牌定制个性化二维码。
文章总结
制作你自己的抖动二维码
二维码基础
二维码本质上是一种将少量字节数据编码的方式,便于智能手机或类似设备通过照片轻松读取。它们设计得非常鲁棒,能应对对焦不准、打印质量差、角度奇怪以及部分区域缺失等问题。具体工作原理并不重要,但就本文而言,二维码是一个由方格组成的网格,分为两部分——功能图案(如上例中的粗体形状)和数据模块(其余部分)。功能模块主要用于让扫描器轻松找到二维码,因此必须非常清晰和醒目。数据模块则存储实际数据以及一些额外的头部信息等。由于扫描器只有在利用功能模块确定二维码的确切位置后才会读取数据模块,因此数据模块可以进行更多修改。品牌商经常利用这一点来制作外观独特的二维码。虽然这种修改会降低扫描时的鲁棒性,但在代码变得无法扫描之前,通常可以容忍相当程度的修改。
在二维码中嵌入图片
这是我在Mastodon上看到的一个二维码。对数据模块的一种修改方式是缩小它们——扫描器会查看定位图案指示的像素中心位置,只要代码在扫描时没有变形,其余空间就可以自由发挥。Dave将每个像素分成一个3x3的网格,用中间的那个像素存储数据,其余像素用于显示照片。结果就是一张低分辨率、单比特的照片,带有一些椒盐噪声。
抖动
显然,当我们将图像压缩到低色彩深度时,通常不会简单地使用阈值处理——即把暗像素变成黑色,亮像素变成白色。我们通常会使用一种棋盘格效果来创建中间色调。Bayer滤波器可以将这种想法应用于整张图像,而无需牺牲太多细节。

误差扩散
为了改进这种方法,出现了Floyd-Steinberg抖动。
在这种方法中,从左上角开始,对像素进行正常的阈值处理——如果亮度超过50%,就设为白色,否则设为黑色。假设像素亮度为70%——我们会将其设为白色(100%亮度),这意味着我们增加了30%的亮度误差。为了抵消这个误差,我们将这个误差“扩散”到其他像素——所有尚未进行阈值处理的邻近像素都会略微变暗,总计达到30%的像素亮度。当对这些像素进行阈值处理时,我们会考虑这个误差。其理念是,一旦对整个图像完成阈值处理,图像的每个部分在平均亮度上都会比更规则的抖动更接近正确值。不规则的图案也不那么分散注意力。
带有误差扩散抖动的二维码
这种不规则抖动的另一个优点是,由二维码数据模块引起的椒盐噪声更难被察觉。但噪声仍然存在,这也是图像看起来如此嘈杂的原因。我的意思是,即使没有二维码,它看起来也会相当嘈杂,因为它是一张147x147像素的单比特图像,但部分噪声确实是因为每九个像素中就有一个是随机颜色。
但我们可以通过更多的误差扩散来解决这个问题。
对数据模块进行误差扩散
在这种情况下,我们对误差扩散进行两次处理。第二次与正常处理相同,但第一次专门用于掩盖数据模块。我们已经知道这些像素必须是什么颜色,因此我们可以将它们设为那些颜色,并将误差扩散到周围的八个像素。这个误差可能相当大——通常我们可以选择颜色,使误差永远不会超过50%,但在这里,我们可能不得不将暗区域的像素设为纯白色,从而产生95%的误差。这听起来很糟糕,但正因如此,扩散这个误差而不是直接接受它才如此重要。
可以看到,这使图像变得更加清晰。
进一步优化
生成工具允许你进行一些额外的技巧。你可以在添加图像之前旋转二维码,并调整二维码设置,看看是否有其他编码方式看起来更美观。
你还可以允许生成器更改一些误差高达95%的数据模块——二维码具有足够的纠错能力,你可以更改几个像素而代码仍然可以扫描。(这就是中间带有标志的二维码的工作原理。)但实际上,如果你对数据模块的误差进行扩散,这对图像质量的影响并不大,但会严重影响代码的扫描效果。
实际应用
如果你不过分追求效果,并且代码将显示在大屏幕或海报等媒介上,这种方法效果相当不错。但如果代码出现在可能被弄皱的纸质传单上,那么你就需要更多的冗余性、鲁棒性和纠错能力——而这些正是为了让二维码美观而放弃的。最终,这需要在美观性和可扫描性之间进行权衡——请记住,仅仅因为一个代码能在你的手机上从笔记本电脑屏幕扫描成功,并不意味着它能在陌生人的低端手机上从光线不佳的打印件上扫描成功。
另外请注意,生成工具会生成没有边距的小图像——二维码需要一定的边距才能可靠扫描,而且浏览器在放大图像时通常会模糊处理,除非你通过CSS禁用此功能。边距的颜色必须与三个大的“定位”图案方块中心的颜色相反——通常是白色,但你可以生成反转的二维码,这需要黑色背景。
评论总结
根据评论内容,主要观点和论据如下:
1. 对文章内容的认可与延伸讨论 - 评论4(BobbyTables2)称赞文章写得好,并幽默建议加入Rick Astley的QR码("Nice writeup! Only needs a Rick Astley QR code")。 - 评论3(mentat)提出颜色QR码的可能性,并附上个人项目链接("This made me wonder if you could do it with color and apparently you can")。
2. 相关资源与作者信息 - 评论2(Zecc)提到通过作者Andrew T的每日谜题(Ronin和Cell Tower)认识其域名("I recognize the domain name from playing some of his daily puzzles")。 - 评论6(OscarCunningham)提供了作者在Mastodon上的相关帖子链接。
3. 技术扩展与趣味联想 - 评论7(zahrevsky)指出QR码可运行动画,并幽默推测理论上可运行《毁灭战士》("So, technically, you can run Doom inside a QR code?")。 - 评论5(ideasphere)对图片内容提出疑问("Is that Lena with Sean Connery’s face??")。
4. 偶然发现与背景 - 评论1(jmusall)提到偶然看到此内容,并引用相关讨论("Coincidentally came across this after reading a comment under the recent post on for-sale DNS records")。
总结:评论整体对文章持正面态度,主要围绕QR码的技术扩展(颜色、动画)、作者背景及趣味联想展开,未出现明显负面观点。
