Coder Social home page Coder Social logo

datamatrix-rs's Introduction

datamatrix-rs

crates.io Documentation License Lines of Code

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

Data Matrix encoding 'datamatrix-rs'

This library features an 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 special about this implementation, most implementations use the heuristic. See the list of related projects below for credits and references to other open source Data Matrix libraries.

Example

let code = DataMatrix::encode(
    b"Hello, World!",
    SymbolList::default(),
).unwrap();

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

The library contains helpers for generating other output formats. 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
  • Implement Extended Rectangular Data Matrix (DMRE) defined in ISO 21471 which adds more rectangular symbol sizes
  • Tile placement decoding.
  • Visual detection in images.
  • Detailed decoder output.
  • ECI support. This has progressed as far as I could get without buying the standards for this (several hundred dollars).

Things in consideration for after that:

  • "Structured Append"
  • "Reader Programming"

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 using the heuristic (see open bugs in zxing and OkapiBarcode). And, of course, there are cases where it will return a smaller symbol although 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 prominent open source C library for encoding and decoding Data Matrix. It has a more limited optimizer compared to the specification, but it can also decode Data Matric codes from images.
  • 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 nice vintage codes and discontinued commercial codes, see "Extras" on the website.
  • postscriptbarcode implements encoding of several 1D and 2D codes using only PostScript. It is also available as a LaTeX package. Port to JavaScript.
  • A perl module for encoding.
  • iec16022 is a Data Matrix encoder originally written by Andrews & Arnold Ltd. but is now maintained by Reimar Döffinger. It has a similar optimizing encoder.

datamatrix-rs's People

Contributors

jannschu avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.