Template-Maker / app.py
NAB1108's picture
Update app.py
03d41a2
import numpy as np
import cv2
import matplotlib.pyplot as plt
import cvzone
import gradio as gr
from sklearn.cluster import KMeans
from PIL import Image, ImageFont, ImageDraw, ImageColor
import os
import math
import boto3
import os
AWS_S3_CREDS = {
"aws_access_key_id":os.environ['AccessKey'],
"aws_secret_access_key":os.environ['SecretKey']
}
s3_client = boto3.client('s3',**AWS_S3_CREDS)
def get_color(image):
pixels = image.reshape(-1, 3)
num_colors = 2
kmeans = KMeans(n_clusters=num_colors)
kmeans.fit(pixels)
dominant_colors = kmeans.cluster_centers_.astype(int)
theme_color = dominant_colors[0]
return theme_color
base_color = (195, 212, 220)
def generate_shades(base_color, num_shades):
r, g, b = base_color
shades = []
for i in range(num_shades):
brightness = float(i) / (num_shades - 1)
new_r = int(r * brightness)
new_g = int(g * brightness)
new_b = int(b * brightness)
shades.append((new_r, new_g, new_b))
return shades
def text_to_image(
text: str,
font_filepath: str,
font_size: int,
color: (int, int, int),
font_align="center"
):
font = ImageFont.truetype(font_filepath, size=font_size)
draw = ImageDraw.Draw(Image.new("RGBA", (1, 1), (0, 0, 0, 0)))
bbox = draw.multiline_textbbox((0, 0), text, font=font, align=font_align)
width = math.ceil(bbox[2] - bbox[0])
height = math.ceil(bbox[3] - bbox[1])
img = Image.new("RGBA", (1000, 500), (0, 0, 0, 0))
draw = ImageDraw.Draw(img)
if font_align == "center":
draw_point = ((width - (bbox[2] - bbox[0])) // 2, 0)
elif font_align == "right":
draw_point = (width - (bbox[2] - bbox[0]), 0)
else:
draw_point = (0, 0)
draw.multiline_text(draw_point, text, font=font, fill=color, align=font_align)
return img
def add_line_breaks(text, max_characters_per_line):
lines = []
current_line = ""
for word in text.split():
if len(current_line) + len(word) + 1 <= max_characters_per_line:
if current_line:
current_line += " "
current_line += word
else:
lines.append(current_line)
current_line = word
if current_line:
lines.append(current_line)
return "\n".join(lines)
def hex_to_rgb(hex_code):
hex_code = hex_code.lstrip('#')
if not all(c in '0123456789ABCDEFabcdef' for c in hex_code):
raise ValueError("Invalid hex code format")
r = int(hex_code[0:2], 16)
g = int(hex_code[2:4], 16)
b = int(hex_code[4:6], 16)
return (b, g, r)
def create_img1(imagep, text_overlay, color):
s3_client.download_file('inpaintingnitin', 'D1/1.jpg', '1.jpg')
s3_client.download_file('inpaintingnitin', 'D1/2.jpg', '2.jpg')
s3_client.download_file('inpaintingnitin', 'D1/3.jpg', '3.jpg')
s3_client.download_file('inpaintingnitin', 'D1/Screenshot 2023-08-25 at 2.30.38 PM.png', 'img.png')
s3_client.download_file('inpaintingnitin', 'Poppins-Medium.ttf', 'Poppins-Medium.ttf')
image_path = 'img.png'
image = cv2.imread(image_path)
mask1_path = '3.jpg'
mask = cv2.imread(mask1_path, cv2.IMREAD_GRAYSCALE)
foreground_image_path =imagep
foreground_image = cv2.imread(foreground_image_path)
prim_color = hex_to_rgb(color)
color = generate_shades((prim_color[0],prim_color[1],prim_color[2]), 10)
new_color = color[1]
output_image = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if mask[i, j] > 150:
output_image[i, j] = new_color
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, output_image)
image = output_image
mask2_path = '2.jpg'
mask = cv2.imread(mask2_path, cv2.IMREAD_GRAYSCALE)
new_color = color[8]
output_image = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if mask[i, j] > 150:
output_image[i, j] = new_color
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, output_image)
background_image = output_image
mask_path = '1.jpg'
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
width, height = background_image.shape[1], background_image.shape[0]
white_image = np.ones((height, width, 3), dtype=np.uint8) * 255
foreground_image = cv2.resize(foreground_image, (755, 890))
x_offset = 1000
y_offset = 50
for y in range(foreground_image.shape[0]):
for x in range(foreground_image.shape[1]):
if x + x_offset < width and y + y_offset < height:
white_image[y + y_offset, x + x_offset] = foreground_image[y, x]
foreground_image = white_image
mask = cv2.resize(mask, (background_image.shape[1], background_image.shape[0]))
inv_mask = np.zeros_like(mask)
for i in range(mask.shape[0]):
for j in range(mask.shape[1]):
if mask[i, j] <=150:
inv_mask[i, j] = 255
else:
inv_mask[i, j] = 0
overlay = cv2.bitwise_and(background_image, background_image, mask=inv_mask)
overlay += cv2.bitwise_and(foreground_image, foreground_image, mask=mask)
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, overlay)
img = text_to_image(add_line_breaks(text_overlay, 13),"Poppins-Medium.ttf",100,color[8] )
img.save("outputtext.png", format="PNG")
text = cv2.imread('outputtext.png',cv2.IMREAD_UNCHANGED)
text = cv2.resize(text,(0,0),None,1,1)
blue_channel, green_channel, red_channel, alpha_channel = cv2.split(text)
inverted_image = cv2.merge([red_channel, green_channel, blue_channel, alpha_channel])
final_img = cvzone.overlayPNG(overlay,inverted_image,[180,400])
blue_channel, green_channel, red_channel = cv2.split(final_img)
inverted_image = cv2.merge([red_channel, green_channel, blue_channel])
return inverted_image
def create_img2(imagep, text_overlay, color):
s3_client.download_file('inpaintingnitin', 'D2/1.jpg', '1.jpg')
s3_client.download_file('inpaintingnitin', 'D2/2.jpg', '2.jpg')
s3_client.download_file('inpaintingnitin', 'D2/3.jpg', '3.jpg')
s3_client.download_file('inpaintingnitin', 'D2/Screenshot 2023-08-25 at 2.32.07 PM copy.jpg', 'img.jpg')
s3_client.download_file('inpaintingnitin', 'Poppins-Medium.ttf', 'Poppins-Medium.ttf')
image_path = 'img.jpg'
image = cv2.imread(image_path)
mask1_path = '1.jpg'
mask = cv2.imread(mask1_path, cv2.IMREAD_GRAYSCALE)
foreground_image_path =imagep
foreground_image = cv2.imread(foreground_image_path)
prim_color = hex_to_rgb(color)
color = generate_shades((prim_color[0],prim_color[1],prim_color[2]), 10)
new_color = color[1]
output_image = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if mask[i, j] > 150:
output_image[i, j] = new_color
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, output_image)
image = output_image
mask2_path = '2.jpg'
mask = cv2.imread(mask2_path, cv2.IMREAD_GRAYSCALE)
new_color = color[8]
output_image = image.copy()
for i in range(image.shape[0]):
for j in range(image.shape[1]):
if mask[i, j] > 150:
output_image[i, j] = new_color
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, output_image)
background_image = output_image
mask_path = '3.jpg'
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
width, height = background_image.shape[1], background_image.shape[0]
white_image = np.ones((height, width, 3), dtype=np.uint8) * 255
foreground_image = cv2.resize(foreground_image, (720, 745))
x_offset = 125
y_offset = 123
for y in range(foreground_image.shape[0]):
for x in range(foreground_image.shape[1]):
if x + x_offset < width and y + y_offset < height:
white_image[y + y_offset, x + x_offset] = foreground_image[y, x]
foreground_image = white_image
mask = cv2.resize(mask, (background_image.shape[1], background_image.shape[0]))
inv_mask = np.zeros_like(mask)
for i in range(mask.shape[0]):
for j in range(mask.shape[1]):
if mask[i, j] <=150:
inv_mask[i, j] = 255
else:
inv_mask[i, j] = 0
overlay = cv2.bitwise_and(background_image, background_image, mask=inv_mask)
overlay += cv2.bitwise_and(foreground_image, foreground_image, mask=mask)
output_image_path = 'output_image.jpg'
cv2.imwrite(output_image_path, overlay)
img = text_to_image(add_line_breaks(text_overlay, 13),"Poppins-Medium.ttf",100,color[1] )
img.save("outputtext.png", format="PNG")
text = cv2.imread('outputtext.png',cv2.IMREAD_UNCHANGED)
text = cv2.resize(text,(0,0),None,1,1)
blue_channel, green_channel, red_channel, alpha_channel = cv2.split(text)
inverted_image = cv2.merge([red_channel, green_channel, blue_channel, alpha_channel])
final_img = cvzone.overlayPNG(overlay,inverted_image,[980,400])
blue_channel, green_channel, red_channel = cv2.split(final_img)
inverted_image = cv2.merge([red_channel, green_channel, blue_channel])
return inverted_image
def exec(image, text, color):
image1 = create_img1(image, text, color)
image2 = create_img2(image, text, color)
return image1,image2
interface = gr.Interface(
fn=exec,
inputs=[gr.Image(type='filepath'),
gr.Textbox(label = 'Text'),
gr.ColorPicker(label="Theme Color"),],
outputs=["image","image"],
title="Please use square images for best results",
allow_flagging='never',
theme="default",
cache_examples=False,
).launch( debug=True, share=False)