Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate minimum QRcode version from input data

Tags:

qr-code

I started to study ISO/IEC 18004 - the "QRcode specification".

When encoding data as a QRcode (generating a QRcode), the following information must be specified:

  • Mode (what kind of data, eg numeric, alphanumeric, binary, ...)
  • Error correction level (L, M, Q or H)
  • Version (the "size" of the QRcode)

I am looking for a mathematical (equation) way of determining the version requires to hold the provided data with the specified mode and error correction level. The standard itself contains a look-up table which is also available from various web sources such as this or this (they are just look-up tables).

A quote from this very related SO answer:

Any formula for the data capacity will be necessarily awkward and unenlightening since many of the parameters that determine the structure of QR Code symbols have been manually chosen and therefore implementations must generally resort to including tables of constants for these non-computed values.

As per my current understanding of the standard, it should be possible to determine the data capacity (and therefore minimum version) required based on the input data, mode and ECC level. The answer even expressed the calculations for the maximum capacity:

DataModules = Rows × Columns − ( FinderModules + AlignmentModules + TimingPatternModules ) − ( FormatInformationModules + VersionInformationModules )

UsableDataBits = DataModules − ErrorCorrectionBits

I don't understand where the "awkwardness" that would lead to resorting to a look-up table originates from? As per my understanding sizes of timing pattern etc. are fixed per version.

Could somebody further explain this?

like image 942
Joel Bodenmann Avatar asked Feb 14 '26 02:02

Joel Bodenmann


1 Answers

zxing provides an implementation for that:

https://github.com/zxing/zxing/blob/master/core/src/main/java/com/google/zxing/qrcode/encoder/Encoder.java

/**
* Decides the smallest version of QR code that will contain all of the 
provided data.
*
* @throws WriterException if the data cannot fit in any version
*/
private static Version recommendVersion(ErrorCorrectionLevel ecLevel,
                                        Mode mode,
                                        BitArray headerBits,
                                        BitArray dataBits)

The Encoder class provides the algorithm ("mathematical way") of determining the minimum version you are looking for.

If this implementation is in any kind "awkward" or not, I cannot answer.

like image 110
Michi Avatar answered Feb 17 '26 16:02

Michi



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!