ZXingCTest.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*
  2. * Copyright 2023 siiky
  3. * Copyright 2023 Axel Waggershauser
  4. */
  5. // SPDX-License-Identifier: Apache-2.0
  6. #include "ZXingC.h"
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #define STB_IMAGE_IMPLEMENTATION
  10. #define STBI_NO_LINEAR // prevent dependency on -lm
  11. #define STBI_NO_HDR
  12. #include <stb_image.h>
  13. int usage(char* pname)
  14. {
  15. fprintf(stderr, "ZXingCTest %s, usage: %s FILE [FORMATS]\n", ZXing_Version(), pname);
  16. return 1;
  17. }
  18. bool parse_args(int argc, char** argv, char** filename, ZXing_BarcodeFormats* formats)
  19. {
  20. if (argc < 2)
  21. return false;
  22. *filename = argv[1];
  23. if (argc >= 3) {
  24. *formats = ZXing_BarcodeFormatsFromString(argv[2]);
  25. if (*formats == ZXing_BarcodeFormat_Invalid) {
  26. fprintf(stderr, "%s\n", ZXing_LastErrorMsg());
  27. return false;
  28. }
  29. }
  30. return true;
  31. }
  32. void printF(const char* fmt, char* text)
  33. {
  34. if (!text)
  35. return;
  36. if (*text)
  37. printf(fmt, text);
  38. ZXing_free(text);
  39. }
  40. #define CHECK(GOOD) \
  41. if (!(GOOD)) { \
  42. char* error = ZXing_LastErrorMsg(); \
  43. fprintf(stderr, "CHECK(%s) failed: %s\n", #GOOD, error); \
  44. ZXing_free(error); \
  45. return 2; \
  46. }
  47. int main(int argc, char** argv)
  48. {
  49. int ret = 0;
  50. char* filename = NULL;
  51. ZXing_BarcodeFormats formats = ZXing_BarcodeFormat_None;
  52. if (!parse_args(argc, argv, &filename, &formats))
  53. return usage(argv[0]);
  54. int width = 0;
  55. int height = 0;
  56. int channels = 0;
  57. stbi_uc* data = stbi_load(filename, &width, &height, &channels, STBI_grey);
  58. ZXing_ImageView* iv = NULL;
  59. ZXing_Image* img = NULL;
  60. if (data) {
  61. iv = ZXing_ImageView_new(data, width, height, ZXing_ImageFormat_Lum, 0, 0);
  62. CHECK(iv)
  63. } else {
  64. fprintf(stderr, "Could not read image '%s'\n", filename);
  65. #if defined(ZXING_EXPERIMENTAL_API) && defined(ZXING_WRITERS)
  66. if (formats == ZXing_BarcodeFormat_Invalid)
  67. return 2;
  68. fprintf(stderr, "Using '%s' as text input to create barcode\n", filename);
  69. ZXing_CreatorOptions* cOpts = ZXing_CreatorOptions_new(formats);
  70. CHECK(cOpts)
  71. ZXing_Barcode* barcode = ZXing_CreateBarcodeFromText(filename, 0, cOpts);
  72. CHECK(barcode)
  73. img = ZXing_WriteBarcodeToImage(barcode, NULL);
  74. CHECK(img)
  75. ZXing_CreatorOptions_delete(cOpts);
  76. ZXing_Barcode_delete(barcode);
  77. #else
  78. return 2;
  79. #endif
  80. }
  81. ZXing_ReaderOptions* opts = ZXing_ReaderOptions_new();
  82. ZXing_ReaderOptions_setTextMode(opts, ZXing_TextMode_HRI);
  83. ZXing_ReaderOptions_setEanAddOnSymbol(opts, ZXing_EanAddOnSymbol_Ignore);
  84. ZXing_ReaderOptions_setFormats(opts, formats);
  85. ZXing_ReaderOptions_setReturnErrors(opts, true);
  86. ZXing_Barcodes* barcodes = ZXing_ReadBarcodes(iv ? iv : (ZXing_ImageView*)img, opts);
  87. CHECK(barcodes)
  88. ZXing_ImageView_delete(iv);
  89. ZXing_Image_delete(img);
  90. ZXing_ReaderOptions_delete(opts);
  91. stbi_image_free(data);
  92. for (int i = 0, n = ZXing_Barcodes_size(barcodes); i < n; ++i) {
  93. const ZXing_Barcode* barcode = ZXing_Barcodes_at(barcodes, i);
  94. printF("Text : %s\n", ZXing_Barcode_text(barcode));
  95. printF("BytesECI : %s\n", (char*)ZXing_Barcode_bytesECI(barcode, NULL));
  96. printF("Format : %s\n", ZXing_BarcodeFormatToString(ZXing_Barcode_format(barcode)));
  97. printF("Content : %s\n", ZXing_ContentTypeToString(ZXing_Barcode_contentType(barcode)));
  98. printF("Identifier : %s\n", ZXing_Barcode_symbologyIdentifier(barcode));
  99. printf("HasECI : %d\n", ZXing_Barcode_hasECI(barcode));
  100. printF("EC Level : %s\n", ZXing_Barcode_ecLevel(barcode));
  101. printF("Error : %s\n", ZXing_Barcode_errorMsg(barcode));
  102. printF("Position : %s\n", ZXing_PositionToString(ZXing_Barcode_position(barcode)));
  103. printf("Rotation : %d\n", ZXing_Barcode_orientation(barcode));
  104. printf("IsMirrored : %d\n", ZXing_Barcode_isMirrored(barcode));
  105. printf("IsInverted : %d\n", ZXing_Barcode_isInverted(barcode));
  106. if (i < n-1)
  107. printf("\n");
  108. }
  109. if (ZXing_Barcodes_size(barcodes) == 0)
  110. printf("No barcode found\n");
  111. ZXing_Barcodes_delete(barcodes);
  112. return ret;
  113. }