Spaces:
Running
Running
import base64 | |
import os | |
import mimetypes | |
import tempfile | |
import time | |
import google.generativeai as genai | |
import gradio as gr | |
from PIL import Image as PILImage | |
def generate_image(api_key, prompt, input_image, file_name): | |
# Validate inputs | |
if not api_key: | |
return None, "Please enter your Gemini API key" | |
if not prompt and input_image is None: | |
return None, "Please enter a prompt and/or upload an input image" | |
if not file_name: | |
file_name = f"gemini_image_{int(time.time())}" | |
try: | |
# Set up the client | |
genai.configure(api_key=api_key) | |
model = genai.GenerativeModel("gemini-2.0-flash-exp-image-generation") | |
# Create generation config | |
generation_config = { | |
"response_modalities": ["image", "text"], | |
"safety_settings": { | |
"HARM_CATEGORY_HARASSMENT": "BLOCK_NONE", | |
"HARM_CATEGORY_HATE_SPEECH": "BLOCK_NONE", | |
"HARM_CATEGORY_SEXUALLY_EXPLICIT": "BLOCK_NONE", | |
"HARM_CATEGORY_DANGEROUS_CONTENT": "BLOCK_NONE", | |
"HARM_CATEGORY_CIVIC_INTEGRITY": "BLOCK_NONE", | |
} | |
} | |
# Create a temporary directory to store the image | |
temp_dir = tempfile.mkdtemp() | |
generated_image_path = None | |
generation_text = "" | |
# Prepare content based on inputs | |
content = [] | |
# Add text prompt if provided | |
if prompt: | |
content.append(prompt) | |
# Add image if provided | |
if input_image is not None: | |
# If the input is a file path (string), open the image | |
if isinstance(input_image, str): | |
img = PILImage.open(input_image) | |
content.append(img) | |
# If the input is already a numpy array from Gradio | |
else: | |
img = PILImage.fromarray(input_image) | |
content.append(img) | |
# Generate the content | |
response = model.generate_content( | |
content, | |
generation_config=generation_config, | |
stream=True | |
) | |
for chunk in response: | |
if hasattr(chunk, 'candidates') and chunk.candidates: | |
candidate = chunk.candidates[0] | |
if hasattr(candidate, 'content') and candidate.content: | |
for part in candidate.content.parts: | |
if hasattr(part, 'inline_data') and part.inline_data: | |
inline_data = part.inline_data | |
file_extension = mimetypes.guess_extension(inline_data.mime_type) or '.jpg' | |
generated_image_path = os.path.join(temp_dir, f"{file_name}{file_extension}") | |
with open(generated_image_path, "wb") as f: | |
f.write(inline_data.data) | |
generation_text += f"Image of type {inline_data.mime_type} generated successfully." | |
elif hasattr(part, 'text') and part.text: | |
generation_text += part.text | |
if generated_image_path: | |
return generated_image_path, generation_text | |
else: | |
return None, "No image was generated. Try a different prompt or input image." | |
except Exception as e: | |
return None, f"Error: {str(e)}" | |
def create_ui(): | |
with gr.Blocks(title="Gemini Image Generator") as demo: | |
gr.Markdown("# Gemini Image Generator") | |
gr.Markdown("Generate images using Google's Gemini 2.0 Flash Image Generation model") | |
with gr.Row(): | |
with gr.Column(): | |
api_key = gr.Textbox( | |
label="Gemini API Key", | |
placeholder="Enter your Gemini API key here", | |
type="password" | |
) | |
prompt = gr.Textbox( | |
label="Prompt", | |
placeholder="Describe the image you want to generate", | |
lines=3 | |
) | |
input_image = gr.Image( | |
label="Input Image (Optional)", | |
type="numpy" | |
) | |
file_name = gr.Textbox( | |
label="Output File Name (optional)", | |
placeholder="Enter a file name (without extension)" | |
) | |
generate_btn = gr.Button("Generate Image", variant="primary") | |
with gr.Column(): | |
output_image = gr.Image(label="Generated Image", type="filepath") | |
output_text = gr.Textbox(label="Generation Info", lines=2) | |
generate_btn.click( | |
fn=generate_image, | |
inputs=[api_key, prompt, input_image, file_name], | |
outputs=[output_image, output_text] | |
) | |
gr.Markdown(""" | |
## How to use | |
1. Enter your Gemini API key (get one from https://ai.google.dev/) | |
2. Write a detailed prompt describing the image you want to generate | |
3. (Optional) Upload an input image to influence the generation | |
4. (Optional) Provide a file name for your generated image | |
5. Click "Generate Image" and wait for the result | |
## Notes | |
- The model used is `gemini-2.0-flash-exp-image-generation` | |
- You can use text prompts, input images, or both together | |
- All safety filters are set to "BLOCK_NONE" - use responsibly | |
- Image generation may take a few seconds to complete | |
""") | |
return demo | |
if __name__ == "__main__": | |
demo = create_ui() | |
demo.launch() |