Init
This commit is contained in:
commit
4bdb89ae60
7 changed files with 320 additions and 0 deletions
101
app.py
Normal file
101
app.py
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
import io
|
||||
|
||||
from flask import Flask, request, send_file
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import qrcode
|
||||
|
||||
default_font = "atkinson-hyperlegible.ttf"
|
||||
|
||||
def get_wrapped_text(text: str, font: ImageFont.ImageFont, line_length: int):
|
||||
lines = ['']
|
||||
for word in text.split():
|
||||
line = f'{lines[-1]} {word}'.strip()
|
||||
if font.getlength(line) <= line_length:
|
||||
lines[-1] = line
|
||||
else:
|
||||
lines.append(word)
|
||||
return '\n'.join(lines)
|
||||
|
||||
def draw_fitted_text_h(draw, pos, text: str, font_size: int, max_width: int, max_height: int):
|
||||
bbox_h = float("inf")
|
||||
font = ImageFont.truetype(default_font, font_size)
|
||||
text_wrapped = text
|
||||
|
||||
while bbox_h >= max_height and font_size > 0:
|
||||
font = font.font_variant(size=font_size)
|
||||
font_size -= 1
|
||||
|
||||
text_wrapped = get_wrapped_text(text, font, line_length=max_width).strip('\n')
|
||||
bbox_h = draw.textbbox((0, 0), text_wrapped, font=font)[3]
|
||||
|
||||
draw.text(pos, text_wrapped, 0, font=font)
|
||||
return draw.textbbox((0, 0), text_wrapped, font=font)[3]
|
||||
|
||||
def draw_fitted_text_w(draw, pos, text: str, font_size: int, max_width: int):
|
||||
bbox_w = float("inf")
|
||||
font = ImageFont.truetype(default_font, font_size)
|
||||
|
||||
while bbox_w >= max_width and font_size > 0:
|
||||
font = font.font_variant(size=font_size)
|
||||
font_size -= 1
|
||||
|
||||
bbox_w = font.getlength(text)
|
||||
|
||||
draw.text(pos, text, 0, font=font)
|
||||
return draw.textbbox((0, 0), text, font=font)[3]
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
@app.route('/', methods=['GET'])
|
||||
def call_handler():
|
||||
height = int(request.args.get('Height', 500))
|
||||
width = int(request.args.get('Width', 300))
|
||||
margin = int(request.args.get('Margin', 10))
|
||||
padding = int(request.args.get('ComponentPadding', 10))
|
||||
dpi = int(float(request.args.get('Dpi', 300)))
|
||||
|
||||
useable_width = width - (2 * margin)
|
||||
useable_height = height - (2 * margin)
|
||||
qr_max_size = min(useable_width, useable_height)
|
||||
|
||||
qr_size = min(qr_max_size, int(request.args.get('QrSize', qr_max_size)))
|
||||
url = request.args.get('URL')
|
||||
|
||||
desc = request.args.get('DescriptionText', '').split('\n')[0]
|
||||
desc_size = float(request.args.get('DescriptionFontSize', 24))
|
||||
title = request.args.get('TitleText')
|
||||
title_size = float(request.args.get('TitleFontSize', 24))
|
||||
|
||||
l_type_size = min(desc_size, title_size)
|
||||
l_text_size = max(desc_size, title_size)
|
||||
|
||||
if desc == 'Homebox Location':
|
||||
l_type = desc
|
||||
l_text = title
|
||||
else:
|
||||
l_type = 'Homebox ' + title
|
||||
l_text = desc
|
||||
|
||||
|
||||
img = Image.new('1', (width, height), 1)
|
||||
y = margin
|
||||
|
||||
qr_img = qrcode.make(url, border=0)
|
||||
qr_img = qr_img.resize((qr_size, qr_size), resample=Image.NEAREST)
|
||||
img.paste(qr_img, (margin, y))
|
||||
y += qr_size + padding
|
||||
|
||||
draw = ImageDraw.Draw(img)
|
||||
|
||||
used_h = draw_fitted_text_w(draw, (margin, y), l_type, l_type_size, useable_width)
|
||||
y += used_h + padding
|
||||
|
||||
draw_fitted_text_h(draw, (margin, y), l_text, l_text_size, useable_width, useable_height - y)
|
||||
|
||||
|
||||
img_io = io.BytesIO()
|
||||
img.save(img_io, 'PNG', quality=100, dpi=(dpi, dpi))
|
||||
img_io.seek(0)
|
||||
|
||||
return send_file(img_io, mimetype='image/png')
|
||||
Loading…
Add table
Add a link
Reference in a new issue