Man Linux: Main Page and Category List

NAME

       libdmtx - Data Matrix Encoding & Decoding Library 0.7.2

SYNOPSIS

       #include <dmtx.h>

       cc file.c -ldmtx

DESCRIPTION

       libdmtx  is  a software library that enables programs to read and write
       Data Matrix barcodes of the modern ECC200  variety.  The  library  runs
       natively  on  several  platforms,  and  can  be  accessed  by  multiple
       languages using the libdmtx language  wrappers.  The  utility  programs
       dmtxread  and  dmtxwrite  provide a command line interface for libdmtx,
       and serve as a good reference for developers writing their own libdmtx-
       enabled programs.

       Data  Matrix  barcodes  store  data  as a pattern of ON and OFF modules
       (often black on white) in a grid pattern that resembles a checkerboard.
       Like  other  2D  symbologies,  Data  Matrix  barcodes have a large data
       capacity  compared  to  their  traditional  1D  cousins,   and   employ
       sophisticated  error correction techniques. Data Matrix barcodes can be
       square or rectangle in shape, and offer several encodation schemes  for
       optimized storage of text and/or binary data. The Data Matrix symbology
       was invented and  released  into  the  public  domain  by  RVSI  Acuity
       CiMatrix.

ENCODING - Generating Data Matrix Barcodes

       C/C++  programs  can  generate a barcode with just a few basic calls to
       libdmtx:

       1. Call dmtxEncodeCreate()

       Creates  a  new  DmtxEncode  structure  and  initializes  the  encoding
       process.  This  function must be called before using the other encoding
       functions.

       2. Call dmtxEncodeSetProp() [optional]

       Allows you to control specific aspects of  the  encoding  behavior.  If
       this  function  is  not  called,  libdmtx  will use the defaults set by
       dmtxEncodeCreate()     above.     The      complementary      function,
       dmtxEncodeGetProp(), allows you to detect the current settings.

       3. Call either dmtxEncodeDataMatrix() or dmtxEncodeDataMosaic()

       Call one of these functions to generate an image of the desired barcode
       type. Your program is responsible for dispatching the resulting  output
       to  its  destination,  whether  that  means  displaying it on a screen,
       writing an image file, copying it elsewhere, etc...

       4. Call dmtxEncodeDestroy()

       Releases memory allocated during the encoding process.

DECODING - Reading Data Matrix Barcodes

       Barcode reading  takes  more  steps  than  barcode  generation,  mainly
       because  libdmtx  must  find  a barcode region before it can decode the
       message. However, this too is a relatively simple process that  uses  4
       main structures:

       DmtxImage  holds  image  properties and a pointer to pixel data held by
       the calling program.

       DmtxDecode holds values for controlling decode  behavior  and  tracking
       scan  progress.  When  scanning  a  new  image, calling programs should
       always create a new DmtxDecode structure instead of reusing an old one.

       DmtxRegion  defines  a 4-sided region in pixel coordinates. Regions may
       be found in almost any orientation, and their corners won’t necessarily
       form right angles. libdmtx uses this structure to store the location of
       potential barcodes, which are then returned to the calling program one-
       at-a-time.

       DmtxMessage  holds  the  decoded message after being extracted from the
       barcode region. A successfully decoded region will produce exactly  one
       message.

       Use the following functions to find and decode Data Matrix barcodes:

       1. Call dmtxImageCreate()

       Creates  and  initializes  a  new  DmtxImage structure using pixel data
       provided by the calling application. Parameters include  a  pointer  to
       the  existing  pixel  array, image width, height, and the pixel packing
       format.

       2. Call dmtxImageSetProp() [optional]

       Sets image  properties  to  control  the  pixel  mapping  logic.  These
       settings  allow  libdmtx  to  understand  many  native  in-memory image
       layouts, thus preventing the extra work  of  transforming  and  copying
       data  to  a one-size-fits-all format. A dmtxDecodeGetProp() function is
       also available for detecting the current image properties.

       3. Call dmtxDecodeCreate()

       Creates and initializes a new DmtxDecode struct, which  designates  the
       image  to  be  scanned  and  initializes  the  scan  grid pattern. This
       function must be called before any other scanning functions.

       4. Call dmtxDecodeSetProp() [optional]

       Sets internal properties to control  decoding  behavior.  This  feature
       allows  you  to  optimize  performance  and accuracy for specific image
       conditions. A dmtxDecodeGetProp() function is also available.

       5. Call dmtxRegionFindNext()

       Searches every pixel location in a grid pattern looking  for  potential
       barcode  regions. A DmtxRegion is returned whenever a potential barcode
       region is found, or if the  final  pixel  location  has  been  scanned.
       Subsequent  calls  to  this  function  will resume the search where the
       previous call left off.

       6. Call either dmtxDecodeMatrixRegion() or dmtxDecodeMosaicRegion()

       Extracts raw data from the barcode region and  decodes  the  underlying
       message.

       7. Call dmtxMessageDestroy()

       Releases  memory  held  by  a  DmtxMessage  struct.  The  complementary
       function,   dmtxMessageCreate(),    is    automatically    called    by
       dmtxDecodeMatrixRegion()  and  therefore  is  not  normally used by the
       calling program.

       8. Call dmtxRegionDestroy()

       Releases  memory  held  by  a  DmtxRegion  struct.  The   complementary
       function,    dmtxRegionCreate(),    is    automatically    called    by
       dmtxRegionFindNext() (actually dmtxRegionScanPixel()) and therefore  is
       not normally used by the calling program.

       9. Call dmtxDecodeDestroy()

       Releases  memory held by a DmtxDecode struct. This is the complementary
       function to dmtxDecodeCreate().

       10. Call dmtxImageDestroy()

       Releases memory held by a DmtxImage struct, excluding the  pixel  array
       passed  to  dmtxImageCreate().  The  calling program is responsible for
       releasing the pixel array memory, if required.

EXAMPLE PROGRAM

       This example program (available as simple_test.c in the source package)
       demonstrates  libdmtx  functionality  in  both directions: encoding and
       decoding. It creates a Data Matrix barcode in memory,  reads  it  back,
       and  prints  the decoded message. The final output message should match
       the original input string.

         #include <stdlib.h>
         #include <stdio.h>
         #include <string.h>
         #include <assert.h>
         #include <dmtx.h>

         int
         main(int argc, char *argv[])
         {
            size_t          width, height, bytesPerPixel;
            unsigned char   str[] = "30Q324343430794<OQQ";
            unsigned char  *pxl;
            DmtxEncode     *enc;
            DmtxImage      *img;
            DmtxDecode     *dec;
            DmtxRegion     *reg;
            DmtxMessage    *msg;

            fprintf(stdout, "input:  \"%s\"\n", str);

            /* 1) ENCODE a new Data Matrix barcode image (in memory only) */

            enc = dmtxEncodeCreate();
            assert(enc != NULL);
            dmtxEncodeDataMatrix(enc, strlen(str), str);

            /* 2) COPY the new image data before releasing encoding memory */

            width = dmtxImageGetProp(enc->image, DmtxPropWidth);
            height = dmtxImageGetProp(enc->image, DmtxPropHeight);
            bytesPerPixel            =            dmtxImageGetProp(enc->image,
       DmtxPropBytesPerPixel);

            pxl = (unsigned char *)malloc(width * height * bytesPerPixel);
            assert(pxl != NULL);
            memcpy(pxl, enc->image->pxl, width * height * bytesPerPixel);

            dmtxEncodeDestroy(&enc);

            /* 3) DECODE the Data Matrix barcode from the copied image */

            img = dmtxImageCreate(pxl, width, height, DmtxPack24bppRGB);
            assert(img != NULL);

            dec = dmtxDecodeCreate(img, 1);
            assert(dec != NULL);

            reg = dmtxRegionFindNext(dec, NULL);
            if(reg != NULL) {
               msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);
               if(msg != NULL) {
                  fputs("output: \"", stdout);
                  fwrite(msg->output,  sizeof(unsigned  char), msg->outputIdx,
       stdout);
                  fputs("\"\n", stdout);
                  dmtxMessageDestroy(&msg);
               }
               dmtxRegionDestroy(&reg);
            }

            dmtxDecodeDestroy(&dec);
            dmtxImageDestroy(&img);
            free(pxl);

            exit(0);
         }

SEE ALSO

       dmtxread(1), dmtxwrite(1), dmtxquery(1)

STANDARDS

       ISO/IEC 16022:2000

       ANSI/AIM BC11 ISS

BUGS

       Email bug reports to mike@dragonflylogic.com

AUTHOR

       Copyright (C) 2008, 2009 Mike Laughton

                               September 4, 2009