Multi-format linear/matrix barcode image processing library implemented in C++ for reading and writing barcodes
pkg:github/zxing-cpp/zxing-cpp@1.4.x
npx @tessl/cli install tessl/cpp-zxing-cpp@1.4.0ZXing-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.
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"#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;
}
}#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
}
}ZXing-C++ is designed around several key components:
ReadBarcode() and ReadBarcodes() provide simple, high-level APIsImageView class provides format-agnostic image data accessDecodeHints class allows fine-tuning of detection behaviorResult class encapsulates detection results with comprehensive metadataMultiFormatWriter provides unified encoding interfaceError classNote: DataBar formats support reading only, not writing.
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 = {});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;
};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;
};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
};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
};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
};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>;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);