Spaces:
Running
Running
File size: 8,233 Bytes
00b57c1 22e7fa9 00b57c1 22e7fa9 00b57c1 5a1adc5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 |
from PIL import Image
from rembg import remove
import cairosvg
import io
import numpy as np
from sklearn.cluster import KMeans
from PIL import Image, ImageDraw, ImageFont
import random
def generate(logo, Vtubername):
def extract_dominant_colors(img, num_colors=3, ignore_edges=True):
if img.mode == 'RGBA':
image = img.convert('RGB')
else:
image = img
image = image.resize((150, 150))
data = np.array(image)
pixels = data.reshape(-1, 3)
if ignore_edges:
edge_pixels = np.concatenate([data[0, :, :], data[-1, :, :], data[:, 0, :], data[:, -1, :]], axis=0)
edge_colors, counts = np.unique(edge_pixels, axis=0, return_counts=True)
background_color = edge_colors[counts.argmax()]
pixels = pixels[~np.all(pixels == background_color, axis=1)]
if len(pixels) == 0:
return np.array([background_color,np.array([60,60,60]),np.array([255,255,255])])
elif len(pixels) == 1:
return np.array([pixels[0],np.array([60,60,60]),np.array([255,255,255])])
elif len(pixels) == 2:
return np.array([pixels[0],pixels[1],np.array([60,60,60])])
model = KMeans(n_clusters=3)
model.fit(pixels)
colors = model.cluster_centers_
colors = colors.round(0).astype(int)
return colors
dominant_colors = extract_dominant_colors(logo, num_colors=3)
template_prime_colors = {
"black color": [0, 0, 0],
"white": [255, 255, 255],
"red": [255, 0, 0],
"lightgreen": [0, 255, 0],
"blue": [0, 0, 255],
"yellow": [255, 255, 0],
"mustard color": [255, 204, 34],
"lightblue": [0, 255, 255],
"pink": [255, 0, 255],
"gray": [128, 128, 128],
"maroon": [128, 0, 0],
"olive": [128, 128, 0],
"green": [0, 128, 0],
"purple": [128, 0, 128],
"navy": [0, 0, 128],
"orange": [255, 165, 0],
"bluegreen": [0, 128, 128],
"lightpurple": [128, 128, 255],
"skyblue color": [0, 128, 255],
"brown": [139,69,19],
}
_primary_color = dominant_colors[0]
closest_color = "black color"
for color in template_prime_colors:
if np.linalg.norm(np.array(template_prime_colors[color]) - _primary_color) < np.linalg.norm(np.array(template_prime_colors[closest_color]) - _primary_color):
closest_color = color
primary_color = closest_color
print(primary_color)
secondary_color=str("rgb("+str(dominant_colors[1][0])+", "+str(dominant_colors[1][1])+", "+str(dominant_colors[1][2])+")")
third_color=str("rgb("+str(dominant_colors[2][0])+", "+str(dominant_colors[2][1])+", "+str(dominant_colors[2][2])+")")
import requests
import os
sdkey = os.environ["sdkey"]
response = requests.post(
f"https://api.stability.ai/v2beta/stable-image/generate/sd3",
headers={
"authorization": f"Bearer "+sdkey,
"accept": "image/*"
},
files={"none": ''},
data={
"model": "sd3",
"prompt": "pop sweety cute kawaii font anime title logo drawn by adobe illustorator. Logo for kids amime. The title logo text is \""+Vtubername+"\""+", The logo text color:"+primary_color + ". Single Logo only.",
"negative_prompt": "subtitle,face, ruby text, subscript, superscript, multiple titles, character, ugly, blurry, dirty, character face, face, watermark, low res, cropped, worst quality, jpeg artifacts, , picture frame, out of frame,animal, person face, low-res, blurry, blur, out of focus, disgusting",
"output_format": "jpeg",
},
)
image = None
if response.status_code == 200:
image = response.content
else:
raise Exception(str(response.json()))
image = Image.open(io.BytesIO(response.content))
title_logo=remove(image)
from huggingface_hub import InferenceClient
client = InferenceClient(model="mistralai/Mixtral-8x7B-Instruct-v0.1")
output = client.text_generation("Make this english to Japanese Hiragana. ex. Robert->はろー HuggingFace->はぎんぐふぇいす "+Vtubername+"->")
hiragana = ""
for char in output:
if '\u3040' <= char <= '\u309f':
hiragana += char
def get_brightness(color):
red, green, blue = color
return (red * 0.299 + green * 0.587 + blue * 0.114) / 255
brighter_color = secondary_color if get_brightness(dominant_colors[1]) > get_brightness(dominant_colors[2]) else third_color
darker_cplor = secondary_color if get_brightness(dominant_colors[1]) < get_brightness(dominant_colors[2]) else third_color
font_color=brighter_color
font_size=100
stroke_width=int(100*0.1)
stroke_color=darker_cplor
# Load the font
font = ImageFont.truetype("oshigo.otf", size=font_size)
japanese_text = hiragana
# Image setup
tile_width, tile_height = int(font_size*1.4), int(font_size*1.4) # Size of individual tiles
num_tiles = len(japanese_text)
total_width = tile_width * num_tiles
total_height = tile_height
# Create a new blank image
result_image = Image.new('RGBA', (total_width, total_height), (0, 0, 0, 0))
draw = ImageDraw.Draw(result_image)
for i, char in enumerate(japanese_text):
# Create an image for each character with transparency
tile_image = Image.new('RGBA', (tile_width, tile_height), (0, 0, 0, 0))
tile_draw = ImageDraw.Draw(tile_image)
# Calculate text position: random within the tile
text_width, text_height = draw.textsize(char, font=font)
x = random.randint(0, (tile_width - text_width)//1.25)
y = random.randint(0, (tile_height - text_height)//1.25)
# Draw text on the tile
tile_draw.text((x, y), char, font=font, fill="white", stroke_width=stroke_width, stroke_fill=stroke_color)
# Paste the tile into the result image
result_image.paste(tile_image, (i * tile_width, 0), tile_image)
# Save or display the image
caption = result_image
def resize_caption_to_logo(logo, caption):
logo_width = logo.width
target_caption_width = int(0.6 * logo_width)
if caption.width > target_caption_width:
aspect_ratio = caption.height / caption.width
new_height = int(target_caption_width * aspect_ratio)
resized_caption = caption.resize((target_caption_width, new_height), Image.ANTIALIAS)
return resized_caption
else:
return caption
caption = resize_caption_to_logo(logo, caption)
center=((title_logo.width - caption.width) // 2,title_logo.height//2)
bottom=(title_logo.width-caption.width)//2,int(title_logo.height-caption.height-40)
lower_right=(title_logo.width-caption.width,int(title_logo.height-caption.height-40))
upper_right=(title_logo.width-caption.width,int(caption.height+40))
# Define the possible positions
positions = [
("center", center),
("bottom", bottom),
("lower_right", lower_right),
("upper_right", upper_right),
]
# Randomly select a position
position, coordinates = random.choice(positions)
# Paste the caption at the selected position
title_logo.paste(caption, coordinates, caption)
return title_logo
css="""
.gradio-container{
background-color: #fff;
background-image:
radial-gradient(#b4f3ea 0%, transparent 30%),
radial-gradient(#ffffcc 0%, transparent 30%); background-size: 40px 40px;
background-position: 0 0, 20px 20px;
}
h1{
font-size: 400%!important;
background: linear-gradient(to bottom, pink, white);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
-webkit-text-stroke: 2px pink;
-webkit-text-stroke-width: 2px;
-webkit-text-stroke-color: pink;
}
"""
import gradio as gr
iface = gr.Interface(
theme=gr.themes.Default(primary_hue="pink",font=[gr.themes.GoogleFont("Mochiy Pop One")]),
css=css,
fn=generate,
inputs=[gr.Image(label="VTuber Photo", type="pil"), gr.Textbox(label="VTuber Name")],
outputs=gr.Image(label="Generated Logo"),
title="Vtuber Logo Generator",
description="①Upload photo you wanna VTuberize❤️ <br>② Input the name⭐️ <br>③Press Generate🧙",
examples=[["hf-logo.png", "HuggingFace"],["Rust_programming_language_black_logo.svg.png","Rust"]],
allow_flagging=False
)
# Launch the interface
iface.launch(debug=True) |