| name | generate-custom-qr-code |
| description | Generates a QR code from any URL, and optionally overlays a custom image in the center |
| metadata | {"author":"hatsunemiku.zo.computer","category":"Community","display-name":"Generate QR code with optional image","emoji":"📱"} |
Generate QR Code with Optional Image
Generate a QR code from a URL. Optionally overlay a custom logo/image on the center with a white background.
Parameters
url (string, required): The URL to encode in the QR code
image_path (string, optional): Path to custom image to overlay (PNG, JPG, etc.)
output_path (string, optional): Where to save the QR code. Defaults to file Images/qr_code.png
overlay_size_percent (int, optional): Overlay size as percentage of QR code (default: 25)
Usage Examples
Basic QR code (no image):
url: https://zo.computer
With custom logo:
url: https://zo.computer
image_path: /home/workspace/Images/logo.png
output_path: /home/workspace/Images/zo_qr_with_logo.png
overlay_size_percent: 25
Implementation
First, ensure dependencies are installed:
pip install qrcode[pil] pillow -q
Then generate the QR code:
import qrcode
from PIL import Image
from pathlib import Path
url = "https://zo.computer"
image_path = None
output_path = "/home/workspace/Images/qr_code.png"
overlay_size_percent = 25
output_path = Path(output_path)
output_path.parent.mkdir(parents=True, exist_ok=True)
error_correction = qrcode.constants.ERROR_CORRECT_H if image_path else qrcode.constants.ERROR_CORRECT_L
qr = qrcode.QRCode(
version=1,
error_correction=error_correction,
box_size=10,
border=4,
)
qr.add_data(url)
qr.make(fit=True)
qr_img = qr.make_image(fill_color="black", back_color="white").convert('RGB')
if image_path and Path(image_path).exists():
custom_img = Image.open(image_path).convert('RGBA')
qr_width, qr_height = qr_img.size
overlay_size = int(qr_width * (overlay_size_percent / 100))
custom_img = custom_img.resize((overlay_size, overlay_size), Image.Resampling.LANCZOS)
white_bg = Image.new('RGB', (overlay_size, overlay_size), 'white')
if custom_img.mode == 'RGBA':
white_bg.paste(custom_img, (0, 0), custom_img)
else:
white_bg.paste(custom_img, (0, 0))
offset = (qr_width - overlay_size) // 2
qr_img.paste(white_bg, (offset, offset))
qr_img.save(output_path)
print(f"QR code saved to {output_path}")