Skip to content
Snippets Groups Projects
main.py 2.51 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jonas Leder's avatar
    Jonas Leder committed
    from http.server import BaseHTTPRequestHandler, HTTPServer
    from json import loads
    from PIL import Image, ImageDraw, ImageFont
    
    class WebServer(BaseHTTPRequestHandler):
        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)
            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)
                
                
        def do_GET(self):
            self.send_response(200)
            self.send_header('Content-Type','text/plain')
            self.end_headers()
            self.wfile.write(b'Text to Image Server')
    
    if __name__ == "__main__":        
        webServer = HTTPServer(("0.0.0.0", 8080), WebServer)
        print("Server started")
    
        webServer.serve_forever()