아무거나 적당히 운영되는 이상한 블로그

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

잡담

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

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