init python: whitespace_dict = {} with renpy.open_file("images.whitespace") as fp: line = fp.readline() while line: path, area = line.strip("\r\n").split(':') whitespace_dict[path] = list(map(int, area.split(','))) line = fp.readline() def crop_whitespace(path): # Return box from whitespace_dict, or calculate and store it def _find_file_surface(obj): if isinstance(obj, str): return obj, Image(obj).load() elif isinstance(obj, im.Image): return obj.filename, obj.load() elif isinstance(obj, Transform): return _find_file_surface(obj.child) if path in whitespace_dict: box = whitespace_dict[path] else: path, surf = _find_file_surface(path) size = surf.get_size() box = tuple(surf.get_bounding_rect()) if "/clothes/" in path and size[0] != 1010: ratio = size[0] / 1010 box = tuple(v/ratio for v in box) whitespace_dict[path] = tuple(map(int, box)) return box def crop_whitespace_surface(displayable): surf = renpy.render_to_surface(displayable, width=1010, height=1200) size = surf.get_size() box = (int(i) for i in surf.get_bounding_rect()) if size[0] != 1010: ratio = size[0]/1010 box = tuple(int(v//ratio) for v in box) return box def crop_image_zoom(path, xsize, ysize, grayscale=False): x, y, w, h = crop_whitespace(path) matrix = SaturationMatrix(0)*BrightnessMatrix(-0.15) if grayscale else None sprite = Image(path) return Transform(sprite, crop=(x, y, w, h), xsize=xsize, ysize=ysize, fit="contain", matrixcolor=matrix, subpixel=True)