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): 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) def do_GET(self): 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") webServer.serve_forever()