o
    S6i                     @   s   d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 e	fdeeef ded	ed
efddZe
e	d fdedededed	ed
efddZe	dfdee deeef ded	eded
efddZdS )z:APNG generation module for creating animated mouth shapes.    )Path)Image)APNGPNG   )DEFAULT_FRAME_DELAYTRANSITION_FRAMESviseme_imagesoutput_pathframe_delayreturnc                 C   sL   t  }|  D ]\}}|jt||d q|jjddd |t| |S )a#  
    Create an APNG file from a set of viseme images.

    Args:
        viseme_images: Dict mapping viseme codes to image paths
        output_path: Path to save the APNG file
        frame_delay: Delay between frames in milliseconds

    Returns:
        Path to the created APNG file
    delayTparentsexist_ok)r   itemsappend_filestrparentmkdirsave)r	   r
   r   apngviseme
image_path r   Q/var/www/tkim.planitai.co.jp/blog/20251208-make-apng-tool/./src/apng_generator.pycreate_viseme_apng   s   r      
from_imageto_image
num_framesc                 C   s  t | }t |}|j|jkr||j}t }|jt| |d td|d D ]&}||d  }	t |||	}
|j	d| d }|

| |jt||d q)|jt||d |j	jddd |
t| td|d D ]}|j	d| d }|jdd qo|S )ap  
    Create a smooth transition APNG between two viseme images.

    Args:
        from_image: Starting viseme image
        to_image: Ending viseme image
        output_path: Path to save the transition APNG
        num_frames: Number of intermediate frames
        frame_delay: Delay per frame in milliseconds

    Returns:
        Path to the created APNG file
    r   r   Ztemp_frame_.pngTr   
missing_ok)r   opensizeresizer   r   r   rangeblendr   r   r   unlink)r   r    r
   r!   r   img1img2r   ialphablended	temp_pathr   r   r   create_transition_apng#   s&   


r1   Tviseme_sequenceadd_transitionsc                 C   sT  t  }t| D ]\}}||vrtd| d d}|| }|jt||d |r|t| d k r| |d  }	|	|vr<d}	||	 }
t|}t|
}|j|jkrV|	|j}t
dtd D ]+}|td  }t|||}|jd| d| d }|| |jt||d	 d q]q|jjd
d
d |t| |jdD ]}|jd
d q|S )a  
    Create an APNG animation from a sequence of visemes.

    Args:
        viseme_sequence: List of viseme codes in order
        viseme_images: Dict mapping viseme codes to image paths
        output_path: Path to save the APNG
        frame_delay: Delay between main frames
        add_transitions: Whether to add smooth transitions

    Returns:
        Path to the created APNG
    zWarning: Viseme 'z' not found, using 'rest'restr   r   Ztemp_trans__r"   r   Tr   ztemp_trans_*.pngr#   )r   	enumerateprintr   r   lenr   r%   r&   r'   r(   r   r)   r   r   r   globr*   )r2   r	   r
   r   r3   r   r-   r   r   Znext_visemeZnext_image_pathr+   r,   jr.   r/   r0   	temp_filer   r   r   create_lipsync_sequence_apng[   s8   


r<   N)__doc__pathlibr   PILr   r   r   r   configr   r   dictr   intr   r1   listboolr<   r   r   r   r   <module>   sZ    


<
