I

[Python] GIF 움짤에 프로그레스바 삽입하기!

· 2022-05-15 (일) 09:03:16 · 6735 · 12

안녕하세요? ^-^

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

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

 

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

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

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

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

 

[code]

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에 맞추어 저장합니다.

[/code]

 

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

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

 

원본)

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

 

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

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

 

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

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

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

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

 

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

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

|

댓글 12개

Python도 공부를 해야겠습니다.
@들레아빠 예 들레아빠 님 안녕하세요? ^^
허접한 스크립트인데 추천 눌러주셔서 감사드립니다!
저도 Python 공부가 쉽지 않지만 노력하고 있네요~
Python은 여러 라이브러리를 쉽게 활용할 수 있다는 점에서 장점이 있는 것 같습니다.
그럼 편안한 저녁 되세요 :)
2022-05-16 (월) 13:46:44
우와 땡기는 팁이네요. 자바스크립트로 한번 바꿔보고 싶네요.
수고하셨습니다.
2022-05-16 (월) 15:08:09
땡겨서 하나 만들어 보았네요. 단 gif-mp4 변환이 필요합니다.
myDiv style=width:100% 는 예를 들어 500px 을 주면 알아서 같이 바뀝니다.

http://www.mediaplayer.kr/main/tip/53

[code]
<div id=myDiv style=width:100%;cursor:pointer;overflow:hidden>
<video id=myVideo style=width:100%;display:block src=https://blog.kakaocdn.net/dn/cavOpG/btrCfnSBtqQ/VvhwYK7dAsViymV2lklxk1/tfile.mp4 autoplay loop muted></video>
<div id=trackBar style=position:relative;width:0%></div>
</div>

<script>
pixelWidth = 600; // 원본 가로픽셀
pixelHeight = 338; // 원본 세로픽셀
barHeight = 10; // 트랙바 세로픽셀
barColor = "#c0000080";
myDiv.style.height = myDiv.offsetWidth * pixelHeight / pixelWidth + "px";
trackBar.style.height = trackBar.style.bottom = barHeight + "px";
trackBar.style.backgroundColor = barColor;
isPlay = 1;
myDiv.onclick = function() {
myVideo[isPlay ? "pause" : "play"]();
isPlay = !isPlay;
}
setInterval(function() {
trackBar.style.width = myVideo.currentTime / myVideo.duration * 100 + "%";
}, 100);
</script>
[/code]
@비타주리 비타주리 님 안녕하세요? ^^
부족한 점이 많은 스크립트인데 추천 눌러주셔서 감사드립니다!

저는 백엔드에서 처리하는 것만 염두에 두었는데
비타주리 님께서 올려주신 스크립트를 보니
프론트엔드에서 처리하는 것이 보다 효율적일 것 같네요~ :)
덕분에 많이 배웠습니다!!

그럼 일교차가 큰데 가정에 건강이 늘 함께 하시기를 기원합니다~
항상 감사드립니다!
@비타주리 역시 대단하심.
2022-05-17 (화) 12:48:36
멋지네요 유용한 정보 감사합니다.
@브러운아이 허접한 스크립트에 댓글 남겨주셔서 감사합니다 ^^
좋은 오후 되시고 즐퇴하세요~! :)
감사합니다.
@트리플 안녕하세요?
트리플 님께서 올려주시는 위젯을 늘 감사히 사용하고 있습니다 ^^
그럼 편안한 저녁 되세요~!
https://www.investingmom.id/profile/gacoribc138/profile
https://www.muooz.com.au/profile/gacoribc138/profile
https://www.carbrookcentre.qld.edu.au/profile/gacoribc138/profile
https://www.sampasling.com.br/profile/gacoribc138/profile
https://www.scvwines.com/profile/gacoribc138/profile
https://www.azcattlegrowers.org/profile/gacoribc138/profile
https://www.aspengroveinn.com/profile/gacoribc138/profile
https://www.orderdarobertas.com/profile/gacoribc138/profile
https://www.networksofopportunity.org/profile/gacoribc138/profile
https://www.montaluce.com/profile/gacoribc138/profile
https://www.sohoboutiquesalon.com/profile/gacoribc138/profile
https://www.pmandover.com/profile/gacoribc138/profile
https://www.spgrrok.catholic.edu.au/profile/gacoribc138/profile
https://www.gybn.org/profile/gacoribc138/profile
https://www.picturepeople.org/profile/gacoribc138/profile
https://www.mammothfilmfestival.org/profile/gacoribc138/profile
https://www.impunitywatch.org/profile/gacoribc138/profile
https://www.positiveimpactrating.org/profile/gacoribc138/profile
https://www.jahh.org/profile/gacoribc138/profile
https://www.highlandshistorical.org/profile/gacoribc138/profile
https://www.joma.biz/profile/gacoribc138/profile
https://www.afpol.biz/profile/gacoribc138/profile
https://www.ciunas.biz/profile/gacoribc138/profile
https://www.greengrocerchicago.biz/profile/gacoribc138/profile
https://www.perceptin.io/profile/gacoribc138/profile
https://www.mntra.io/profile/gacoribc138/profile
https://www.detroityouthchoir.org/profile/gacoribc138/profile
https://www.incast.us/profile/gacoribc138/profile
https://www.raceofchampions.com/profile/gacoribc138/profile
https://www.infi.us/profile/gacoribc138/profile
https://www.ifi.mta.ac.il/profile/gacoribc138/profile
https://www.asherypadan.sites.tau.ac.il/profile/gacoribc138/profile
https://www.southamptonbrc.nihr.ac.uk/profile/gacoribc138/profile
https://www.sdcindia.ac.in/profile/gacoribc138/profile
https://www.yifangtea.co.uk/profile/gacoribc138/profile
https://www.rudyhadisuwarno.id/profile/gacoribc138/profile
https://www.giffordcatshelter.org/profile/gacoribc138/profile
https://www.biomilq.com/profile/gacoribc138/profile
https://www.wpcog.org/profile/gacoribc138/profile
https://www.frenchliving.co.uk/profile/gacoribc138/profile
https://www.tomtomfoundation.org/profile/gacoribc138/profile
https://www.pilateswellness.com.au/profile/gacoribc138/profile
https://www.playerspace.net/profile/gacoribc138/profile
https://www.sunnyvalechristian.school/profile/gacoribc138/profile
https://www.visualimpact-design.com/profile/gacoribc138/profile
https://www.aesthetics.school/profile/gacoribc138/profile
https://www.madamefu.com.hk/profile/gacoribc138/profile
https://www.wsrcweb.hku.hk/profile/gacoribc138/profile
https://www.coralrestoration.org/profile/gacoribc138/profile
https://www.bluemoundtexas.org/profile/gacoribc138/profile
https://www.ccbjax.org/profile/gacoribc138/profile
https://www.jerseyjos.com/profile/gacoribc138/profile
https://www.sunseteyewear.co.id/profile/gacoribc138/profile
https://www.heatrax.id/profile/gacoribc138/profile
https://www.thehenleyschoolofart.com/profile/gacoribc138/profile
https://www.drapsound.com/profile/gacoribc138/profile
https://www.neolithic-game.com/profile/gacoribc138/profile
https://www.holycrossconvent.edu.na/profile/gacoribc138/profile
https://www.stainforthtowncouncil.gov.uk/profile/gacoribc138/profile
유용하게 잘 쓰겠습니다. 감사합니다.
댓글을 작성하시려면 로그인이 필요합니다.

그누보드5 팁자료실

2,788건
+
제목 글쓴이 날짜 조회
22-05-31 조회 5,917
22-05-26 조회 6,526
22-05-25 조회 5,861
22-05-23 조회 5,786
22-05-23 조회 5,353
22-05-19 조회 5,113
22-05-15 조회 6,736
22-05-12 조회 5,250
22-05-11 조회 5,916
22-05-10 조회 6,588
22-05-09 조회 6,339
22-05-06 조회 6,098
22-05-04 조회 5,931
22-04-25 조회 5,011
22-04-22 조회 8,831
22-04-22 조회 6,436
22-04-21 조회 6,110
22-04-21 조회 4,847
22-04-18 조회 6,369
22-04-16 조회 5,352
22-04-14 조회 6,826
22-04-13 조회 4,780
22-04-12 조회 4,292
22-04-12 조회 5,277
22-04-12 조회 4,417
22-04-12 조회 4,506
22-04-12 조회 1만
22-04-12 조회 4,629
22-04-09 조회 6,827
22-04-09 조회 4,673