From 21ad3f706cf4a195350f603f3a2ed8dfe648b4b3 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Sat, 21 Sep 2024 17:44:10 -0400 Subject: [PATCH 1/3] Add a square BIDS logo (black) with circle in background (for qr code) --- .../BIDS_logo_black_square_in_circle.png | Bin 0 -> 36001 bytes .../BIDS_logo_black_square_in_circle.svg | 133 ++++++++++++++++++ 2 files changed, 133 insertions(+) create mode 100644 docs/assets/img/logos/BIDS_logo_black_square_in_circle.png create mode 100644 docs/assets/img/logos/BIDS_logo_black_square_in_circle.svg diff --git a/docs/assets/img/logos/BIDS_logo_black_square_in_circle.png b/docs/assets/img/logos/BIDS_logo_black_square_in_circle.png new file mode 100644 index 0000000000000000000000000000000000000000..3316491d8c7d3f9b7487fd37c04163d930882eda GIT binary patch literal 36001 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 + + + + + + + + + + + Ресурс 2 + + + + + + + + + + + + + + + + + + + + Ресурс 2 + + + + From 3814ea4a79c8fa6ea87736ee77663b47c77efcf6 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Sat, 21 Sep 2024 17:46:08 -0400 Subject: [PATCH 2/3] Add a (generic) script to produce QR code with embedded image --- tools/mkqrcode.py | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 tools/mkqrcode.py diff --git a/tools/mkqrcode.py b/tools/mkqrcode.py new file mode 100755 index 00000000..f1952c55 --- /dev/null +++ b/tools/mkqrcode.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python3 + +import argparse +import logging +import re + +from pyzbar.pyzbar import decode +from PIL import Image + +import qrcode +from qrcode.image.styledpil import StyledPilImage +from qrcode.image.styles.moduledrawers.pil import GappedSquareModuleDrawer + +# Create a dedicated logger +lgr = logging.getLogger(__name__) + +def sanitize_filename(filename): + sanitized = re.sub(r'[^\w]', '_', filename) + return sanitized + +def validate_compression_qualities(qualities): + valid_qualities = {'L', 'M', 'Q', 'H'} + if not all(q in valid_qualities for q in qualities): + raise ValueError(f"Invalid compression qualities specified. Use any combination of: {', '.join(valid_qualities)}.") + return qualities + +def main(text, input_image, output_image, compression_qualities): + lgr.debug(f"Processing text: {text}") + kws = {} + + if input_image: + lgr.debug(f"Embedding image: {input_image}") + kws['embeded_image_path'] = input_image + + for q in compression_qualities: + compress_quality = getattr(qrcode.constants, f'ERROR_CORRECT_{q}') + + qr = qrcode.QRCode(error_correction=compress_quality) + qr.add_data(text) + + img = qr.make_image(image_factory=StyledPilImage, + module_drawer=GappedSquareModuleDrawer(), + **kws) + img.save(output_image) + lgr.debug(f"Saved QR code image to: {output_image}") + + decoded = decode(Image.open(output_image)) + + if len(decoded) != 1: + lgr.debug(f"With error correction {q} got {len(decoded)} results.") + continue + + decoded_data = decoded[0] + lgr.debug(f"DEBUG: error correction {q} - quality: {decoded_data.quality}") + + if decoded_data.quality < 0.5: + lgr.warning(f"With error correction {q} got too low quality {decoded_data.quality}.") + continue + + text_decoded = decoded_data.data.decode() + if text_decoded != text: + lgr.warning(f"With error correction {q} decoded text does not match: {text_decoded!r} instead of {text!r}") + continue + + lgr.info(f"Successfully decoded text: {text_decoded!r} encoded with compress quality {q}. File {output_image}") + break + else: + lgr.error(f"Neither of error correction levels was good enough. File {output_image} might be unreadable.") + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Generate and decode QR codes.") + parser.add_argument("text", help="Text to encode in the QR code.") + parser.add_argument("-i", "--input-image", help="Path to the input image (optional).") + parser.add_argument("-o", "--output-image", help="Path to the output image (optional).") + parser.add_argument("-c", "--compression-qualities", default="LMQH", + help="Compression qualities (default: LMQH). Choose any combination of L, M, Q, H.") + parser.add_argument("-l", "--log-level", default="INFO", help="Set the logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL).") + + args = parser.parse_args() + + # Setup logging + logging.basicConfig(level=args.log_level.upper(), format='%(asctime)s - %(levelname)s - %(message)s') + + # Validate compression qualities + try: + compression_qualities = validate_compression_qualities(args.compression_qualities) + except ValueError as e: + lgr.error(e) + exit(1) + + # Sanitize output filename + output_filename = args.output_image if args.output_image else f"{sanitize_filename(args.text)}.png" + + main(args.text, args.input_image, output_filename, compression_qualities) From 6b11778827bb57f3715dcf242957cae57385d6ac Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Sat, 21 Sep 2024 17:49:52 -0400 Subject: [PATCH 3/3] Wrapper to create QR with bids logo inside --- tools/mkqrcode_bids | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 tools/mkqrcode_bids diff --git a/tools/mkqrcode_bids b/tools/mkqrcode_bids new file mode 100755 index 00000000..aa76dda7 --- /dev/null +++ b/tools/mkqrcode_bids @@ -0,0 +1,9 @@ +#!/bin/bash + +set -eu + +bids_logo=$(dirname $0)/../docs/assets/img/logos/BIDS_logo_black_square_in_circle.png + +set -x + +$(dirname "$0")/mkqrcode.py -i "$bids_logo" "$@" \ No newline at end of file