Stefan Claas wrote:
Herbert Kleebauer wrote:
On 01.05.2024 10:29, Stefan Claas wrote:
I decoded the image and had one error in the certutil file
(one byte missing in one line at the end). The video was
also a certutil file, but with to many errors, so it wrote
a bad .mp4, which I could not decode.
How did you manage to precisely insert 12 QR-Codes nicely on
an A4 page?
Some time ago I wrote a batch to make a paper backup
from a 13 kByte binary file (so it will make only two
pages with 12 QR codes each). The input file is hard
coded (t.jpg in this case). qrencode.exe I downloaded
somewhere from the internet and convert.exe is the
universal picture tool from https://imagemagick.org .
split.exe just splits the input file in small chunks
to be encoded in single QR code (source at the end of
this post). To get the binary back from the paper print,
you have just to start a text editor and scan all the
QR codes with a Bluetooth QR code scanner (which works
like an external Bluetooth keyboard). Then execute the
generated batch file to generate the binary.
[...]
Thanks a lot or your help, much appreciated!
While I still cannot decode the video, I have now my own
solution.
Here is the Python3 code:
import qrcode
import os
import argparse
import shutil
from pyzbar.pyzbar import decode
from PIL import Image
import base64
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--file', help='File to convert to/from QR codes')
parser.add_argument('-e', '--encode', help='Directory to save QR codes', default=None)
parser.add_argument('-d', '--decode', help='Directory to load QR codes from', default=None)
args = parser.parse_args()
def file_to_qrcodes(file_path, directory):
with open(file_path, 'rb') as f:
counter = 0
while True:
data = f.read(1024) # Read in chunks of 1024 bytes
if not data:
break
encoded_data = base64.b64encode(data)
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=4,
)
qr.add_data(encoded_data)
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save(os.path.join(directory, f'qr{counter}.png'))
counter += 1
def qrcodes_to_file(directory, output_file):
files = sorted([f for f in os.listdir(directory) if f.startswith('qr') and f.endswith('.png')],
key=lambda x: int(x[2:-4]))
with open(output_file, 'wb') as f:
for file in files:
decoded_objects = decode(Image.open(os.path.join(directory, file)))
if decoded_objects:
encoded_data = decoded_objects[0].data
data = base64.b64decode(encoded_data)
f.write(data)
if args.file and (args.encode or args.decode):
if args.encode:
if not os.path.exists(args.encode):
os.makedirs(args.encode)
file_to_qrcodes(args.file, args.encode)
if args.decode:
if os.path.exists(args.decode):
qrcodes_to_file(args.decode, args.file)
and two bash scripts, for making a movie and for extracing the frames.
#!/bin/bash
#mm - make move from .png files
FOLDERNAME="$1"
cat $(find $FOLDERNAME -maxdepth 1 -name "*.png" | sort -V) | ffmpeg -framerate 25 -i - output.mp4
#!/bin/bash
#ef - extracts QR-Codes from an .mp4 file in a folder
FOLDERFILENAME="$1"
DIRNAME=$(dirname "$FOLDERFILENAME")
BASENAME=$(basename "$FOLDERFILENAME" .mp4)
ffmpeg -i "$FOLDERFILENAME" -start_number 0 "$DIRNAME/qr%d.png"
-- RegardsStefan