tessl install tessl/github-zxing-cpp--zxing-cpp@2.3.0Open-source, multi-format linear/matrix barcode image processing library implemented in C++
This guide will help you get started with ZXing-C++ for reading and writing barcodes.
# vcpkg
vcpkg install zxing-cpp
# conan
conan install zxing-cpp
# pip (Python bindings)
pip install zxing-cpp
# Linux distributions
apt install libzxing-dev # Debian/Ubuntu
dnf install zxing-cpp-devel # Fedorafind_package(ZXing REQUIRED)
target_link_libraries(your_app ZXing::ZXing)#include "ZXing/ReadBarcode.h"
#include <iostream>// Example: grayscale image data
uint8_t* imageData = /* your image data */;
int width = 640;
int height = 480;
// Create ImageView
auto image = ZXing::ImageView(imageData, width, height, ZXing::ImageFormat::Lum);// Read single barcode
auto barcode = ZXing::ReadBarcode(image);
if (barcode.isValid()) {
std::cout << "Found: " << barcode.text() << "\n";
std::cout << "Format: " << ZXing::ToString(barcode.format()) << "\n";
} else {
std::cerr << "No barcode found\n";
}#include "ZXing/ReadBarcode.h"
#include <iostream>
int main() {
// Your image data (example: grayscale)
uint8_t* data = loadImage("barcode.png");
int width = 640, height = 480;
// Create image view
auto image = ZXing::ImageView(data, width, height, ZXing::ImageFormat::Lum);
// Read barcode
auto barcode = ZXing::ReadBarcode(image);
if (barcode.isValid()) {
std::cout << "Text: " << barcode.text() << "\n";
std::cout << "Format: " << ZXing::ToString(barcode.format()) << "\n";
} else {
std::cerr << "Error: " << barcode.error().msg() << "\n";
}
return 0;
}#include "ZXing/ReadBarcode.h"
// Configure to find multiple barcodes
auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::Any)
.setMaxNumberOfSymbols(10);
auto barcodes = ZXing::ReadBarcodes(image, options);
std::cout << "Found " << barcodes.size() << " barcodes:\n";
for (const auto& bc : barcodes) {
if (bc.isValid()) {
std::cout << " " << ZXing::ToString(bc.format())
<< ": " << bc.text() << "\n";
}
}// Only QR codes
auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::QRCode);
// Multiple formats
auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::QRCode |
ZXing::BarcodeFormat::DataMatrix);
// All linear codes
auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::LinearCodes);auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::Any)
.setTryHarder(true) // More thorough scanning
.setTryRotate(true) // Try rotated images
.setTryInvert(true) // Try inverted colors
.setTryDownscale(true); // Downscale large imagesNote: Requires ZXING_EXPERIMENTAL_API=ON when building.
#include "ZXing/WriteBarcode.h"// Create QR code
ZXing::CreatorOptions options(ZXing::BarcodeFormat::QRCode);
options.ecLevel("H"); // High error correction
auto barcode = ZXing::CreateBarcodeFromText("Hello World", options);// Render to SVG
auto svg = ZXing::WriteBarcodeToSVG(barcode);
std::cout << svg << "\n";
// Or render to image
ZXing::WriterOptions writerOpts;
writerOpts.scale(4).withQuietZones(true);
auto image = ZXing::WriteBarcodeToImage(barcode, writerOpts);#include "ZXing/WriteBarcode.h"
#include <fstream>
int main() {
// Create QR code
ZXing::CreatorOptions options(ZXing::BarcodeFormat::QRCode);
options.ecLevel("H");
auto barcode = ZXing::CreateBarcodeFromText("https://example.com", options);
if (!barcode.isValid()) {
std::cerr << "Failed to create barcode\n";
return 1;
}
// Render to SVG
ZXing::WriterOptions writerOpts;
writerOpts.scale(4).withQuietZones(true);
auto svg = ZXing::WriteBarcodeToSVG(barcode, writerOpts);
// Save to file
std::ofstream file("qrcode.svg");
file << svg;
return 0;
}auto image = ZXing::ImageView(data, width, height, ZXing::ImageFormat::Lum);auto image = ZXing::ImageView(rgbData, width, height, ZXing::ImageFormat::RGB);auto image = ZXing::ImageView(bgrData, width, height, ZXing::ImageFormat::BGR);auto image = ZXing::ImageView(rgbaData, width, height, ZXing::ImageFormat::RGBA);#include <opencv2/opencv.hpp>
#include "ZXing/ReadBarcode.h"
cv::Mat mat = cv::imread("barcode.jpg");
// OpenCV uses BGR format
auto image = ZXing::ImageView(
mat.data,
mat.cols,
mat.rows,
ZXing::ImageFormat::BGR,
mat.step // row stride
);
auto barcode = ZXing::ReadBarcode(image);auto barcode = ZXing::ReadBarcode(image);
if (!barcode.isValid()) {
const auto& error = barcode.error();
std::cerr << "Error type: " << static_cast<int>(error.type()) << "\n";
std::cerr << "Message: " << error.msg() << "\n";
}switch (barcode.error().type()) {
case ZXing::Error::Type::None:
// Success
break;
case ZXing::Error::Type::Format:
// Decoding error
break;
case ZXing::Error::Type::Checksum:
// Checksum validation failed
break;
case ZXing::Error::Type::Unsupported:
// Unsupported feature
break;
}// ❌ Wrong: OpenCV uses BGR, not RGB
auto image = ZXing::ImageView(mat.data, mat.cols, mat.rows,
ZXing::ImageFormat::RGB);
// ✅ Correct: Specify BGR for OpenCV
auto image = ZXing::ImageView(mat.data, mat.cols, mat.rows,
ZXing::ImageFormat::BGR, mat.step);// ❌ Wrong: Using result without checking
auto barcode = ZXing::ReadBarcode(image);
std::cout << barcode.text(); // May crash if invalid
// ✅ Correct: Always check validity first
if (barcode.isValid()) {
std::cout << barcode.text();
}// ❌ Wrong: Ignoring row padding
auto image = ZXing::ImageView(data, width, height, format);
// ✅ Correct: Specify row stride if image has padding
auto image = ZXing::ImageView(data, width, height, format, rowStride);// Convert to grayscale before processing
cv::Mat gray;
cv::cvtColor(mat, gray, cv::COLOR_BGR2GRAY);
auto image = ZXing::ImageView(gray.data, gray.cols, gray.rows,
ZXing::ImageFormat::Lum);// Faster: only search for expected format
auto options = ZXing::ReaderOptions()
.setFormats(ZXing::BarcodeFormat::QRCode);auto fullImage = ZXing::ImageView(data, width, height, format);
auto roi = fullImage.cropped(x, y, roiWidth, roiHeight);
auto barcode = ZXing::ReadBarcode(roi);// If barcodes are always upright and not inverted
auto options = ZXing::ReaderOptions()
.setTryRotate(false)
.setTryInvert(false);setTryHarder(true)setTryRotate(true) and setTryInvert(true)ZXING_EXPERIMENTAL_API