import requests import base64 import os from PIL import Image import io import random def encode_pil_to_base64(image): """ Encode a PIL image to a Base64 string. """ with io.BytesIO() as output_bytes: image.save(output_bytes, format="PNG") # Using PNG format bytes_data = output_bytes.getvalue() return base64.b64encode(bytes_data).decode("utf-8") def save_decoded_image(b64_image, folder_path, image_name): """ Save a Base64 encoded image to a file in the specified folder. Automatically adjusts the filename by adding a sequence number if a file with the same name already exists. """ # Initialize the sequence number and construct the initial file path seq = 0 output_path = os.path.join(folder_path, f"{image_name}.png") # Check if the file exists and adjust the filename if necessary while os.path.exists(output_path): seq += 1 # Construct a new filename with the sequence number output_path = os.path.join(folder_path, f"{image_name}({seq}).png") # Save the image to the new path with open(output_path, 'wb') as image_file: image_file.write(base64.b64decode(b64_image)) print(f"Image saved to: {output_path}") def main(): while True: # Infinite loop # Request the user to input the image file path user_input_path = input("Please enter the path of the reference image (or type 'exit' to quit): ") # Exit the loop if the user types 'exit' if user_input_path.lower() == 'exit': break if not os.path.exists(user_input_path) or not os.path.isfile(user_input_path): print("The specified path does not exist or is not a file. Please try again.") continue # Request the user to input the folder path for saving the generated image user_save_folder = input("Please enter the folder path where you'd like to save the generated image: ") if not os.path.exists(user_save_folder) or not os.path.isdir(user_save_folder): print("The specified save path does not exist or is not a folder. Please try again.") continue # Open and encode the reference image to Base64 with Image.open(user_input_path) as img: encoded_image = encode_pil_to_base64(img) img_width, img_height = img.size # Image dimensions # Generate a unique name for the saved image image_name = f"generated_image_{random.randint(1000, 9999)}" # API URL url = "http://127.0.0.1:7860/sdapi/v1/txt2img" # Update to img2img API if needed # Construct the request payload data = { "prompt": "<lora:CWG_archisketch_v1:1>,Building,pre sketch,masterpiece,best quality,featuring markers,(3D:0.7)", "negative_prompt": "blurry, lower quality, glossy finish,insufficient contrast", "init_images": [encoded_image], # Encoded image in a list "steps": 30, "width": img_width, "height": img_height, "seed": random.randint(1, 10000000), "alwayson_scripts": { "ControlNet": { "args": [ { "enabled": "true", "pixel_perfect": "true", "module": "canny", "model": "control_v11p_sd15_canny_fp16 [b18e0966]", "weight": 1, "image": encoded_image }, { "enabled": "true", "pixel_perfect": "true", "module": "depth", "model": "control_v11f1p_sd15_depth_fp16 [4b72d323]", "weight": 1, "image": encoded_image } ] } } } # Send the request and get the response response = requests.post(url, json=data) response_json = response.json() # Save the generated image to the specified folder with a unique name save_decoded_image(response_json['images'][0], user_save_folder, image_name) if __name__ == '__main__': main()