def _make_transparent(img, color, tolerance=10): img.load() if img.mode == 'P': img = img.convert('RGBA') channels = img.split() mask_channels = [] for ch, c in zip(channels, color): # create bit mask for each matched color low_c, high_c = c - tolerance, c + tolerance mask_channels.append( Image.eval(ch, lambda x: 255 if low_c <= x <= high_c else 0)) # multiply channel bit masks to get a single mask alpha = reduce(ImageChops.multiply, mask_channels) # invert to get alpha channel alpha = ImageChops.invert(alpha) if len(channels) == 4: # multiply with existing alpha alpha = ImageChops.multiply(alpha, channels[-1]) img.putalpha(alpha) return img
def quantize(img, colors=256, alpha=False, defaults=None, quantizer=None): if hasattr(Image, 'FASTOCTREE') and quantizer in (None, 'fastoctree'): if not alpha: img = img.convert('RGB') img = img.quantize(colors, Image.FASTOCTREE) else: if alpha and img.mode == 'RGBA': img.load() # split might fail if image is not loaded alpha = img.split()[3] img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=colors-1) mask = Image.eval(alpha, lambda a: 255 if a <=128 else 0) img.paste(255, mask) if defaults is not None: defaults['transparency'] = 255 else: img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=colors) return img
def quantize(img, colors=256, alpha=False, defaults=None, quantizer=None): if hasattr(Image, 'FASTOCTREE') and quantizer in (None, 'fastoctree'): if not alpha: img = img.convert('RGB') img = img.quantize(colors, Image.FASTOCTREE) else: if alpha and img.mode == 'RGBA': img.load() # split might fail if image is not loaded alpha = img.split()[3] img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=colors - 1) mask = Image.eval(alpha, lambda a: 255 if a <= 128 else 0) img.paste(255, mask) if defaults is not None: defaults['transparency'] = 255 else: img = img.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=colors) return img
def _make_transparent(img, color, tolerance=10): img.load() if img.mode == 'P': img = img.convert('RGBA') channels = img.split() mask_channels = [] for ch, c in zip(channels, color): # create bit mask for each matched color low_c, high_c = c-tolerance, c+tolerance mask_channels.append(Image.eval(ch, lambda x: 255 if low_c <= x <= high_c else 0)) # multiply channel bit masks to get a single mask alpha = reduce(ImageChops.multiply, mask_channels) # invert to get alpha channel alpha = ImageChops.invert(alpha) if len(channels) == 4: # multiply with existing alpha alpha = ImageChops.multiply(alpha, channels[-1]) img.putalpha(alpha) return img