Files
benchcoach-django/teamsnap/utils/gen_image.py
2022-05-14 07:16:31 -05:00

331 lines
11 KiB
Python

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFilter, ImageFont
from pathlib import Path
import os
from datetime import datetime
from zoneinfo import ZoneInfo
from typing import List
from dataclasses import dataclass
# image_directory = 'input/images/logos-bw/{filename}.{ext}'
# font_regular_path = "input/fonts/DINAlternate-Bold.ttf"
# font_condensed_path = "input/fonts/DINCondensed-Bold.ttf"
font_regular_path = "benchcoachproject/static/teamsnap/ig/fonts/ScalaSans-BoldLF.otf"
font_condensed_path = "benchcoachproject/static/teamsnap/ig/fonts/ScalaSans-BoldLF.otf"
@dataclass
class Team:
name: str
winlosstie: List[int] = None
image_directory: str = '../input/images/logos-bw/{filename}.{ext}'
@property
def id(self):
return self.name.lower().replace(' ', '-')
@property
def image(self):
path = self.image_directory.format(filename=self.id, ext="png")
if os.path.isfile(path):
return path
else:
return None
@dataclass
class Location:
name: str
address1: str = ""
address2: str = ""
image_directory: str = 'benchcoachproject/static/teamsnap/ig/locations/{filename}.{ext}'
@property
def id(self):
return self.name.lower().replace(' ', '-')
@property
def image(self):
path = self.image_directory.format(filename=self.id, ext="png")
if os.path.isfile(path):
return path
else:
return None
@property
def address(self):
return ",".join([self.address1,self.address2])
args = {
"team_fave" : Team("Hounds"),
"team_opponent" : Team("Trojans"),
"home": False,
"date" : "2021-05-08 12:30 pm",
"location" : Location("Maywood", image_directory="benchcoachproject/static/teamsnap/ig/locations/maywood.{ext}"),
"runs_for": 8,
"runs_against": 9
}
def gen_image (team_fave, team_opponent, date, location=None,
location_name = None,
home=False,
background='location',
address = None,
width = 1080,
height = 1080,
*kwargs,
**args
):
if not isinstance(date, datetime):
# date = parser.parse(date)
# date = date.astimezone(ZoneInfo("America/Chicago"))
pass
if location.image and background == 'location':
background_image = Image.open(location.image).copy()
background_image = background_image.resize((width, height))
# background_image = background_image.filter(ImageFilter.GaussianBlur(radius=5))
background_image = background_image.convert("RGBA")
elif background == 'transparent':
background_image = Image.new('RGBA', (width, height), (0, 0, 0, 0))
else:
background_image = Image.new('RGBA', (width, height), (50, 55, 102))
title_images = []
for team in [team_fave, team_opponent]:
if team.image:
title_images.append(Image.open(team.image).copy())
else:
title_images.append(Image.new('RGBA', (1080, 1080)))
title_image_left = title_images[0]
title_image_right = title_images[1]
# Make a blank image for the rectangle, initialized to a completely
# transparent color.
tmp = Image.new('RGBA', background_image.size, (0, 0, 0, 0))
# Create a drawing context for it.
draw = ImageDraw.Draw(tmp)
# section margin describes the margin of the section rectangles from the sides of the image
section_margin_pct = .05
llx = int(section_margin_pct * background_image.size[0])
urx = int((1 - section_margin_pct) * background_image.size[0])
lly = int((1 - section_margin_pct) * background_image.size[1])
ury = int(.50 * background_image.size[1])
lly2 = int(.49 * background_image.size[1])
ury2 = int(.05 * background_image.size[1])
section_info = Image.open(Path('benchcoachproject/static/teamsnap/ig/graphics/{name}{ext}'.format(name="sign-tan", ext=".png")))
section_info_draw = ImageDraw.Draw(section_info)
section_title = Image.open(Path('benchcoachproject/static/teamsnap/ig/graphics/{name}{ext}'.format(name="sign-green", ext=".png")))
section_title_draw = ImageDraw.Draw(section_title)
# First line: Date
font = ImageFont.truetype(font_regular_path, 62)
text = "{:%a, %B %-d %-I:%M %p}".format(date).upper()
# text = date
text_size = draw.textsize(text, font)
loc = (
1050,
280
)
section_info_draw.text(loc, text, (14,42,28), font=font, anchor="ra")
# Second line: Venue
font = ImageFont.truetype(font_condensed_path, 34)
if not location_name:
text = location.name.upper()
else:
text = location_name.upper()
text_size = section_info_draw.textsize(text, font)
loc = (
1050,
355
)
section_info_draw.text(loc, text, (14,42,28), font=font, anchor="ra")
font = ImageFont.truetype(font_regular_path, 80)
if home:
text = "VS"
else:
text = "AT"
text_size = section_title_draw.textsize(text, font)
loc = (
540,
120
)
color = (255, 255, 255)
section_title_draw.text(loc, text, color, font=font, anchor="mm")
# Alpha composite the two images together.
background_image = Image.alpha_composite(background_image, tmp)
# Title Image Left
title_image_left.thumbnail([350, 350])
loc = (
50, -50
)
section_title.paste(title_image_left, loc, title_image_left)
# Title Image Right
title_image_right.thumbnail([350, 350])
loc = (
650, -50
)
section_title.paste(title_image_right, loc, title_image_right)
# background_image.paste(section_info, (llx, ury), section_info)
# background_image.paste(section_title, (llx, ury2), section_title)
section_title.paste(section_info,(0,0),section_info)
section_title.thumbnail([800, 800])
if background=="badge":
return section_title
background_image.paste(section_title,(
int((background_image.size[0]-section_title.size[0])/2),
height - 360
),section_title)
return background_image
def gen_results_image (team_fave, team_opponent, date,
location=None,
location_name = None,
home=False,
background='location',
address = None,
width = 1080,
height = 1080,
runs_for=0,
runs_against=0,
*kwargs,
**args
):
if not isinstance(date, datetime):
# date = parser.parse(date)
# date = date.astimezone(ZoneInfo("America/Chicago"))
pass
if location.image and background == 'location':
background_image = Image.open(location.image).copy()
background_image = background_image.resize((width, height))
# background_image = background_image.filter(ImageFilter.GaussianBlur(radius=5))
background_image = background_image.convert("RGBA")
elif background == 'transparent':
background_image = Image.new('RGBA', (width, height), (0, 0, 0, 0))
else:
background_image = Image.new('RGBA', (width, height), (50, 55, 102))
title_images = []
for team in [team_fave, team_opponent]:
if team.image:
title_images.append(Image.open(team.image).copy())
else:
title_images.append(Image.new('RGBA', (1080, 1080)))
title_image_left = title_images[0]
title_image_right = title_images[1]
# Make a blank image for the rectangle, initialized to a completely
# transparent color.
tmp = Image.new('RGBA', background_image.size, (0, 0, 0, 0))
# Create a drawing context for it.
draw = ImageDraw.Draw(tmp)
# section margin describes the margin of the section rectangles from the sides of the image
section_margin_pct = .05
llx = int(section_margin_pct * background_image.size[0])
urx = int((1 - section_margin_pct) * background_image.size[0])
lly = int((1 - section_margin_pct) * background_image.size[1])
ury = int(.50 * background_image.size[1])
lly2 = int(.49 * background_image.size[1])
ury2 = int(.05 * background_image.size[1])
#todo fix path
section_info = Image.open(Path('benchcoachproject/static/teamsnap/ig/graphics/{name}{ext}'.format(name="sign-tan", ext=".png")))
section_info_draw = ImageDraw.Draw(section_info)
section_title = Image.open(Path('benchcoachproject/static/teamsnap/ig/graphics/{name}{ext}'.format(name="sign-green", ext=".png")))
section_title_draw = ImageDraw.Draw(section_title)
# First line: Results
loc = (
1050,
265
)
if runs_for > runs_against:
result_letter = "W"
elif runs_for < runs_against:
result_letter = "L"
elif runs_for == runs_against:
result_letter = "T"
font = ImageFont.truetype(font_regular_path, 100)
section_info_draw.text(loc, f"FINAL: {result_letter} {runs_for}-{runs_against}", (14,42,28), font=font, anchor="ra")
# Second line: Date
text = "{:%a, %B %-d %-I:%M %p}".format(date).upper()
# text = date
font = ImageFont.truetype(font_condensed_path, 34)
text_size = section_info_draw.textsize(text, font)
loc = (
1050,
355
)
section_info_draw.text(loc, text, (14,42,28), font=font, anchor="ra")
font = ImageFont.truetype(font_regular_path, 80)
if home:
text = "VS"
else:
text = "AT"
text_size = section_title_draw.textsize(text, font)
loc = (
540,
120
)
color = (255, 255, 255)
section_title_draw.text(loc, text, color, font=font, anchor="mm")
# Alpha composite the two images together.
background_image = Image.alpha_composite(background_image, tmp)
# Title Image Left
title_image_left.thumbnail([350, 350])
loc = (
50, -50
)
section_title.paste(title_image_left, loc, title_image_left)
# Title Image Right
title_image_right.thumbnail([350, 350])
loc = (
650, -50
)
section_title.paste(title_image_right, loc, title_image_right)
# background_image.paste(section_info, (llx, ury), section_info)
# background_image.paste(section_title, (llx, ury2), section_title)
section_title.paste(section_info,(0,0),section_info)
section_title.thumbnail([800, 800])
if background=="badge":
return section_title
background_image.paste(section_title,(
int((background_image.size[0]-section_title.size[0])/2),
height - 360
),section_title)
# background_image.show()
return background_image
# gen_results_image(**args)