def gen_ex_die(exercise_list): global folder W, H = (190,190) regex = (r'[^a-zA-Z0-9]+') for message in exercise_list: message = str(message) message = message.strip()[2:-3] message = textwrap.wrap(message, width = 10) image = Image.new('RGB', (W, H), color = (255, 255, 255)) draw = ImageDraw.Draw(image) fontsz = 30 fnt = ImageFont.truetype('/fonts/calibri.ttf', fontsz) padding = 5 if len(message) == 1: current_height = H/2 - fontsz / 2 elif len(message) == 2: current_height = H/2 - fontsz elif len(message) >= 3: current_height = H/2 - fontsz * 2 #TODO Need to deal with exactly three for line in message: w, h = draw.textsize(line, font = fnt) draw.text(((W - w) / 2, current_height), line, font = fnt, fill = (0, 0, 0, 1)) current_height += h + padding filename = re.sub(regex, ' ', str(message)) filename = filename.strip() image.save(f'images/{folder}/{filename}.png') ex_die_sides.append(f'images/{folder}/{filename}.png')
def gen_time_die(time_list): W, H = (190,190) regex = (r'[^a-zA-Z0-9]+') for message in time_list: message = str(message) message = message.strip()[2:-3] message = textwrap.wrap(message, width = 10) image = Image.new('RGB', (W, H), color = (255, 255, 255)) draw = ImageDraw.Draw(image) fontsz = 30 fnt = ImageFont.truetype('/fonts/calibri.ttf', fontsz) padding = 5 if len(message) == 1: current_height = H/2 - fontsz / 2 elif len(message) == 2: current_height = H/2 - fontsz #TODO This should throw an error when I have one with three for line in message: w, h = draw.textsize(line, font = fnt) draw.text(((W - w - len(message)) / 2, current_height), line, font=fnt, fill = (0, 0, 0, 1)) current_height += h + padding filename = re.sub(regex, ' ', str(message)) filename = filename.strip() image.save(f'images/timedie/{filename}.png') time_die_sides.append(f'images/timedie/{filename}.png')
def trim(im): bg = Image.new(im.mode, im.size, im.getpixel((0, 0))) diff = ImageChops.difference(im, bg) diff = ImageChops.add(diff, diff, 2.0, -100) bbox = diff.getbbox() if bbox: return im.crop(bbox)
def circularize_img(img_fn, width, im=None, do_crop=True, bw=False, resize=True, circularize=True): from PIL import Image, ImageOps, ImageDraw from kivy.app import App import numpy as np log = App.get_running_app().log #if not im: im = Image.open(img_fn).convert('RGB') log('??', im) # get center if do_crop: im = crop_square(im, width, width) if resize: im = im.resize((width, width)) if bw: thresh = 175 fn = lambda x: 255 if x > thresh else 0 im = im.convert('L').point(fn, mode='1').convert('RGB') orig_color = (255, 255, 255) replacement_color = COLOR_ICON #(255,0,0) # img = im.convert('RGB') data = np.array(im) data[(data == orig_color).all(axis=-1)] = replacement_color im = Image.fromarray(data, mode='RGB').convert('RGBA') if circularize_img: bigsize = (im.size[0] * 3, im.size[1] * 3) mask = Image.new('L', bigsize, 0) draw = ImageDraw.Draw(mask) draw.ellipse((0, 0) + bigsize, fill=255) mask = mask.resize(im.size, Image.ANTIALIAS) im.putalpha(mask) # give back bytes log('!!', im) output = ImageOps.fit(im, mask.size, centering=(0.5, 0.5)) imgByteArr = io.BytesIO() output.save(imgByteArr, format='PNG') # imgByteArr = imgByteArr.getvalue() imgByteArr.seek(0) return imgByteArr
''' Builder.load_string(kv) class FullImage(Image): def __init__(self, **kwargs): super(FullImage, self).__init__(**kwargs) self.source = "test.png" class Test(BoxLayout): def __init__(self, **kwargs): super(Test, self).__init__(**kwargs) self.add_widget(FullImage()) class TestApp(App): def build(self): return Test() if __name__ == '__main__': #Create the background image from PIL import Image, ImageDraw img = Image.new('RGBA', (100, 100)) draw = ImageDraw.Draw(img) draw.ellipse((25, 25, 75, 75), outline=(255, 0, 0)) img.save('test.png', 'PNG', transparency=0) TestApp().run()
def create_mask(self): self.mask = Image.new('L', (200,200), 0) draw = ImageDraw.Draw(self.mask) draw.ellipse((0, 0) + self.mask.size, fill=255)