You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.9 KiB
138 lines
3.9 KiB
/* |
|
* Copyright 2023 siiky |
|
* Copyright 2023 Axel Waggershauser |
|
*/ |
|
// SPDX-License-Identifier: Apache-2.0 |
|
|
|
#include "ZXingC.h" |
|
|
|
#include "Version.h" |
|
|
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
|
|
#define STB_IMAGE_IMPLEMENTATION |
|
#define STBI_NO_LINEAR // prevent dependency on -lm |
|
#define STBI_NO_HDR |
|
#include <stb_image.h> |
|
|
|
int usage(char* pname) |
|
{ |
|
fprintf(stderr, "ZXingCTest %s, usage: %s FILE|TXT [FORMAT(S)] [OPTIONS]\n", ZXing_Version(), pname); |
|
return 1; |
|
} |
|
|
|
bool parse_args(int argc, char** argv, char** filename, ZXing_BarcodeFormat** formats) |
|
{ |
|
if (argc < 2) |
|
return false; |
|
*filename = argv[1]; |
|
if (argc >= 3) { |
|
*formats = ZXing_BarcodeFormatsFromString(argv[2], NULL); |
|
if (*formats == NULL) { |
|
fprintf(stderr, "%s\n", ZXing_LastErrorMsg()); |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
void printF(const char* fmt, char* text) |
|
{ |
|
if (!text) |
|
return; |
|
if (*text) |
|
printf(fmt, text); |
|
ZXing_free(text); |
|
} |
|
|
|
#define CHECK(GOOD) \ |
|
if (!(GOOD)) { \ |
|
char* error = ZXing_LastErrorMsg(); \ |
|
fprintf(stderr, "CHECK(%s) failed: %s\n", #GOOD, error); \ |
|
ZXing_free(error); \ |
|
return 2; \ |
|
} |
|
|
|
int main(int argc, char** argv) |
|
{ |
|
int ret = 0; |
|
char* filename = NULL; |
|
ZXing_BarcodeFormat* formats = NULL; |
|
|
|
if (!parse_args(argc, argv, &filename, &formats)) |
|
return usage(argv[0]); |
|
|
|
int width = 0; |
|
int height = 0; |
|
int channels = 0; |
|
stbi_uc* data = stbi_load(filename, &width, &height, &channels, STBI_grey); |
|
|
|
ZXing_ImageView* iv = NULL; |
|
ZXing_Image* img = NULL; |
|
|
|
if (data) { |
|
iv = ZXing_ImageView_new(data, width, height, ZXing_ImageFormat_Lum, 0, 0); |
|
CHECK(iv) |
|
} else { |
|
fprintf(stderr, "Could not read image '%s'\n", filename); |
|
#ifdef ZXING_WRITERS |
|
if (formats == NULL) |
|
return 2; |
|
fprintf(stderr, "Using '%s' as text input to create barcode of format '%s'\n", filename, (char*)formats); |
|
ZXing_CreatorOptions* cOpts = ZXing_CreatorOptions_new(*formats); |
|
CHECK(cOpts) |
|
if (argc >= 4) |
|
ZXing_CreatorOptions_setOptions(cOpts, argv[3]); |
|
ZXing_Barcode* barcode = ZXing_CreateBarcodeFromText(filename, 0, cOpts); |
|
CHECK(barcode) |
|
img = ZXing_WriteBarcodeToImage(barcode, NULL); |
|
CHECK(img) |
|
ZXing_CreatorOptions_delete(cOpts); |
|
ZXing_Barcode_delete(barcode); |
|
#else |
|
return 2; |
|
#endif |
|
} |
|
|
|
ZXing_ReaderOptions* opts = ZXing_ReaderOptions_new(); |
|
ZXing_ReaderOptions_setTextMode(opts, ZXing_TextMode_HRI); |
|
ZXing_ReaderOptions_setEanAddOnSymbol(opts, ZXing_EanAddOnSymbol_Ignore); |
|
ZXing_ReaderOptions_setFormats(opts, formats, -1); // -1 means formats is null-terminated |
|
ZXing_ReaderOptions_setReturnErrors(opts, true); |
|
|
|
ZXing_Barcodes* barcodes = ZXing_ReadBarcodes(iv ? iv : (ZXing_ImageView*)img, opts); |
|
CHECK(barcodes) |
|
|
|
ZXing_ImageView_delete(iv); |
|
ZXing_Image_delete(img); |
|
ZXing_ReaderOptions_delete(opts); |
|
stbi_image_free(data); |
|
|
|
for (int i = 0, n = ZXing_Barcodes_size(barcodes); i < n; ++i) { |
|
const ZXing_Barcode* barcode = ZXing_Barcodes_at(barcodes, i); |
|
|
|
printF("Text : %s\n", ZXing_Barcode_text(barcode)); |
|
printF("BytesECI : %s\n", (char*)ZXing_Barcode_bytesECI(barcode, NULL)); |
|
printF("Format : %s\n", ZXing_BarcodeFormatToString(ZXing_Barcode_format(barcode))); |
|
printF("Content : %s\n", ZXing_ContentTypeToString(ZXing_Barcode_contentType(barcode))); |
|
printF("Identifier : %s\n", ZXing_Barcode_symbologyIdentifier(barcode)); |
|
printf("HasECI : %d\n", ZXing_Barcode_hasECI(barcode)); |
|
printF("Error : %s\n", ZXing_Barcode_errorMsg(barcode)); |
|
printF("Position : %s\n", ZXing_PositionToString(ZXing_Barcode_position(barcode))); |
|
printf("Rotation : %d\n", ZXing_Barcode_orientation(barcode)); |
|
printf("IsMirrored : %d\n", ZXing_Barcode_isMirrored(barcode)); |
|
printf("IsInverted : %d\n", ZXing_Barcode_isInverted(barcode)); |
|
printF("Extra : %s\n", ZXing_Barcode_extra(barcode, NULL)); // get all extra data as JSON |
|
|
|
if (i < n-1) |
|
printf("\n"); |
|
} |
|
|
|
if (ZXing_Barcodes_size(barcodes) == 0) |
|
printf("No barcode found\n"); |
|
|
|
ZXing_Barcodes_delete(barcodes); |
|
|
|
return ret; |
|
}
|
|
|