I am trying to add COLOR emojis onto images as overlay, but it seems like the emojis keep being rendered in black and white, and also transparent:
example output
This is what I’m currently working with:
def add_text_overlay(image_path, text, font_path, emoji_font_path, font_size, text_spacing, x_padding, output_path,
text_position, offset_x, offset_y):
with PILImage.open(image_path) as img:
img = crop_and_resize(img, 1080, 1440)
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(font_path, font_size)
# Load the emoji font using PIL
emoji_font = None
try:
emoji_font = ImageFont.truetype(emoji_font_path, 137) # Adjust pixel size as needed
except OSError as e:
logging.error(f"Unable to load the emoji font: {e}")
logging.error(f"Path checked: {os.path.abspath(emoji_font_path)}")
emoji_font = font # Fallback to regular font if emoji font fails
lines = wrap_text(text, 28)
fixed_line_height = font_size + text_spacing
total_text_height = fixed_line_height * len(lines)
initial_text_y = (img.height - total_text_height) / 2 + offset_y
for i, line in enumerate(lines):
text_bbox = draw.textbbox((0, 0), line, font=font)
text_width = text_bbox[2] - text_bbox[0]
if text_position == 'left':
text_x = x_padding + offset_x
elif text_position == 'right':
text_x = img.width - text_width - x_padding + offset_x
else:
text_x = (img.width - text_width) / 2 + offset_x
text_y = initial_text_y + i * fixed_line_height
if text_x < 0:
text_x = 0
if text_x + text_width > img.width:
text_x = img.width - text_width
# Draw each character with the appropriate font
for char in line:
char_font = emoji_font if is_emoji(char) else font # Use emoji font for emoji characters
draw.text((text_x, text_y), char, font=char_font, fill="black")
text_x += char_font.getbbox(char)[2] # Update this line to use getbbox
img.save(output_path)
I was having “invalid pixel size” error for a while until I changed the pixel size to 137. then afterwards it just drew the monochrome transparent emoji.
jet chua is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.