integrations: Generate avatars using pyvips.

This commit is contained in:
Alex Vandiver
2024-06-13 03:23:00 +00:00
committed by Alex Vandiver
parent 215c22ec3d
commit 5ff4d9f88a
129 changed files with 8 additions and 31 deletions

View File

@@ -1,6 +1,5 @@
#!/usr/bin/env python3
import argparse
import io
import os
import sys
@@ -16,43 +15,21 @@ import django
django.setup()
import cairosvg
from PIL import Image
import pyvips
from zerver.lib.integrations import INTEGRATIONS
from zerver.lib.storage import static_path
from zerver.lib.thumbnail import DEFAULT_AVATAR_SIZE, resize_avatar
def create_square_image(png: bytes) -> bytes:
img = Image.open(io.BytesIO(png))
if img.height == img.width:
return png
size = max(img.height, img.width)
new_img = Image.new("RGBA", (size, size), color=(0, 0, 0, 0))
padding = int(abs(img.height - img.width) / 2)
position = (0, padding) if img.height < img.width else (padding, 0)
new_img.paste(img, position)
out = io.BytesIO()
new_img.save(out, format="png")
return out.getvalue()
from zerver.lib.thumbnail import DEFAULT_AVATAR_SIZE
def create_integration_bot_avatar(logo_path: str, bot_avatar_path: str) -> None:
if logo_path.endswith(".svg"):
avatar = cairosvg.svg2png(
url=logo_path, output_width=DEFAULT_AVATAR_SIZE, output_height=DEFAULT_AVATAR_SIZE
)
else:
with open(logo_path, "rb") as f:
image = f.read()
square_image = create_square_image(image)
avatar = resize_avatar(square_image)
os.makedirs(os.path.dirname(bot_avatar_path), exist_ok=True)
with open(bot_avatar_path, "wb") as f:
f.write(avatar)
avatar = pyvips.Image.thumbnail(logo_path, DEFAULT_AVATAR_SIZE, height=DEFAULT_AVATAR_SIZE)
if avatar.height != avatar.width:
avatar = avatar.gravity(
pyvips.CompassDirection.CENTRE, DEFAULT_AVATAR_SIZE, DEFAULT_AVATAR_SIZE
)
avatar.write_to_file(bot_avatar_path)
def generate_integration_bots_avatars(check_missing: bool = False) -> None: