Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import stone | |
| import tempfile | |
| import os | |
| def get_primary_color(image): | |
| """ | |
| Detects the single most dominant skin color in the first face detected | |
| by selecting the cluster with the highest percentage. | |
| """ | |
| # Save uploaded image to a temp file | |
| tmp = tempfile.NamedTemporaryFile(suffix=".png", delete=False) | |
| image.save(tmp.name, format="PNG") | |
| tmp_path = tmp.name | |
| tmp.close() | |
| try: | |
| # Run stone to get dominant_colors | |
| result = stone.process(tmp_path, image_type="auto", return_report_image=False) | |
| except Exception as e: | |
| os.remove(tmp_path) | |
| return f"<p style='color:red;'>Error: {e}</p>" | |
| finally: | |
| if os.path.exists(tmp_path): | |
| os.remove(tmp_path) | |
| faces = result.get("faces", []) | |
| if not faces: | |
| return "<p>No face detected.</p>" | |
| # Get the list of (color, percent) for the first face | |
| doms = faces[0].get("dominant_colors", []) | |
| if not doms: | |
| return "<p>No skin colors found.</p>" | |
| # Pick the one with max percent | |
| best = max(doms, key=lambda c: c.get("percent", 0)) | |
| hexcode = best.get("color") | |
| if not hexcode: | |
| return "<p>No valid color found.</p>" | |
| # Render a single swatch + hex code | |
| swatch_html = ( | |
| f"<div style='display:flex; align-items:center; gap:8px;'>" | |
| f"<div style='background:{hexcode}; width:50px; height:50px; " | |
| "border-radius:4px; border:1px solid #ccc;'></div>" | |
| f"<span style='font-family:monospace; font-size:1.2em;'>{hexcode}</span>" | |
| "</div>" | |
| ) | |
| return swatch_html | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## 🎯 Primary Face Skin Color") | |
| gr.Markdown("Upload a portrait and get the **most dominant** skin‑tone color.") | |
| with gr.Row(): | |
| inp = gr.Image(type="pil", label="Your Photo") | |
| btn = gr.Button("Detect Color") | |
| out = gr.HTML(label="Primary Skin Color") | |
| btn.click(fn=get_primary_color, inputs=inp, outputs=out) | |
| if __name__ == "__main__": | |
| demo.launch() | |