NoiseQR
Jump to navigation
Jump to search
This is a utility by User:Wolf for creating neat Noisebridge-branded QR codes.
Quick start: (note that you will need python-qrcode >= 7.3.1 to avoid formatting problems).
- Download https://www.noisebridge.net/wiki/File:Noisebridge-Logo_circuit-only_forqr.png
- Copy noiseqr.py from section below, and edit:
- it expects you to have LiberationSans-Regular.ttf installed at a particular spot on your system, edit as appropriate
- also set the DPI variable to the DPI of your printer (600 DPI is a common value)
- Install necessary libraries:
$ python3 -m venv venv3 $ source venv3/bin/activate $ pip install wheel $ pip install qrcode[pil]
- Edit noiseqr.py with the URLs you want
- Run noiseqr.py
$ python3 ./noiseqr.py
The output will be various some_file_0.png files which are intended to be printed at 8.5x11 (no scaling, no extra margins) and cut out. (Note that they may appear slightly fuzzy when zoomed in, this will not be noticeable when printed.)
The Source[edit]
import qrcode
import qrcode.image.svg
from qrcode.image.styledpil import StyledPilImage
from qrcode.image.styles.moduledrawers import GappedSquareModuleDrawer, RoundedModuleDrawer, CircleModuleDrawer
from PIL import Image, ImageFont, ImageDraw
DPI=600
INCH=DPI
POINT=int(1/72*INCH)
LABEL_SIZE=2*INCH
PAGE_MARGIN=int(1/4*INCH)
PAGE_WIDTH=int(8.5*INCH)
PAGE_HEIGHT=int(11*INCH)
PIL_MODE="1" # 1 BPP
WHITE=255
BLACK=0
LOGO=Image.open("Noisebridge-Logo_circuit-only_forqr.png")
def getqr(url):
qr = qrcode.QRCode(box_size=30)
qr.add_data(url)
img = qr.make_image(
image_factory=StyledPilImage,
module_drawer=GappedSquareModuleDrawer() if ("Flaschen" not in url) else CircleModuleDrawer(),
eye_drawer=RoundedModuleDrawer(),
embeded_image=LOGO,
embeded_image_resample=Image.NEAREST,
)
return img
pages = []
def positions():
for y in range(5):
for x in range(4):
yield (PAGE_MARGIN+x*LABEL_SIZE, PAGE_MARGIN+y*LABEL_SIZE)
def pagepositions():
while True:
page = Image.new(mode=PIL_MODE, size=(PAGE_WIDTH, PAGE_HEIGHT), color=WHITE)
pages.append(page)
for pos in positions():
yield (page, pos)
urls = [
'https://noisebridge.net/wiki/Noisebridge',
'https://noisebridge.net/wiki/Getting_In',
'https://noisebridge.net/wiki/272',
'https://noisebridge.net/wiki/Access_Control',
]
liberation_sans_8 = ImageFont.truetype("/usr/share/fonts/truetype/liberation2/LiberationSans-Regular.ttf", 8*POINT)
for url, (page, pos) in zip(urls, pagepositions()):
qr = getqr(url).resize((LABEL_SIZE, LABEL_SIZE), Image.NEAREST)
draw = ImageDraw.Draw(qr)
draw.text(
xy=(LABEL_SIZE/2, LABEL_SIZE-2*POINT),
anchor="mb",
text=url.replace('https://', ''),
fill=BLACK,
font=liberation_sans_8,
)
page.paste(qr, pos)
for i, page in enumerate(pages):
draw = ImageDraw.Draw(page)
for pos in positions():
draw.rectangle((pos, (pos[0]+LABEL_SIZE, pos[1]+LABEL_SIZE)), outline=BLACK)
page.save(f"some_file_{i}.png")