datamatrix 0.1.0-beta.2

Data Matrix (ECC 200) decoding and encoding with an optimizing encoder
Documentation

datamatrix-rs

crates.io Documentation License Lines of Code

Data Matrix (ECC 200) decoding and encoding library with an optimizing encoder.

This library features a new, optimzing, and linear time encoder which achieves the smallest possible encoding size.

The Data Matrix standard (ISO/IEC 16022:2006) contains a heuristic to decide which encoding modes to use, and in most cases that works. A straightforward implementation will not have linear runtime, though. This library uses an idea similar to the A* algorithm.

The optimizer is unique about this implementation. See the list of related projects below for credits and references to other open source Data Matrix libraries.

Example

let bitmap = datamatrix::encode(
    b"Hello, World!",
    SymbolSize::Min,
).unwrap();

// print an "ASCII art" version
print!("{}", bitmap.unicode());

The library contains no noteworthy rendering. You have to write you own renderer for whatever your desired output format is. Example code can be found in examples/. The extra effort for this last rendering step is usually low and this approach allows high flexibility.

Status

  • Encodation modes ASCII, Base256, C40, Text, X12, EDIFACT implemented.
  • Optimizer for switching between encodation modes to find a minimal encodation size.
  • Data part decoding.
  • Fuzzed data de- and encoding (no issues after 48h)
  • Check the open bug reports in other implementations.
  • Reed Solomon de-/encoder.
  • Tile placement encoding.
  • Helpers for rendering
  • Tile placement decoding.
  • Visual detection in images

Things in consideration for after that:

  • Refine API for better symbol size control ("at least 14x14" for example)
  • Implement Extended Rectangular Data Matrix (DMRE) defined in ISO 21471 which adds more rectangular symbol sizes
  • ECI support (UTF-8 for example)
  • "Structured Append"
  • "Reader Programming"
  • FCN1 and GS1

Disclaimer

Since the encoded data is padded to fill up the remaining space in a Data Matrix symbol, the symbol generated by this library will in many cases not be smaller compared to an optimizer based on the heuristic defined in the specification. What it achieves however in any case is a linear encoding time, and it avoids some of the bugs which can be attributed to the using the heuristic (see open bugs in zxing and OkapiBarcode). And, of course, there are cases where it will return a smaller symbol altough admittedly no thorough study of this has been done.

Related projects

The following projects were invaluable for learning from their implementation and stealing some of their test cases and bug reports.

  • zxing is a Google library to encode and decode multiple 1D and 2D codes including Data Matrix. The core part is written in Java. It uses the heuristic from the specification.
  • barcode4j is a predecessor (?) of zxing, the Data Matrix code was forked into zxing.
  • libdmtx is the most promiment open source C library for encoding and decoding Data Matrix. It has a more limited optimizer compared to the specification, but is still very useable.
  • zxing-cpp is a C++ port of zxing, it also contains some improvements.
  • OkapiBarcode is a Java library with Data Matrix encoding support, among dozens of other codes! The implementation seems to follow the standard.
  • OkapiBarcode is ported from (?) the zint C library. Ports to Pascal and C# are referenced on their website. Off topic: There are encoders for some vintage codes and discontinued commerical codes, see "Extras" on the website.
  • postscriptbarcode, encoding of several 1D and 2D codes using only PostScript. Also available as a LaTeX package.