| import gradio as gr |
| import requests |
| from PIL import Image |
| import io |
|
|
| def generate_kontext_image(input_image, prompt, width=1024, height=1024, seed=-1, model="dreamshaper", nologo=True, enhance=False): |
| """ |
| Generate a transformed image using the Pollinations API. |
| |
| Args: |
| input_image (PIL.Image): Input image to transform. |
| prompt (str): Prompt for the transformation. |
| width (int): Width of the output image. |
| height (int): Height of the output image. |
| seed (int): Random seed for generation (-1 for random). |
| model (str): Model to use (default: 'dreamshaper'). |
| nologo (bool): Whether to exclude logo. |
| enhance (bool): Whether to enhance the image. |
| |
| Returns: |
| PIL.Image or str: Generated image or error message. |
| """ |
| |
| image_bytes = io.BytesIO() |
| input_image.save(image_bytes, format='JPEG') |
| image_bytes.seek(0) |
| |
| input_image_url = "" |
| |
| try: |
| upload_response = requests.post( |
| 'https://image.pollinations.ai/upload', |
| files={'file': ('input_image.jpg', image_bytes, 'image/jpeg')} |
| ) |
| upload_response.raise_for_status() |
| upload_result = upload_response.json() |
| input_image_url = upload_result.get('ipfs') |
| |
| if not input_image_url: |
| return "Error: Could not retrieve a public URL after uploading the image." |
| |
| except requests.RequestException as e: |
| return f"Error: Failed to upload the image to the server - {e}" |
|
|
| |
| base_url = "https://image.pollinations.ai/prompt" |
| |
| |
| encoded_prompt = requests.utils.quote(prompt) |
| api_url = f"{base_url}/{encoded_prompt}" |
|
|
| query_params = { |
| "model": model, |
| "image": input_image_url, |
| "width": width, |
| "height": height, |
| "seed": seed, |
| "nologo": str(nologo).lower(), |
| "enhance": str(enhance).lower() |
| } |
|
|
| try: |
| |
| response = requests.get(api_url, params=query_params, stream=True) |
| response.raise_for_status() |
| |
| |
| output_image = Image.open(io.BytesIO(response.content)) |
| return output_image |
| |
| except requests.RequestException as e: |
| error_details = str(e) |
| try: |
| |
| error_details = e.response.json().get("message", e.response.text) |
| except: |
| pass |
| return f"Error: API request failed. Details: {error_details}" |
|
|
|
|
| def app_interface(input_image, prompt, width, height, seed, nologo, enhance): |
| """ |
| Gradio interface function to handle user inputs and display results. |
| """ |
| if input_image is None: |
| return "Please upload an image." |
| if not prompt: |
| return "Please provide a prompt." |
| |
| |
| return generate_kontext_image( |
| input_image=input_image, |
| prompt=prompt, |
| width=width, |
| height=height, |
| seed=seed, |
| model="dreamshaper", |
| nologo=nologo, |
| enhance=enhance |
| ) |
|
|
| |
| with gr.Blocks(title="Image Transformation") as demo: |
| gr.Markdown("# Image Transformation App") |
| gr.Markdown("Upload an image, provide a transformation prompt, and generate a new image.") |
| |
| with gr.Row(): |
| with gr.Column(): |
| input_image = gr.Image(type="pil", label="Upload Image") |
| prompt = gr.Textbox(label="Prompt", placeholder="e.g., transform this image into a surreal painting") |
| width = gr.Slider(minimum=256, maximum=2048, value=1024, step=1, label="Width") |
| height = gr.Slider(minimum=256, maximum=2048, value=1024, step=1, label="Height") |
| seed = gr.Number(value=-1, label="Seed (-1 for random)", precision=0) |
| nologo = gr.Checkbox(value=True, label="No Logo") |
| enhance = gr.Checkbox(value=False, label="Enhance Image") |
| submit_button = gr.Button("Generate Image") |
| |
| with gr.Column(): |
| output = gr.Image(label="Generated Image") |
| |
| submit_button.click( |
| fn=app_interface, |
| inputs=[input_image, prompt, width, height, seed, nologo, enhance], |
| outputs=output |
| ) |
|
|
| |
| if __name__ == "__main__": |
| demo.launch() |