|
|
|
"""Contains the visualizer to visualize images as a GIF.""" |
|
|
|
from PIL import Image |
|
|
|
from ..image_utils import parse_image_size |
|
from ..image_utils import load_image |
|
from ..image_utils import resize_image |
|
from ..image_utils import list_images_from_dir |
|
|
|
__all__ = ['GifVisualizer'] |
|
|
|
|
|
class GifVisualizer(object): |
|
"""Defines the visualizer that visualizes an image collection as GIF.""" |
|
|
|
def __init__(self, image_size=None, duration=100, loop=0): |
|
"""Initializes the GIF visualizer. |
|
|
|
Args: |
|
image_size: Size for image visualization. (default: None) |
|
duration: Duration between two frames, in milliseconds. |
|
(default: 100) |
|
loop: How many times to loop the GIF. `0` means infinite. |
|
(default: 0) |
|
""" |
|
self.set_image_size(image_size) |
|
self.set_duration(duration) |
|
self.set_loop(loop) |
|
|
|
def set_image_size(self, image_size=None): |
|
"""Sets the image size of the GIF.""" |
|
height, width = parse_image_size(image_size) |
|
self.image_height = height |
|
self.image_width = width |
|
|
|
def set_duration(self, duration=100): |
|
"""Sets the GIF duration.""" |
|
self.duration = duration |
|
|
|
def set_loop(self, loop=0): |
|
"""Sets how many times the GIF will be looped. `0` means infinite.""" |
|
self.loop = loop |
|
|
|
def visualize_collection(self, images, save_path): |
|
"""Visualizes a collection of images one by one.""" |
|
height, width = images[0].shape[0:2] |
|
height = self.image_height or height |
|
width = self.image_width or width |
|
pil_images = [] |
|
for image in images: |
|
if image.shape[0:2] != (height, width): |
|
image = resize_image(image, (width, height)) |
|
pil_images.append(Image.fromarray(image)) |
|
pil_images[0].save(save_path, format='GIF', save_all=True, |
|
append_images=pil_images[1:], |
|
duration=self.duration, |
|
loop=self.loop) |
|
|
|
def visualize_list(self, image_list, save_path): |
|
"""Visualizes a list of image files.""" |
|
height, width = load_image(image_list[0]).shape[0:2] |
|
height = self.image_height or height |
|
width = self.image_width or width |
|
pil_images = [] |
|
for filename in image_list: |
|
image = load_image(filename) |
|
if image.shape[0:2] != (height, width): |
|
image = resize_image(image, (width, height)) |
|
pil_images.append(Image.fromarray(image)) |
|
pil_images[0].save(save_path, format='GIF', save_all=True, |
|
append_images=pil_images[1:], |
|
duration=self.duration, |
|
loop=self.loop) |
|
|
|
def visualize_directory(self, directory, save_path): |
|
"""Visualizes all images under a directory.""" |
|
image_list = list_images_from_dir(directory) |
|
self.visualize_list(image_list, save_path) |
|
|