or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

configuration.mdimage-processing.mdindex.mdreading.mdresults.mdwriting.md
tile.json

tessl/cpp-zxing-cpp

Multi-format linear/matrix barcode image processing library implemented in C++ for reading and writing barcodes

Workspace
tessl
Visibility
Public
Created
Last updated
Describes

pkg:github/zxing-cpp/zxing-cpp@1.4.x

To install, run

npx @tessl/cli install tessl/cpp-zxing-cpp@1.4.0

index.mddocs/

ZXing-C++

ZXing-C++ ("zebra crossing") is an open-source, multi-format linear/matrix barcode image processing library implemented in C++. Originally ported from the Java ZXing Library, it has evolved to include many improvements in terms of quality and performance. The library provides comprehensive barcode reading and writing capabilities for 17 different barcode formats.

Package Information

  • Package Name: zxing-cpp
  • Package Type: C++ Library (CMake)
  • Language: C++17
  • License: Apache-2.0
  • Repository: https://github.com/zxing-cpp/zxing-cpp
  • Installation: CMake integration (see repository README for build instructions)

Core Includes

For reading barcodes:

#include "ReadBarcode.h"
#include "ImageView.h"
#include "DecodeHints.h"

For writing barcodes:

#include "MultiFormatWriter.h"
#include "BitMatrix.h"
#include "BarcodeFormat.h"

Essential data types:

#include "Result.h"
#include "Error.h"

Basic Usage

Reading Barcodes

#define ZX_USE_UTF8 1 // Enable UTF-8 text support
#include "ReadBarcode.h"
#include "ImageView.h"

using namespace ZXing;

// Read single barcode from image data
const uint8_t* imageData = /* your image data */;
int width = /* image width */;
int height = /* image height */;

ImageView imageView(imageData, width, height, ImageFormat::Lum);
Result result = ReadBarcode(imageView);

if (result.isValid()) {
    std::string text = result.text();
    BarcodeFormat format = result.format();
    std::cout << "Found " << ToString(format) << ": " << text << std::endl;
} else {
    std::cout << "Error: " << result.error().msg() << std::endl;
}

// Read multiple barcodes
Results results = ReadBarcodes(imageView);
for (const auto& result : results) {
    if (result.isValid()) {
        std::cout << "Found: " << result.text() << std::endl;
    }
}

Writing Barcodes

#include "MultiFormatWriter.h"
#include "BitMatrix.h"

using namespace ZXing;

// Create a QR Code
MultiFormatWriter writer(BarcodeFormat::QRCode);
writer.setMargin(10).setEccLevel(2);

BitMatrix matrix = writer.encode("Hello World", 200, 200);

// Convert BitMatrix to your image format
// matrix.get(x, y) returns true for black pixels, false for white
for (int y = 0; y < matrix.height(); ++y) {
    for (int x = 0; x < matrix.width(); ++x) {
        bool isBlack = matrix.get(x, y);
        // Set pixel in your image format
    }
}

Architecture

ZXing-C++ is designed around several key components:

  • Entry Point Functions: ReadBarcode() and ReadBarcodes() provide simple, high-level APIs
  • Image Handling: ImageView class provides format-agnostic image data access
  • Configuration System: DecodeHints class allows fine-tuning of detection behavior
  • Result System: Result class encapsulates detection results with comprehensive metadata
  • Format Writers: MultiFormatWriter provides unified encoding interface
  • Error Handling: Comprehensive error reporting through Error class
  • Thread Safety: All readers and writers are stateless and thread-safe

Supported Formats

Linear (1D) Barcodes

  • UPC-A, UPC-E
  • EAN-8, EAN-13
  • Code 39, Code 93, Code 128
  • Codabar
  • ITF (Interleaved Two of Five)
  • DataBar (RSS), DataBar Expanded

Matrix (2D) Barcodes

  • QR Code, Micro QR Code
  • DataMatrix
  • Aztec
  • PDF417
  • MaxiCode (partial support)

Note: DataBar formats support reading only, not writing.

Capabilities

Barcode Reading

High-performance barcode detection and decoding with configurable optimization hints and support for multiple formats simultaneously.

Result ReadBarcode(const ImageView& buffer, const DecodeHints& hints = {});
Results ReadBarcodes(const ImageView& buffer, const DecodeHints& hints = {});

Reading Barcodes

Barcode Writing

Multi-format barcode generation with customizable encoding parameters and output as binary matrix representation.

class MultiFormatWriter {
public:
    explicit MultiFormatWriter(BarcodeFormat format);
    MultiFormatWriter& setEncoding(CharacterSet encoding);
    MultiFormatWriter& setEccLevel(int level);
    MultiFormatWriter& setMargin(int margin);
    BitMatrix encode(const std::wstring& contents, int width, int height) const;
    BitMatrix encode(const std::string& contents, int width, int height) const;
};

Writing Barcodes

Image Processing

Flexible image data handling supporting multiple pixel formats with built-in transformations and optimization features.

class ImageView {
public:
    ImageView(const uint8_t* data, int width, int height, ImageFormat format, 
              int rowStride = 0, int pixStride = 0);
    
    int width() const;
    int height() const;
    ImageFormat format() const;
    
    ImageView cropped(int left, int top, int width, int height) const;
    ImageView rotated(int degree) const;
    ImageView subsampled(int scale) const;
};

Image Processing

Configuration and Hints

Comprehensive configuration system for optimizing detection performance and accuracy based on specific use cases.

class DecodeHints {
public:
    DecodeHints& setFormats(BarcodeFormats formats);
    DecodeHints& setTryHarder(bool tryHarder);
    DecodeHints& setTryRotate(bool tryRotate);
    DecodeHints& setBinarizer(Binarizer binarizer);
    DecodeHints& setIsPure(bool isPure);
    // ... additional configuration methods
};

Configuration

Result Processing

Rich result metadata including position information, error details, structured append support, and content type detection.

class Result {
public:
    bool isValid() const;
    const Error& error() const;
    BarcodeFormat format() const;
    std::string text() const;
    const ByteArray& bytes() const;
    const Position& position() const;
    ContentType contentType() const;
    bool hasECI() const;
    // ... additional result methods
};

Result Processing

Types

Core Enums and Constants

enum class BarcodeFormat {
    None, Aztec, Codabar, Code39, Code93, Code128,
    DataBar, DataBarExpanded, DataMatrix, EAN8, EAN13,
    ITF, MaxiCode, PDF417, QRCode, UPCA, UPCE, MicroQRCode
};

enum class ImageFormat : uint32_t {
    None, Lum, RGB, BGR, RGBX, XRGB, BGRX, XBGR
};

enum class Binarizer : unsigned char {
    LocalAverage, GlobalHistogram, FixedThreshold, BoolCast
};

enum class ContentType { 
    Text, Binary, Mixed, GS1, ISO15434, UnknownECI 
};

Utility Types

class Error {
public:
    enum class Type { None, Format, Checksum, Unsupported };
    Type type() const noexcept;
    const std::string& msg() const noexcept;
    explicit operator bool() const noexcept;
};

using Results = std::vector<Result>;
using Position = QuadrilateralI;
using BarcodeFormats = Flags<BarcodeFormat>;
using ByteArray = std::vector<uint8_t>;

Utility Functions

const char* ToString(BarcodeFormat format);
std::string ToString(BarcodeFormats formats);
std::string ToString(ContentType type);

BarcodeFormat BarcodeFormatFromString(const std::string& str);
BarcodeFormats BarcodeFormatsFromString(const std::string& str);