Merge pull request #2 from tcsenpai/mixed_approach

Mixed approach
This commit is contained in:
TheCookingSenpai 2024-07-22 23:20:44 +02:00 committed by GitHub
commit b8118095e7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 8 deletions

View File

@ -3,7 +3,7 @@ import qraro
with open("pika.webp", "rb") as f: with open("pika.webp", "rb") as f:
data = f.read() 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() test_file = qraro.qr_to_bin()

View File

@ -1,6 +1,7 @@
import qrcode import qrcode
from PIL import Image from PIL import Image
import zxing import zxing
import qrtools
def bin_to_qr(data, chunk_size=100, filename_prefix="qr_code", box_size=10, border=4): def bin_to_qr(data, chunk_size=100, filename_prefix="qr_code", box_size=10, border=4):
hex_data = data.hex() hex_data = data.hex()
@ -17,11 +18,14 @@ def bin_to_qr(data, chunk_size=100, filename_prefix="qr_code", box_size=10, bord
print(f"[OK]") print(f"[OK]")
print(f"Generated {total_chunks} QR codes.") 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"): def qr_to_bin(filename_prefix="qr_code"):
chunks = {} chunks = {}
i = 1 i = 1
reader = zxing.BarCodeReader() reader = zxing.BarCodeReader()
fallback_reader = qrtools.QR()
while True: while True:
try: try:
@ -31,18 +35,30 @@ def qr_to_bin(filename_prefix="qr_code"):
print(f"decoded...", end="") print(f"decoded...", end="")
if barcode and barcode.parsed: if barcode and barcode.parsed:
decoded = barcode.parsed decoded = barcode.parsed
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_info, chunk_data = decoded.split(':', 1)
chunk_num, total_chunks = map(int, chunk_info.split('/')) chunk_num, total_chunks = map(int, chunk_info.split('/'))
chunks[chunk_num] = chunk_data chunks[chunk_num] = chunk_data
# print(chunk_data)
print(f"binary data extracted [OK]")
if chunk_num == total_chunks: if chunk_num == total_chunks:
break break
i += 1 # 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]") print(f"binary data extracted [OK]")
i += 1
except FileNotFoundError: except FileNotFoundError:
break break
except Exception as e: except Exception as e:
print(f"Error decoding QR code {i}: {e}") print(f"Error decoding QR code {i}: {e}")
break exit(-1)
if not chunks: if not chunks:
print("No QR codes found.") print("No QR codes found.")
@ -50,3 +66,4 @@ def qr_to_bin(filename_prefix="qr_code"):
hex_data = ''.join(chunks[i] for i in range(1, len(chunks) + 1)) hex_data = ''.join(chunks[i] for i in range(1, len(chunks) + 1))
return bytes.fromhex(hex_data) return bytes.fromhex(hex_data)