From d4b2713702bff5b642ce9a76dd8967f5e6d261b4 Mon Sep 17 00:00:00 2001 From: tcsenpai Date: Mon, 22 Jul 2024 23:07:56 +0200 Subject: [PATCH 1/2] better verbosity --- qraro.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/qraro.py b/qraro.py index 611bc8c..b9347e1 100644 --- a/qraro.py +++ b/qraro.py @@ -17,6 +17,8 @@ def bin_to_qr(data, chunk_size=100, filename_prefix="qr_code", box_size=10, bord print(f"[OK]") print(f"Generated {total_chunks} QR codes.") + print(f"Each QR code except the last one will contain {chunk_size} bytes of data.") + print(f"The last QR code will contain the remaining bytes of data ({len(chunks[-1] )} bytes).") def qr_to_bin(filename_prefix="qr_code"): chunks = {} @@ -34,15 +36,18 @@ def qr_to_bin(filename_prefix="qr_code"): chunk_info, chunk_data = decoded.split(':', 1) chunk_num, total_chunks = map(int, chunk_info.split('/')) chunks[chunk_num] = chunk_data + print(f"binary data extracted [OK]") if chunk_num == total_chunks: break + else: + print(f"Error decoding QR code {i}: {barcode.raw}") + i += 1 - print(f"binary data extracted [OK]") except FileNotFoundError: break except Exception as e: print(f"Error decoding QR code {i}: {e}") - break + exit(-1) if not chunks: print("No QR codes found.") From 5a59d4b60de154e5349c57b891a2e3ccd795a1b2 Mon Sep 17 00:00:00 2001 From: tcsenpai Date: Mon, 22 Jul 2024 23:20:00 +0200 Subject: [PATCH 2/2] added fallback method --- example_with_files.py | 2 +- qraro.py | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/example_with_files.py b/example_with_files.py index f1f7f0a..9093129 100644 --- a/example_with_files.py +++ b/example_with_files.py @@ -3,7 +3,7 @@ import qraro with open("pika.webp", "rb") as f: data = f.read() -qraro.bin_to_qr(data, chunk_size=100, box_size=10, border=4) +qraro.bin_to_qr(data, chunk_size=1000, box_size=10, border=4) test_file = qraro.qr_to_bin() diff --git a/qraro.py b/qraro.py index b9347e1..28485b9 100644 --- a/qraro.py +++ b/qraro.py @@ -1,6 +1,7 @@ import qrcode from PIL import Image import zxing +import qrtools def bin_to_qr(data, chunk_size=100, filename_prefix="qr_code", box_size=10, border=4): hex_data = data.hex() @@ -24,6 +25,7 @@ def qr_to_bin(filename_prefix="qr_code"): chunks = {} i = 1 reader = zxing.BarCodeReader() + fallback_reader = qrtools.QR() while True: try: @@ -33,15 +35,24 @@ def qr_to_bin(filename_prefix="qr_code"): print(f"decoded...", end="") if barcode and barcode.parsed: decoded = barcode.parsed - chunk_info, chunk_data = decoded.split(':', 1) - chunk_num, total_chunks = map(int, chunk_info.split('/')) - chunks[chunk_num] = chunk_data - print(f"binary data extracted [OK]") - if chunk_num == total_chunks: - break else: + print(f"Could not decode QR code {i}: {barcode.raw} with zxing, trying fallback reader...") + fallback_reader.decode(filename) + decoded = fallback_reader.data + # split the decoded string into chunk_info and chunk_data + chunk_info, chunk_data = decoded.split(':', 1) + chunk_num, total_chunks = map(int, chunk_info.split('/')) + chunks[chunk_num] = chunk_data + # print(chunk_data) + print(f"binary data extracted [OK]") + if chunk_num == total_chunks: + break + # print(fallback_reader.data) + if not chunks[i]: print(f"Error decoding QR code {i}: {barcode.raw}") - + exit(-1) + print(f"binary data extracted [OK]") + i += 1 except FileNotFoundError: break @@ -55,3 +66,4 @@ def qr_to_bin(filename_prefix="qr_code"): hex_data = ''.join(chunks[i] for i in range(1, len(chunks) + 1)) return bytes.fromhex(hex_data) +