Newer
Older
from http.server import BaseHTTPRequestHandler, HTTPServer
from json import loads
from PIL import Image, ImageDraw, ImageFont
from urllib.parse import urlparse
from functools import cached_property
from base64 import b64decode
class WebServer(BaseHTTPRequestHandler):
def generateImage(self, post_data):
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
try:
data = loads(post_data)
print(data)
except ValueError:
self.sendErrorMessage("Invalid JSON")
return
if "text" not in data:
self.sendErrorMessage("Text Parameter not found")
return
if "width" not in data:
self.sendErrorMessage("Width Parameter not found")
return
if "height" not in data:
self.sendErrorMessage("Height Parameter not found")
return
width = data["width"]
height = data["height"]
text = data["text"]
if "fontSize" in data:
fontSize = data["fontSize"]
else:
fontSize = 15
if "lineSpacing" in data:
lineSpacing = data["lineSpacing"]
else:
lineSpacing = 0
img = Image.new('P', (width, height))
palette = [
255, 255, 255, # white
0, 0, 0, # black
255, 0, 0 # red
]
img.putpalette(palette)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype("/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf", fontSize)
for i, line in enumerate(text):
color = line["color"]
draw.text((0, 0 + (fontSize + lineSpacing) * i), line["text"], fill=color, font=font)
self.send_response(200)
self.send_header('Content-Type','image/jpeg')
self.end_headers()
rgb_image = img.convert('RGB')
rgb_image.save(self.wfile, "JPEG", optimize=False, quality=100, progressive=False, subsampling=0, icc_profile=None)
@cached_property
def url(self):
return urlparse(self.path)
def sendErrorMessage(self, message, statusCode = 400):
self.send_response(statusCode)
self.send_header('Content-Type','text/plain')
self.end_headers()
self.wfile.write(message.encode('utf-8'))
def do_POST(self):
content_length = int(self.headers['Content-Length'])
post_data = self.rfile.read(content_length)
self.generateImage(post_data)
if(self.url.path == "/image.jpg"):
self.generateImage(b64decode(self.url.query))
return
self.send_response(200)
self.send_header('Content-Type','text/plain')
self.end_headers()
self.wfile.write(b'Text to Image Server\n')
if __name__ == "__main__":
webServer = HTTPServer(("0.0.0.0", 8080), WebServer)
print("Server started")