52 lines
2.1 KiB
Python
52 lines
2.1 KiB
Python
from loguru import logger
|
|
import sys
|
|
from PIL import Image
|
|
from openai import OpenAI
|
|
|
|
def gen_new_from_given_img(img_path, image_dir, num_img=1, img_size="1024x1024", response_format="url"):
|
|
"""
|
|
Generates variations of a given image using OpenAI's image variation API.
|
|
|
|
This function takes an existing image, processes it, and generates a specified number of new images based on it.
|
|
These generated images are variations of the original, providing creative flexibility.
|
|
|
|
Args:
|
|
img_path (str): Path to the original image file.
|
|
image_dir (str): Directory where the generated images will be saved.
|
|
num_img (int, optional): Number of image variations to generate. Defaults to 1.
|
|
img_size (str, optional): Size of the generated images. Defaults to "1024x1024".
|
|
response_format (str, optional): Format in which the generated images are returned. Defaults to "url".
|
|
|
|
Returns:
|
|
str: Path to the saved image variation.
|
|
|
|
Raises:
|
|
SystemExit: If a critical error occurs that prevents successful execution.
|
|
"""
|
|
try:
|
|
logger.info(f"Starting image variation generation for: {img_path}")
|
|
|
|
# Convert and prepare the image
|
|
png = Image.open(img_path).convert('RGBA')
|
|
background = Image.new('RGBA', png.size, (255, 255, 255))
|
|
alpha_composite = Image.alpha_composite(background, png)
|
|
alpha_composite.save(img_path, 'PNG', quality=80)
|
|
logger.info("Image prepared for variation generation.")
|
|
|
|
client = OpenAI()
|
|
variation_response = client.images.create_variation(
|
|
image=open(img_path, "rb"),
|
|
n=num_img,
|
|
size=img_size,
|
|
response_format=response_format
|
|
)
|
|
|
|
# Saving the generated image
|
|
generated_image_path = save_generated_image(variation_response, image_dir)
|
|
logger.info(f"Image variation generated and saved to: {generated_image_path}")
|
|
return generated_image_path
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error occurred during image variation generation: {e}")
|
|
sys.exit(f"Exiting due to critical error: {e}")
|