잡담

세로로 길쭉한 이미지를 비디오테이프에 녹화하기 편한 사진 스크롤 영상으로 만들어주는 프로그램

저세상 음향연구소 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')