eve / sd.py
ChandimaPrabath's picture
Update sd.py
3f0b032 verified
raw
history blame
4.19 kB
import requests
from PIL import Image, PngImagePlugin
import base64
import os
from datetime import datetime
import io
import yaml
# Configuration
IMAGE_GENERATION_URL = os.getenv("SD_API_URL")
CACHE_DIR = '/tmp/cache' # Use /tmp directory which is writable
IMGBB_API_KEY = os.getenv("IMGBB_API_KEY") # Replace with your ImgBB API key
# Ensure the cache directory exists
os.makedirs(CACHE_DIR, exist_ok=True)
def load_config():
with open('config.yaml', 'r') as f:
return yaml.safe_load(f)
def upload_to_imgbb(image_path, file_name):
"""
Uploads image file to ImgBB and returns the URL.
Args:
image_path (str): Path to the image file.
file_name (str): Name of the image file.
Returns:
str: URL of the uploaded image on ImgBB.
"""
try:
with open(image_path, 'rb') as f:
image_data = f.read()
response = requests.post(
"https://api.imgbb.com/1/upload",
params={
"key": IMGBB_API_KEY,
},
files={
"image": (file_name, image_data)
}
)
response.raise_for_status()
result = response.json()
if result["data"] and "url" in result["data"]:
return result["data"]["url"]
else:
print("Failed to upload image to ImgBB.")
return None
except requests.RequestException as e:
print(f"Error uploading image to ImgBB: {e}")
return None
except Exception as e:
print(f"Unexpected error uploading image to ImgBB: {e}")
return None
def generate_sd(prompt):
"""
Generate an image using the specified prompt and save it to the cache directory.
Embeds the YAML payload into the image metadata.
Returns:
image_data (bytes): Raw image data as bytes.
image_path (str): Absolute path to the saved image file using forward slashes.
image_url (str): URL of the uploaded image on ImgBB.
"""
config = load_config()
config = config['config']
# Define payload for the POST request
payload = {
"prompt": prompt,
"steps": config['SD']['steps'],
"width": config['SD']['width'],
"height": config['SD']['height'],
"sampler_name": config['SD']['sampler_name'],
"seed": -1,
"cfg_scale": config['SD']['cfg_scale'],
"negative_prompt": config['SD']['negative_prompt'],
}
try:
# Send POST request to the image generation endpoint
response = requests.post(IMAGE_GENERATION_URL, json=payload)
response.raise_for_status() # Raise an exception for HTTP errors
r = response.json()
# Decode the image and save it to the cache folder
if 'images' in r and r['images']:
image_data = base64.b64decode(r['images'][0])
timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
image_filename = f"image_{timestamp}.png"
image_path = os.path.abspath(os.path.join(CACHE_DIR, image_filename))
# Save the image as a PNG file
with open(image_path, 'wb') as f:
f.write(image_data)
# Open the image with Pillow
img = Image.open(image_path)
# Convert payload to YAML string
yaml_data = yaml.dump(payload)
# Embed YAML data into image metadata
metadata = PngImagePlugin.PngInfo()
metadata.add_text("YAML", yaml_data)
# Save the image with updated metadata
img.save(image_path, "PNG", pnginfo=metadata)
# Upload image to ImgBB
image_url = upload_to_imgbb(image_path, image_filename)
# Convert the path to use forward slashes
image_path = image_path.replace('\\', '/')
return image_data, image_path
else:
print("No images found in the response.")
return None, None
except requests.RequestException as e:
print(f"HTTP request error: {e}")
return None, None
except Exception as e:
print(f"Error generating image: {e}")
return None, None