import gradio as gr import numpy as np # Density of paint in g/ml (this is an approximation, actual density may vary) PAINT_DENSITY = 1.5 def rgb_to_primary(r, g, b, total_amount, unit): # Convert RGB to range 0-1 r, g, b = r/255.0, g/255.0, b/255.0 # Calculate CMY c = 1 - r m = 1 - g y = 1 - b # Calculate K (black) k = min(c, m, y) # Calculate true CMY if k < 1: c = (c - k) / (1 - k) m = (m - k) / (1 - k) y = (y - k) / (1 - k) else: c = m = y = 0 # Calculate white w = 1 - max(c, m, y, k) # Normalize to ensure sum is 1 total = c + m + y + k + w c, m, y, k, w = c/total, m/total, y/total, k/total, w/total # Convert to selected unit yellow = y * total_amount blue = c * total_amount red = m * total_amount black = k * total_amount white = w * total_amount return { f"Yellow ({unit})": round(yellow, 2), f"Blue ({unit})": round(blue, 2), f"Red ({unit})": round(red, 2), f"Black ({unit})": round(black, 2), f"White ({unit})": round(white, 2) } def calculate_colors(color, total_amount, input_unit, output_unit): r, g, b = [int(color[i:i+2], 16) for i in (1, 3, 5)] # Convert input to ml if necessary if input_unit == "mg": total_amount = total_amount / (PAINT_DENSITY * 1000) # Calculate color amounts in ml color_amounts_ml = rgb_to_primary(r, g, b, total_amount, "ml") # Convert to mg if necessary if output_unit == "mg": color_amounts = {k: v * PAINT_DENSITY * 1000 for k, v in color_amounts_ml.items()} color_amounts = {k.replace("ml", "mg"): round(v, 2) for k, v in color_amounts.items()} else: color_amounts = color_amounts_ml # Create color preview color_preview = np.full((50, 50, 3), [r, g, b], dtype=np.uint8) return color_amounts, color_preview # Create Gradio interface iface = gr.Interface( fn=calculate_colors, inputs=[ gr.ColorPicker(label="Select Color"), gr.Number(label="Total Paint Amount", value=100), gr.Radio(["ml", "mg"], label="Input Unit", value="ml"), gr.Radio(["ml", "mg"], label="Output Unit", value="ml") ], outputs=[ gr.JSON(label="Color Amounts"), gr.Image(label="Color Preview", type="numpy") ], title="Paint Color Mixer Calculator", description="Select a color and specify the total amount of paint to calculate the required amounts of primary colors. Choose between ml and mg for input and output units." ) # Launch the interface iface.launch()