QR codes have rapidly overtaken rival 2D bar code symbologies and are becoming quite ubiquitous. Most uses are rather pedestrian though, and even the more non-standard modifications to pure QR codes lack a certain technical finesse, opting to just overpaint part of the code and let error correction handle that instead. Let's see how we can do better.

The simple visual appearance of a QR code belies a very complex multi-step encoding process: Text is encoded using one or multiple character sets and encoding modes (allowing, for example, for a more efficient representation of strings of numbers), the resultant data is grouped into code words in segments with delimiters, error correction information is added, the augmented data is placed on the 2D matrix, structure obfuscation with a masking pattern is applied and version and format meta-data is added. each of these steps grants some degree of freedom to the encoder that will result in visually distinct but semantically identical codes.

Previous approaches to play with QR code appearance have usually stuck to modifying either end of this pipeline: Overwriting some parts of the finished code, or adding additional encoded data so that the finished code will have certain features embedded in it. The downside of these approaches is that you either rely on error correction to remove all the disturbances you've added, limiting the amount of modification possible, or become very limited in which pixels you can control.

By constructing an encoder and decoder that allows access to each step of the encoding/decoding process, I will allow you to go further and take control of the QR code as a whole. Changing all parameters of the encoding process will make the resulting code appear almost like you want it without relying on the error correcting capabilities, which then allows you to add further manipulations by abusing the error correction capabilities.

All code will be released under a free software license at the same time as the talk.