• 목록
  • 아래로
  • 위로

안녕하세요? ^-^

 

GIF 파일 하단에 프로그레스바를 삽입하는 소스를 작성해봤어요~

 

백엔드로 Django나 Flask를 사용하여 움짤 위주의 사이트를 운영하는 경우에 유용하게 활용할 수 있을 것 같네요 :)

 

 

구글링해보시면 기존의 소스들은 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 원본파일과 위 소스를 활용한 결과물은 다음과 같습니다!

 

원본)

2022-03-13 838mb 200628 페이스캠 보나gif - 200628보나8.gif

 

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

progressBar_2022-03-13 838mb 200628 페이스캠 보나gif - 200628보나8.gif

 

 

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

 

소스 관련하여 더 좋은 아이디어가 있으신 분은 댓글 부탁드릴게요 :)

 

그럼 좋은 주말 되세요~ ^-^

 

 

+)

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

두 짤이 한 화면에 나오게 적절히 스크롤 한 후 F5를 누르면 속도가 동일하다는 것을 확인할 수 있습니다!!

 

++)

외국인들도 검색할 수 있도록 허접하게나마 영어 제목을 달아놓았어요~!

랩퍼투혼님 랩퍼투혼 포함 2명이 추천

추천인 2

작성자
이니스프리 119 Lv. (0%) 1875900/115200000EXP

당분간 일신상의 사정으로 쪽지나 댓글로 답변을 드리기 어렵습니다. 죄송합니다.

 

CSVpuymXAAAVVpd.jpg

댓글 0

권한이 없습니다.
번호 제목 글쓴이 날짜 조회 수
29 [Python] 그누보드 자동 글 작성 + 멀티 파일 업로드 스크립트 1 image 이니스프리 이니스프리 21.05.16.09:32 23690
[Python] GIF 파일에 프로그레스바 삽입하기! (Adding progress bar into GIF) image 이니스프리 이니스프리 22.05.14.13:14 12581
27 [BeautifulSoup] 자식태그를 제거하기 - .decompose() & .extract() 10 image 이니스프리 이니스프리 20.01.16.00:07 9248
26 [Pillow] 파이썬 Pillow 라이브러리를 이용하여 이미지의 배경을 transparent하게 만들기 11 image 이니스프리 이니스프리 19.08.04.13:40 7799
25 [Requests] Selenium을 이용한 Cloudflare의 우회 8 image 이니스프리 이니스프리 20.01.08.19:51 6245
24 [번외편] 네이버 동영상에서 자막을 파일로 추출하는 방법 2 image 이니스프리 이니스프리 19.12.25.22:34 5598
23 22. [OpenPyXL] 엑셀 문서 저장하기 / 시트 추가하기 / 셀에 입력하기 14 image 이니스프리 이니스프리 20.02.02.00:46 5577
22 [Selenium] Requests의 session을 Selenium으로 보내기 image 이니스프리 이니스프리 19.12.07.14:17 4666
21 [Selenium] Selenium에서 send_keys를 막아놓은 경우 해결책 이니스프리 이니스프리 19.07.04.05:52 4342
20 [번외편 - 구글뉴스] 리뉴얼된 구글뉴스에서 RSS 피드를 생성하는 방법 6 image 이니스프리 이니스프리 18.10.07.17:58 3532
19 [번외편 - 유튜브] Youtube API를 이용하거나 또는 이용하지 않고 채널ID를 추출하는 방법 2 image 이니스프리 이니스프리 19.07.16.17:55 2745
18 [번외편 - 아미나] 그누보드/아미나에서 게시글의 날짜를 최종수정일로 변경하고, 목록스킨 및 위젯을 최종수정일 순으로 정렬하기 2 image 이니스프리 이니스프리 18.11.11.22:36 2572
17 1. 반복문 (1) - while 문 7 image 이니스프리 이니스프리 19.12.06.20:50 2501
16 [디지털포렌식전문가] 제21회 필기시험 합격 후기 9 image 이니스프리 이니스프리 23.10.29.16:11 2475
15 6. 리스트와 관련된 기본함수 및 메서드 7 image 이니스프리 이니스프리 19.12.10.21:16 2090
14 [python-telegram-bot] 4096자 글자수 제한을 우회하는 방법 image 이니스프리 이니스프리 20.01.12.11:25 2049
13 [Selenium] proxy를 사용하지 않고 개발자도구에서 Network 탭의 로그를 얻기 image 이니스프리 이니스프리 21.03.06.23:35 1555
12 [Requests-HTML] Requests와 비교할 때의 장점! (네이버 뉴스 등 크롤링) 7 image 이니스프리 이니스프리 20.05.14.19:08 1420
11 [번외편 - 법률] 현행 저작권법 제30조(사적이용을 위한 복제)에 대하여 - 음원 다운로더의 처벌과 관련하여 6 이니스프리 이니스프리 18.12.07.14:16 1313
10 21. [OpenPyXL] 엑셀 문서를 열고 시트에서 셀의 값을 얻기 3 image 이니스프리 이니스프리 20.02.01.23:46 1269