diffsketcher / handler_fallback.py
jree423's picture
Update with actual DiffSketcher model integration and comprehensive dependencies
023c371 verified
raw
history blame
6.92 kB
from PIL import Image, ImageDraw
import io
import random
import math
class EndpointHandler:
def __init__(self):
"""Initialize the DiffSketcher handler with fallback PIL drawing"""
pass
def __call__(self, data):
"""
Generate a sketch-style image using PIL drawing (fallback method)
Args:
data (dict): Input data containing:
- inputs (str): Text prompt
- parameters (dict): Generation parameters
Returns:
PIL.Image.Image: Generated sketch image
"""
try:
# Extract inputs
prompt = data.get("inputs", "")
parameters = data.get("parameters", {})
# Extract parameters
width = parameters.get("width", 224)
height = parameters.get("height", 224)
guidance_scale = parameters.get("guidance_scale", 7.5)
seed = parameters.get("seed", 42)
# Set random seed for reproducibility
random.seed(seed)
# Create white background
image = Image.new('RGB', (width, height), 'white')
draw = ImageDraw.Draw(image)
# Generate sketch based on prompt keywords
self._draw_sketch_from_prompt(draw, prompt, width, height)
return image
except Exception as e:
# Return error image
error_image = Image.new('RGB', (224, 224), 'white')
error_draw = ImageDraw.Draw(error_image)
error_draw.text((10, 100), f"Error: {str(e)[:30]}", fill='red')
return error_image
def _draw_sketch_from_prompt(self, draw, prompt, width, height):
"""Draw a simple sketch based on prompt keywords"""
prompt_lower = prompt.lower()
# Define colors for sketching
colors = ['black', 'gray', 'darkgray']
if any(word in prompt_lower for word in ['car', 'vehicle', 'automobile']):
self._draw_car(draw, width, height, colors)
elif any(word in prompt_lower for word in ['house', 'building', 'home']):
self._draw_house(draw, width, height, colors)
elif any(word in prompt_lower for word in ['flower', 'plant', 'bloom']):
self._draw_flower(draw, width, height, colors)
elif any(word in prompt_lower for word in ['tree', 'forest']):
self._draw_tree(draw, width, height, colors)
elif any(word in prompt_lower for word in ['mountain', 'landscape']):
self._draw_mountain(draw, width, height, colors)
else:
self._draw_abstract(draw, width, height, colors)
def _draw_car(self, draw, width, height, colors):
"""Draw a simple car sketch"""
cx, cy = width // 2, height // 2
# Car body
draw.rectangle([cx-60, cy-20, cx+60, cy+20], outline=colors[0], width=2)
# Car roof
draw.rectangle([cx-40, cy-40, cx+40, cy-20], outline=colors[0], width=2)
# Wheels
draw.ellipse([cx-50, cy+10, cx-30, cy+30], outline=colors[0], width=2)
draw.ellipse([cx+30, cy+10, cx+50, cy+30], outline=colors[0], width=2)
# Windows
draw.rectangle([cx-35, cy-35, cx+35, cy-25], outline=colors[1], width=1)
def _draw_house(self, draw, width, height, colors):
"""Draw a simple house sketch"""
cx, cy = width // 2, height // 2
# House base
draw.rectangle([cx-50, cy-10, cx+50, cy+40], outline=colors[0], width=2)
# Roof
draw.polygon([cx-60, cy-10, cx, cy-50, cx+60, cy-10], outline=colors[0], width=2)
# Door
draw.rectangle([cx-15, cy+10, cx+15, cy+40], outline=colors[1], width=2)
# Windows
draw.rectangle([cx-40, cy-5, cx-25, cy+10], outline=colors[1], width=1)
draw.rectangle([cx+25, cy-5, cx+40, cy+10], outline=colors[1], width=1)
def _draw_flower(self, draw, width, height, colors):
"""Draw a simple flower sketch"""
cx, cy = width // 2, height // 2
# Stem
draw.line([cx, cy+20, cx, cy+60], fill=colors[0], width=3)
# Petals
for i in range(6):
angle = i * 60 * math.pi / 180
x = cx + 25 * math.cos(angle)
y = cy + 25 * math.sin(angle)
draw.ellipse([x-8, y-8, x+8, y+8], outline=colors[0], width=2)
# Center
draw.ellipse([cx-8, cy-8, cx+8, cy+8], fill=colors[1], outline=colors[0], width=2)
# Leaves
draw.ellipse([cx-10, cy+30, cx+10, cy+50], outline=colors[0], width=2)
def _draw_tree(self, draw, width, height, colors):
"""Draw a simple tree sketch"""
cx, cy = width // 2, height // 2
# Trunk
draw.rectangle([cx-8, cy+10, cx+8, cy+60], outline=colors[0], width=2)
# Tree crown (circle)
draw.ellipse([cx-40, cy-40, cx+40, cy+20], outline=colors[0], width=2)
# Branches
for i in range(5):
angle = (i * 72 - 90) * math.pi / 180
x = cx + 30 * math.cos(angle)
y = cy + 30 * math.sin(angle)
draw.line([cx, cy, x, y], fill=colors[1], width=1)
def _draw_mountain(self, draw, width, height, colors):
"""Draw a simple mountain landscape"""
cx, cy = width // 2, height // 2
# Mountains
draw.polygon([20, cy+30, 80, cy-40, 140, cy+30], outline=colors[0], width=2)
draw.polygon([100, cy+30, 160, cy-20, 200, cy+30], outline=colors[0], width=2)
# Ground line
draw.line([0, cy+30, width, cy+30], fill=colors[1], width=1)
# Sun
draw.ellipse([width-60, 20, width-20, 60], outline=colors[1], width=2)
def _draw_abstract(self, draw, width, height, colors):
"""Draw abstract shapes for unknown prompts"""
cx, cy = width // 2, height // 2
# Random geometric shapes
for i in range(5):
x = random.randint(20, width-20)
y = random.randint(20, height-20)
size = random.randint(10, 30)
if i % 3 == 0:
draw.ellipse([x-size, y-size, x+size, y+size], outline=colors[i%len(colors)], width=2)
elif i % 3 == 1:
draw.rectangle([x-size, y-size, x+size, y+size], outline=colors[i%len(colors)], width=2)
else:
points = []
for j in range(3):
px = x + size * math.cos(j * 120 * math.pi / 180)
py = y + size * math.sin(j * 120 * math.pi / 180)
points.extend([px, py])
draw.polygon(points, outline=colors[i%len(colors)], width=2)