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:
numeric, alphanumeric, binary, ...)L, M, Q or H)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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With