|
""" Generate an image using the Midjourney API""" |
|
import io |
|
import random |
|
import requests |
|
from PIL import Image |
|
from progress_bar import print_progress_bar |
|
from config import GOAPIKEY |
|
|
|
IMAGINE_ENDPOINT= "https://api.midjourneyapi.xyz/mj/v2/imagine" |
|
FETCH_ENDPOINT = "https://api.midjourneyapi.xyz/mj/v2/fetch" |
|
|
|
headers = { |
|
"X-API-KEY": GOAPIKEY |
|
} |
|
|
|
def midjourney_generate_img(prompt, api_key=GOAPIKEY): |
|
"""Generate an image using the Midjourney API |
|
|
|
Keyword arguments: |
|
prompt -- The prompt to generate the image from |
|
Return: An image saved in a .png file |
|
""" |
|
headers["X-API-KEY"] = api_key |
|
img_generation_data = { |
|
"prompt": prompt, |
|
"aspect_ratio": "16:9", |
|
"process_mode": "fast", |
|
"webhook_endpoint": "", |
|
"webhook_secret": "" |
|
} |
|
create_img_response = requests.post( |
|
IMAGINE_ENDPOINT, |
|
headers=headers, |
|
json=img_generation_data, |
|
timeout=30) |
|
if create_img_response.status_code == 200: |
|
print("Request for an img to Midjourney: successfully!") |
|
task_id = create_img_response.json()['task_id'] |
|
else: |
|
print(f"Image creation failed, please review details: {create_img_response.status_code} \ |
|
{create_img_response.text}") |
|
|
|
print_progress_bar(50, msg='Generating MidJourney img, please wait...', bar_length=20) |
|
fetch_img_response = requests.post(FETCH_ENDPOINT, |
|
headers=headers, |
|
json={"task_id": task_id}, |
|
timeout=30) |
|
status_img = fetch_img_response.json()['status'] |
|
while status_img != "finished": |
|
|
|
print_progress_bar(10, msg='Generating MidJourney img, please wait...', bar_length=20) |
|
fetch_img_response = requests.post(FETCH_ENDPOINT, |
|
headers=headers, |
|
json={"task_id": task_id}, |
|
timeout=30) |
|
status_img = fetch_img_response.json()['status'] |
|
if status_img == "failed": |
|
print( |
|
f"Image generation failed, please review details: {fetch_img_response.status_code} \ |
|
{fetch_img_response.text}" |
|
) |
|
|
|
|
|
print("Saving img...") |
|
task_result_image_url = fetch_img_response.json()['task_result']['image_url'] |
|
image_response = requests.get(task_result_image_url, timeout=30) |
|
|
|
img = Image.open(io.BytesIO(image_response.content)) |
|
img.save('output_img/midjourney_generated_img.png') |
|
print("Image saved in output_img/midjourney_generated_img.png") |
|
|
|
|
|
img_width, img_height = img.size |
|
target_width = img_width // 2 |
|
target_height = img_height // 2 |
|
part = random.randint(1, 4) |
|
if part == 1: |
|
img_cropped = img.crop((0, 0, target_width, target_height)) |
|
elif part == 2: |
|
img_cropped = img.crop((target_width, 0, img_width, target_height)) |
|
elif part == 3: |
|
img_cropped = img.crop((0, target_height, target_width, img_height)) |
|
else: |
|
img_cropped = img.crop((target_width, target_height, img_width, img_height)) |
|
|
|
img_cropped.save('output_img/midjourney_single_img.png') |
|
print("Single image saved in output_img/midjourney_single_img.png") |
|
return "output_img/midjourney_single_img.png" |
|
|