import typing as t from PIL import Image, ImageColor, ImageOps, ImageChops, ImageFilter import numpy as np class Canvas: def __init__(self, filename=None, height=500, width=500): self.filename = filename self.height, self.width = height, width self.img = Image.new("RGBA", (self.height, self.width), (0, 0, 0, 0)) def draw(self, dots, color: t.Union[tuple, str]): if isinstance(color, str): color = ImageColor.getrgb(color) if isinstance(dots, tuple): dots = [dots] for dot in dots: if dot[0]>=self.height or dot[1]>=self.width or dot[0]<0 or dot[1]<0: continue self.img.putpixel(dot, color + (255,)) def add_white_border(self, border_size=5): if self.img.mode != "RGBA": self.img = self.img.convert("RGBA") alpha = self.img.getchannel("A") dilated_alpha = alpha.filter(ImageFilter.MaxFilter(size=5)) white_area = Image.new("RGBA", self.img.size, (255, 255, 255, 255)) white_area.putalpha(dilated_alpha) result = Image.alpha_composite(white_area, self.img) return result def __enter__(self): return self def __exit__(self, type, value, traceback): self.img.save(self.filename) pass