Skip to content
Snippets Groups Projects
main.py 2.9 KiB
Newer Older
Jonas Leder's avatar
Jonas Leder committed
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):
Jonas Leder's avatar
Jonas Leder committed
        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)
Jonas Leder's avatar
Jonas Leder committed
        font = ImageFont.truetype("/usr/share/fonts/dejavu/DejaVuSans-Bold.ttf", fontSize)
Jonas Leder's avatar
Jonas Leder committed
        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)
Jonas Leder's avatar
Jonas Leder committed
            
            
    def do_GET(self):
        if(self.url.path == "/image.jpg"):
            self.generateImage(b64decode(self.url.query))
            return
        
Jonas Leder's avatar
Jonas Leder committed
        self.send_response(200)
        self.send_header('Content-Type','text/plain')
        self.end_headers()
        self.wfile.write(b'Text to Image Server\n')
Jonas Leder's avatar
Jonas Leder committed

if __name__ == "__main__":        
    webServer = HTTPServer(("0.0.0.0", 8080), WebServer)
    print("Server started")
    webServer.serve_forever()