Image_editing / app.py
sam2ai's picture
Update app.py
49f83cc verified
import gradio as gr
import json
def build_json(
api_key,
reference_image,
scene,
subject_type,
age_range,
hair,
makeup,
jewellery,
top,
bottom,
footwear,
wardrobe_notes,
pose_angle,
body_pose,
hands_pose,
framing,
camera_device,
flash,
orientation,
aspect_ratio,
distance,
focus,
texture,
sharpness,
color,
effects,
background_environment,
background_props,
style_genre,
authenticity,
use_original_structure,
face_description,
ban_mirror,
ban_phone,
ban_selfie,
ban_grainy,
ban_harsh_flash,
ban_logos,
ban_nsfw,
ban_cropped_feet,
output_count,
output_size,
safety,
variant_name,
variant_angle,
):
banned_items = []
if ban_mirror:
banned_items.append("mirror")
if ban_phone:
banned_items.append("phone")
if ban_selfie:
banned_items.append("selfie look")
if ban_grainy:
banned_items.append("grainy noise")
if ban_harsh_flash:
banned_items.append("harsh LED flash")
if ban_logos:
banned_items.append("logos/brand text")
if ban_nsfw:
banned_items.append("nsfw")
if ban_cropped_feet:
banned_items.append("cropped feet")
output_json = {
"scene": scene,
"subject": {
"type": subject_type,
"age_range": age_range,
"hair": hair,
"makeup": makeup,
"jewellery": jewellery,
},
"wardrobe": {
"top": top,
"bottom": bottom,
"footwear": footwear,
"notes": wardrobe_notes,
},
"pose": {
"angle": pose_angle,
"body": body_pose,
"hands": hands_pose,
"framing": framing,
},
"camera": {
"device": camera_device,
"flash": flash,
"orientation": orientation,
"aspect_ratio": aspect_ratio,
"distance": distance,
"focus": focus,
},
"look": {
"texture": texture,
"sharpness": sharpness,
"color": color,
"effects": effects,
},
"background": {
"environment": background_environment,
"props": background_props,
},
"style": {"genre": style_genre, "authenticity": authenticity},
"reference_face": {
"use_original_structure": use_original_structure,
"description": face_description,
},
"ban": banned_items,
"output": {
"count": output_count,
"size": output_size,
"safety": safety
},
"variants": [{"name": variant_name, "angle": variant_angle}],
}
# The user's API key is available in the 'api_key' variable.
# You can now use this key and the reference_image path to call the
# gemini nano banana API with the generated 'output_json'.
# For this example, we will just return the generated JSON.
return json.dumps(output_json, indent=4)
with gr.Blocks() as demo:
gr.Markdown("# Gemini Nano Banana Image Generator Interface")
gr.Markdown(
"Fill in the details below to generate the JSON input for the image generation model."
)
with gr.Tabs():
with gr.TabItem("Authentication and Image"):
api_key_input = gr.Textbox(
label="Gemini Nano Banana API Key", type="password"
)
reference_image_input = gr.Image(
label="Reference Image", type="filepath"
)
with gr.TabItem("Scene and Subject"):
with gr.Row():
scene_input = gr.Textbox(
label="Scene", value="cinematic outdoor portrait; professional photography"
)
with gr.Row():
subject_type_input = gr.Textbox(
label="Subject Type", value="adult woman (idol vibe)"
)
age_range_input = gr.Textbox(label="Age Range", value="20s")
with gr.Row():
hair_input = gr.Textbox(
label="Hair",
value="straight or styled natural open hair with natural shine",
)
makeup_input = gr.Textbox(
label="Makeup", value="glossy lips, soft eyeliner, luminous skin"
)
jewellery_input = gr.Textbox(
label="Jewellery", value="small hoops, thin chain, subtle bracelets"
)
with gr.TabItem("Wardrobe"):
with gr.Row():
top_input = gr.Textbox(label="Top", value="basic tee or camisole")
bottom_input = gr.Textbox(
label="Bottom", value="denim shorts or mini skirt"
)
footwear_input = gr.Textbox(
label="Footwear", value="sneakers or ankle boots"
)
with gr.Row():
wardrobe_notes_input = gr.Textbox(
label="Wardrobe Notes",
value="casual modern look, styled for natural setting",
)
with gr.TabItem("Pose and Framing"):
with gr.Row():
pose_angle_input = gr.Dropdown(
label="Pose Angle",
choices=["three-quarter", "full body"],
value="three-quarter",
)
body_pose_input = gr.Textbox(
label="Body Pose",
value="standing or walking casually, relaxed natural posture",
)
with gr.Row():
hands_pose_input = gr.Textbox(
label="Hands Pose",
value="one resting by side or touching hair, the other relaxed",
)
framing_input = gr.Dropdown(
label="Framing",
choices=["head-to-toe", "waist-up"],
value="waist-up",
)
with gr.TabItem("Camera and Look"):
with gr.Row():
camera_device_input = gr.Textbox(
label="Camera Device",
value="professional cinema camera / DSLR with prime lens",
)
flash_input = gr.Textbox(
label="Flash", value="none; natural golden hour light or soft reflectors"
)
with gr.Row():
orientation_input = gr.Dropdown(
label="Orientation", choices=["vertical", "horizontal"], value="vertical"
)
aspect_ratio_input = gr.Dropdown(
label="Aspect Ratio", choices=["16:9", "3:2", "4:3", "1:1"], value="16:9"
)
with gr.Row():
distance_input = gr.Textbox(
label="Distance", value="cinematic portrait distance with shallow depth"
)
focus_input = gr.Textbox(
label="Focus", value="sharp on subject; soft bokeh background"
)
with gr.Row():
texture_input = gr.Textbox(
label="Texture", value="smooth high-resolution detail"
)
sharpness_input = gr.Textbox(
label="Sharpness", value="very high; crisp cinematic clarity"
)
with gr.Row():
color_input = gr.Textbox(
label="Color", value="warm cinematic grading; golden tones and soft contrast"
)
effects_input = gr.Textbox(
label="Effects",
value="subtle film grain; natural light flares, depth of field",
)
with gr.TabItem("Background and Style"):
with gr.Row():
background_environment_input = gr.Textbox(
label="Background Environment",
value="nature setting — forest, park, or meadow with soft light",
)
background_props_input = gr.Textbox(
label="Background Props", value="none; focus on subject against natural backdrop"
)
with gr.Row():
style_genre_input = gr.Textbox(
label="Style Genre", value="cinematic portrait photography"
)
authenticity_input = gr.Textbox(
label="Authenticity", value="natural, elegant, polished"
)
with gr.TabItem("Reference Face and Bans"):
with gr.Row():
use_original_structure_input = gr.Checkbox(
label="Use Original Face Structure", value=True
)
with gr.Row():
face_description_input = gr.Textbox(
label="Face Description",
value="maintain the same face shape, features, and proportions as in the provided reference image",
)
with gr.Row():
gr.Markdown("#### Banned Items")
with gr.Row():
ban_mirror_input = gr.Checkbox(label="Mirror")
ban_phone_input = gr.Checkbox(label="Phone")
ban_selfie_input = gr.Checkbox(label="Selfie Look")
ban_grainy_input = gr.Checkbox(label="Grainy Noise")
with gr.Row():
ban_harsh_flash_input = gr.Checkbox(label="Harsh LED Flash")
ban_logos_input = gr.Checkbox(label="Logos/Brand Text")
ban_nsfw_input = gr.Checkbox(label="NSFW")
ban_cropped_feet_input = gr.Checkbox(label="Cropped Feet")
with gr.TabItem("Output and Variants"):
with gr.Row():
output_count_input = gr.Slider(
label="Output Count", minimum=1, maximum=10, step=1, value=1
)
output_size_input = gr.Textbox(label="Output Size", value="1920x1080")
safety_input = gr.Dropdown(
label="Safety", choices=["strict", "moderate", "none"], value="strict"
)
with gr.Row():
variant_name_input = gr.Textbox(
label="Variant Name", value="cinematic_nature_fullbody"
)
variant_angle_input = gr.Textbox(
label="Variant Angle",
value="full-body shot in meadow or forest path, subject centered with depth of field",
)
generate_button = gr.Button("Generate JSON")
json_output = gr.JSON(label="Generated JSON")
generate_button.click(
fn=build_json,
inputs=[
api_key_input,
reference_image_input,
scene_input,
subject_type_input,
age_range_input,
hair_input,
makeup_input,
jewellery_input,
top_input,
bottom_input,
footwear_input,
wardrobe_notes_input,
pose_angle_input,
body_pose_input,
hands_pose_input,
framing_input,
camera_device_input,
flash_input,
orientation_input,
aspect_ratio_input,
distance_input,
focus_input,
texture_input,
sharpness_input,
color_input,
effects_input,
background_environment_input,
background_props_input,
style_genre_input,
authenticity_input,
use_original_structure_input,
face_description_input,
ban_mirror_input,
ban_phone_input,
ban_selfie_input,
ban_grainy_input,
ban_harsh_flash_input,
ban_logos_input,
ban_nsfw_input,
ban_cropped_feet_input,
output_count_input,
output_size_input,
safety_input,
variant_name_input,
variant_angle_input,
],
outputs=json_output,
)
if __name__ == "__main__":
demo.launch()