[ Python ] jpg, png 를 gif 또는 mp4로 만들기

2022. 5. 22. 12:13분석 Python/Visualization

728x90

광고 한 번씩 눌러주세요 : )

jpg를 gif로 만들려는데, 먼가 잘 안돼서 이것저것 하다가 아는 형의 코드를 참고해서 결국 성공하게 되었다.

이 글에서 포인트는 다음과 같다.

1. 각 이미지 사이즈가 다른 것이 있어서 사이즈를 맞춰주는 작업이 필요함.
2.기존에 하던 방식을 했는데,  작동하지 않아서 새로운 방법으로 gif를 만들었음.

기존 방식)  아래와 같은 방법이 작동하지 않았다.

 

GIF

import os
os.system('convert -delay 15 -loop 0  ./pngs/*.png ./UI.gif')

일단 이미지 사이즈가 다르니 이미지 사이즈를 맞춰줬다.
사진이 뭉개질까봐 가장 작은 사이즈 기준으로 맞췄다.

from PIL import Image
import cv2
result = []
for idx , path in enumerate(paths) :
    img = cv2.imread(path)
    img = cv2.resize(img , (1049, 685) , interpolation = cv2.INTER_AREA)
    result.append(img)
    name = path.split(".jpg")[0]
    cv2.imwrite(f'./pngs/{name}.png' , img)    

그다음에는 사이즈가 조정된 사진을 다시 읽어서 imageio라는 패키지를 사용하면 gif로 쉽게 만들 수가 있었다.

import matplotlib.pyplot as plt
import numpy as np
import imageio
from PIL import Image
import matplotlib.image as mpimg
path = [f"./pngs/{i}" for i in os.listdir("./pngs")]
paths = [ Image.open(i) for i in path]
imageio.mimsave('./test.gif', paths, fps=0.5)

2022.05.22 업데이트) 또 다른 방법이지만 유사한 방법

save_dir = ###
filenames = [i for i in os.listdir(save_dir) ] ## 필터링할 때 
with imageio.get_writer('./result.gif', mode='I',duration=0.2) as writer:
    for filename in filenames:
        filename = os.path.join(save_dir , filename)
        image = imageio.imread(filename)
        writer.append_data(image)

 

MP4

mp4 형식으로 만드는 방법은 다음과 같음.
(고정된 사이즈 경우 만약 다를 경우에는 위의 코드랑 잘 섞어서 사용하면 됨)

def img2mp4(paths, pathOut , fps =10 ) :
    import cv2
    frame_array = []
    for idx , path in enumerate(paths) : 
        img = cv2.imread(path)
        height, width, layers = img.shape
        size = (width,height)
        frame_array.append(img)
    out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)
    for i in range(len(frame_array)):
        # writing to a image array
        out.write(frame_array[i])
    out.release()
import os
paths = sorted(os.listdir(##path))
paths = [os.path.join(##path,path) for path in paths]
img2mp4(paths , ##output_path, fps=6)

 

 

 

 

 

728x90