파이썬

작업28: NCL로 시각화한 자료 파이썬으로 gif 만들기1

이석사 중 2023. 5. 4. 01:06
728x90

오늘은 NCL로 그렸던 파이썬을 이용해서 하나로 묶어서 gif 파일로 만들어보겠습니다


구글 드라이브 내에 있는 png를 찾기 보다는 디렉토리를 새로 만들어서 

 

그 안에 png 파일들을 전부 넣고 일괄적으로 추출해서 사용하는 방식을 사용했습니다

 

먼저 코드입니다

cd '/content/drive/MyDrive/png'

from PIL import Image
import numpy as np

al = []
for i in np.arange(0, 48, 1):
  st = "{}".format(i) + '.png'
  al.append(st)

frames = []
for i in al:
  new_frame = Image.open(i)
  frames.append(new_frame)

frames[0].save('TS.gif', format = 'GIF',
               append_images = frames[1:],
               save_all = True,
               duration = 200,
               loop = 0)
               
from IPython.display import Image

Image(open('TS.gif', 'rb').read())

1. Change Directory

cd '/content/drive/MyDrive/png'

먼저 첫 번째 코드입니다

 

colab에서는 몇가지 리눅스 용어를 지원합니다

 

change directory (cd)나 present work directory (pwd)같은 간단한 명령어들을 지원합니다

 

구글 드라이브라는 환경에서 작업하기 때문에 리눅스와 비슷하게 사용이 가능합니다

 

먼저 cd로 NCL로 만든 결과물들을 다 모아놓은 폴더로 작업 디렉토리를 이동합니다

 

colab에 기본 작업 디렉토리는 /content입니다


2. Required Library

from PIL import Image
import numpy as np

from IPython.display import Image

필요한 라이브러리로는 이미지 파일을 파이썬에서 불러올 수 있도록 하는 PILLOW 라이브러리와

 

반복문으로 여러개를 불러오기 위해 numpy

 

마지막으로 colab 상에서 이미지를 열어서 확인하기 위한 IPython.display가 필요합니다

 

생각보다 간단하죠?


3. Create Filename

al = []
for i in np.arange(0, 48, 1):
  st = "{}".format(i) + '.png'
  al.append(st)

다음 부분은 파일 이름을 만들어서 리스트로 만들었습니다

 

원래는 glob이라는 라이브러리를 사용해서 하려고 했는데 

 

오류인지 원래 그런건지 숫자로 해놓은 파일 이름이 오름차순이나 내림차순으로 정렬이 안되더라구여

 

0, 1, 2, 3, 4, 10 ,11, 12, 13, 14 의 경우 glob으로 나열을 하면 0, 1, 10, 11, 12, 13, 14, 2, 3, 4 처럼 숫자의 크기가 아니라

 

맨 앞자리 숫자만 가지고 정렬을 해서 따로 리스트를 만들어서 사용했습니다


4. Enumerate Image

frames = []
for i in al:
  new_frame = Image.open(i)
  frames.append(new_frame)

다음 부분은 이미지를 열어서 리스트로 나열하는 부분입니다

 

pillow 라이브러리에 open을 사용해서 이미지를 하나씩 열어주고 리스트로 묶어주는 부분입니다

 

리스트로 묶어서 사용하는 이유는 다음 부분을 보시면 아실 수 있습니다

 

frames[0].save('TS.gif', format = 'GIF',
               append_images = frames[1:],
               save_all = True,
               duration = 200,
               loop = 0)

위에서 만든 frame이라는 변수는 리스트이기 때문에 index 번호로 그림을 불러올 수 있습니다

 

0번째 그림을 TS.gif라는 이름으로 저장하고 자료형은 GIF형태로 저장합니다

 

그 후에 첫번째 그림부터 마지막 그림까지 append_images를 사용해서 연결해주었습니다

 

save_all은 꼭 True로 해주시고 duration은 재생속도 입니다

 

숫자가 작을수록 빨리 재생되고 클수록 재생시간이 오래 걸립니다

 

loop는 파일이 재생되는 횟수를 말합니다

 

0으로 해두면 재생이 안되는게 아니라 zorder에서 절대 위치처럼 계속 재생을 해주는 역할을 합니다


5. Play GIF File

Image(open('TS.gif', 'rb').read())

마지막으로 재생을 해주시면 됩니다


결과

결과가 이렇게 나왔습니다

 

이렇게 만들기 위해서는 NCL로 시각화 할 때 컬러 간격을 꼭 모든 그림이 일정하게 적용되도록 해주셔야합니다

 

진짜 중요합니다

 

오늘도 이렇게 파이썬으로 재밌는걸 해봤습니다

 

다음 파이썬 포스팅도 비슷할 것 같습니다

 

다음 NCL로는 overlay를 이용해서 2가지 그림을 겹쳐서 그려보려고 합니다

 

이 그림도 역시 gif로 묶어서 보겠습니다

 

긴 글 읽어주셔서 감사합니다!!

728x90