잡담
세로로 길쭉한 이미지를 비디오테이프에 녹화하기 편한 사진 스크롤 영상으로 만들어주는 프로그램
저세상 음향연구소
2020. 1. 31. 04:23
이렇게 세로로 길쭉한 이미지들을
이렇게 비디오테이프에 녹화하기 편한 영상으로 만들어주는 프로그램입니다. 유튜브에서는 30프레임으로 나오지만 프로그램에서는 59.94 프레임으로 나옵니다.
나 혼자 쓰려고 만든 프로그램이라서 구조가 좀 괴랄합니다. 파이썬을 모른다면 이 프로그램을 쓰기 힘들겁니다. 따라서 배포용이 아닌 그냥 그런게 있다 정도로만 참고해주세요.
# -*- coding: utf-8 -*-
from PIL import Image, ImageOps
import math
import os
import sys
import cv2
import numpy
import subprocess
숫자넘버 = 1
width = 640
height = 480
fourcc = cv2.VideoWriter_fourcc(*'LJPG')
#fourcc = cv2.VideoWriter_fourcc(*'I420')
video = cv2.VideoWriter("innet.mkv", fourcc, 59.94,(width,height))
바이미지 = cv2.imread('data/bar.png')
for i in range(1, 901): #시작이미지
video.write(바이미지)
숫자넘버 = 숫자넘버 + 1
dirname="./in"
#try:
filenames = os.listdir(dirname)
for filename in filenames:
full_filename = os.path.join(dirname, filename)
if os.path.isdir(full_filename):
search(full_filename)
else:
ext = os.path.splitext(full_filename)[-1]
if ext == '.png' or ext == '.jpg' or ext == '.jpeg' or ext == '.PNG' or ext == '.JPG' or ext == '.JPEG':
rtx=full_filename
print(rtx)
초기파일위치 = os.getcwd()
파일경로가제거된파일명 = os.path.basename(rtx)
적당히잘린파일명 = os.path.splitext(파일경로가제거된파일명)
확장자가제거된파일명 = 적당히잘린파일명[0]
잘라질이미지= Image.open(rtx)
가로길이 = 잘라질이미지.size[0]
세로길이 = 잘라질이미지.size[1]
print(str(가로길이)+'/'+str(세로길이))
뉴가로길이 = 640
뉴세로길이 = round(세로길이*(640/가로길이))
print(str(뉴가로길이)+'/'+str(뉴세로길이))
if 가로길이 >= 640 :
잘라질이미지.thumbnail((640,뉴세로길이))
else :
커진이미지 = 잘라질이미지.resize((640,뉴세로길이),5)
잘라질이미지 = 커진이미지
print(math.ceil((뉴세로길이-478)/2))
if math.ceil((뉴세로길이-478)/2) < 0 :
한번더=ImageOps.pad(잘라질이미지, (640,480), 5, 'black')
for i in range(1, 121):
video.write(cv2.cvtColor(numpy.array(한번더), cv2.COLOR_RGB2BGR))
숫자넘버 = 숫자넘버 + 1
elif 뉴세로길이 > 550 :
반복을시작하지=range(1,math.ceil((뉴세로길이-478)/2+1)) #가운대 2개 int의 합이 480이 될것
for 반복함수 in 반복을시작하지:
윗컷팅함수=반복함수*2-2 #int의 합이 0이 될것
아랫커팅함수=반복함수*2+478 #int의 합이 480이 될것
if 아랫커팅함수 >= 뉴세로길이:
윗컷팅함수 = 뉴세로길이-480
아랫커팅함수 = 뉴세로길이
잘린이미지=잘라질이미지.crop((0, 윗컷팅함수, 640, 아랫커팅함수))
for i in range(1, 61):
video.write(cv2.cvtColor(numpy.array(잘린이미지), cv2.COLOR_BGR2RGB))
숫자넘버 = 숫자넘버 + 1
elif 윗컷팅함수 == 0:
잘린이미지=잘라질이미지.crop((0, 윗컷팅함수, 640, 아랫커팅함수))
for i in range(1, 61):
video.write(cv2.cvtColor(numpy.array(잘린이미지), cv2.COLOR_BGR2RGB))
숫자넘버 = 숫자넘버 + 1
else :
잘린이미지=잘라질이미지.crop((0, 윗컷팅함수, 640, 아랫커팅함수))
video.write(cv2.cvtColor(numpy.array(잘린이미지), cv2.COLOR_BGR2RGB))
숫자넘버 = 숫자넘버 + 1
else :
한번더=ImageOps.pad(잘라질이미지, (640,480), 5, 'black')
for i in range(1, 121):
video.write(cv2.cvtColor(numpy.array(한번더), cv2.COLOR_RGB2BGR))
숫자넘버 = 숫자넘버 + 1
for i in range(1, 301): #종료이미지
video.write(바이미지)
숫자넘버 = 숫자넘버 + 1
video.release()
subprocess.call('ffmpeg -i innet.mkv -c:v libx264 -r 59.94 -crf 19 -preset faster -profile:v high -pix_fmt yuv420p out.mkv')
os.remove('innet.mkv')