안녕하세요? ^-^

XE타운에서 늘 배워가기만 하다가 허접한 팁 하나 올려드려요~

Python을 활용하여 백엔드에서 GIF 파일 하단에 프로그레스바를 삽입하는 스크립트를 작성했어요 :)

움짤 위주의 사이트를 운영하시는 경우에 유용하실 것 같아요!!

 

구글링해보시면 기존의 소스들은 FPS가 안 맞아서 재생이 느려지거나,

일부 GIF 파일을 제대로 읽지 못하는 문제가 있더군요 ㅠㅠ

ex) https://github.com/cernyjan/gifTimelined

최대한 간결한 소스로 이런 문제를 모두 해결했어요~! ^^

 

import numpy, math, imageio
from PIL import Image
from moviepy.editor import VideoFileClip
 
def ImageProcessing(filename):
    im = Image.open(filename)
    new_frames = []
    try:
        while True:
            new_im = Image.new('RGBA', im.size)
            new_im.paste(im)
            new_frames.append(new_im)
            im.seek(im.tell() + 1)
    except EOFError: # 마지막 프레임까지 진행합니다.
        pass
    return new_frames, im.size, len(new_frames)
 
gif_file = '파일명을 입력하세요'
fps = round(VideoFileClip(gif_file).subclip(0, 1).fps) # 파일의 FPS를 구합니다.
frames, image_size, frame_count = ImageProcessing(gif_file)
 
bar_size = math.ceil(image_size[0] / frame_count)
bar_thickness = 5 # 프로그레스바의 두께를 조절할 수 있습니다.
x_position, y_position = 0, image_size[1] - bar_thickness
result_frames = []
for cnt, im in enumerate(frames):
    progress_bar_frame = Image.new('RGBA', (bar_size + (bar_size * cnt), bar_thickness), (0, 0, 255, 0))
    im.paste(progress_bar_frame, (x_position, y_position)) # 프로그레스바를 paste 합니다.
    result_frames.append(numpy.array(im))
 
new_filename = 'progressBar_' + gif_file
imageio.mimwrite(new_filename, result_frames, fps = fps) # 기존 파일의 FPS에 맞추어 저장합니다.

 

보시다시피 프로그레스바의 두께를 원하는 두께로 조절할 수 있도록 작성했어요 :)

GIF 원본파일과 위 소스를 활용한 결과물은 다음과 같습니다!

 

원본)

 

프로그레스바가 추가된 결과물)

 

처음 브라우저에서 로딩될 때에는 원본과 결과물의 진행속도가 다르게 보일 수 있지만

두 짤이 한 화면에 나오도록 적절히 스크롤 한 후 F5를 눌러 refresh 하시면

속도가 동일하다는 것을 확인할 수 있습니다 ^^

원본은 GIF 진행 정도를 파악하기 어려운 반면, 결과물은 눈에 쏙 잘 들어오네요오~!

 

참고로 SIR의 비타주리 님께서 제 팁을 보시고는

프론트엔드에서 Javascript로 MP4 파일에 프로그레스바를 삽입하는 팁을 올려주셨어요 :)

https://sir.kr/g5_tip/18499

 

위 스크립트 관련하여 더 좋은 아이디어가 있으신 분께 댓글 부탁드릴게요~

그럼 남은 연휴 뜻깊게 보내시고 이번주도 화이팅이에요 ^-^

XE타운 회원님들께 항상 감사드립니다!

  • ?
    뽀~❤
  • ? profile

    오오~ 보나는 사랑입니다! ^-^
    좋은 저녁 되세요 :)

     

    b607aebb-2ace-4ea7-bd39-3dc4818a53c1.jpg

     
  • profile
    와~ 좋은 팁 감사합니다!
  • profile profile

    옙 저야말로 감사드립니다!

    허접한 팁인데 아무쪼록 유용히 사용하시면 좋겠습니다 ^^
    그럼 편안한 저녁 되세요~ :)

  • profile
    오오 정말 좋은팁이네요! 꼭 적용해봐야겠습니다~
  • profile profile
    오오~ 허접한 팁인데 좋게 말씀해주셔서 감사합니다! ^-^
    그럼 저녁식사 맛있게 드시고 편안한 저녁 되세요~