B站爆火黑人擡棺用字串怎麼看,我的快樂就這麼簡單~

2020-08-13 14:32:36

 

單純的我,總會有很多快樂

首先先看看成品:

 

在这里插入图片描述

不多說啥廢話了,直接給程式碼吧:

import cv2   #公衆號【測試員小何】
import subprocess
from moviepy.editor import *
from PIL import Image,ImageFont,ImageDraw
import os
from cv2 import VideoWriter, VideoWriter_fourcc, imread, resize
def get_char(r,g,b,alpha = 256):
    ascii_char = list("#RMNHQODBWGPZ*@$C&98?32I1>!:-;. ")
    if alpha == 0:
        return ''
    length = len(ascii_char)
    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
    unit = (256.0+1)/len(ascii_char)
    return ascii_char[int(gray/unit)] 
#公衆號【測試員小何】如果對軟體測試有興趣,想瞭解更多的
#測試知識,解決測試問題,以及入門指導,
#幫你解決測試中遇到的困惑,我們這裏有技術高手。如果你正在找工作或者剛剛學校出來,
#又或者已經工作但是經常覺得難點很多,覺得自己測試方面學的不夠精想要繼續學習的,
#想轉行怕學不會的,都可以加入我們644956177。
#羣內可領取最新軟體測試大廠面試資料和Python自動化、介面、框架搭建學習資料!

def video_to_pic(vp,video_path):
    number = 0
    if vp.isOpened():
        video = VideoFileClip(video_path)
        audio = video.audio
        audio.write_audiofile(video_path.split(".")[0]+".mp3")
        r,frame = vp.read()
        if not os.path.exists('cache_pic'):
            os.mkdir('cache_pic')
        os.chdir('cache_pic')
    else:
        r = False
    while r:
        number += 1
        cv2.imwrite(str(number)+'.jpg',frame)
        r,frame = vp.read()
    print('\n由視訊一共生成了{}張圖片!'.format(number))
    os.chdir("..")
    return number, video_path.split(".")[0]+".mp3"


def img_to_char(image_path,raw_width,raw_height,task):
    width = int(raw_width/ 6)
    height = int(raw_height / 15)
    im = Image.open(image_path).convert('RGB')#必須以RGB模式開啓
    im = im.resize((width,height),Image.NEAREST)
    txt = ''
    color = []
    for i in range(height):
        for j in range(width):
            pixel = im.getpixel((j, i))
            color.append((pixel[0],pixel[1],pixel[2])) #將顏色加入進行索引
            if len(pixel)==4 :
                txt +=get_char(pixel[0],pixel[1],pixel[2],pixel[3])
            else:
                txt +=get_char(pixel[0],pixel[1],pixel[2])
        txt += '\n'
        color.append((255,255,255))

    im_txt = Image.new("RGB",(raw_width,raw_height),(255,255,255))
    dr = ImageDraw.Draw(im_txt)
    font = ImageFont.load_default().font
    x,y = 0,0
    font_w,font_h=font.getsize(txt[1])
    font_h *= 1.37 #調整字型大小
    for i in range(len(txt)):
        if(txt[i]=='\n'):
            x += font_h
            y = -font_w
        dr.text((y,x),txt[i] ,fill = color[i])
        y+=font_w
    os.chdir('cache_char')
    im_txt.save(str(task)+'.jpg')
    os.chdir("..")
    return 0


def star_to_char(number,save_pic_path):
    if not os.path.exists('cache_char'):
        os.mkdir('cache_char')
    img_path_list = [save_pic_path + r'/{}.jpg'.format(i) for i in range(1,number+1)] #生成目標圖片檔案的路徑列表
    task = 0
    for image_path in img_path_list:
        img_width , img_height = Image.open(image_path).size   #獲取圖片的解析度
        task += 1
        img_to_char(image_path, img_width , img_height, task)
        print('{}/{} is finished.'.format(task,number))
    print('=======================')
    print('All image was finished!')
    print('=======================') #公衆號【測試員小何】
    return 0

def jpg_to_video(char_image_path,FPS):
    video_fourcc=VideoWriter_fourcc(*"MP42")  # 設定視訊編碼器,這裏使用使用MP42編碼器,可以生成更小的視訊檔
    char_img_path_list = [char_image_path + r'/{}.jpg'.format(i) for i in range(1,number+1)] #生成目標字元圖片檔案的路徑列表
    char_img_test = Image.open(char_img_path_list[1]).size   #獲取圖片的解析度
    video_writter= VideoWriter('video/new_char_video.mp4' , video_fourcc , FPS , char_img_test)
    load = 'loading'
    count = 0 #用來清空load進度條的計數
    for image_path in char_img_path_list:
        img = cv2.imread(image_path)
        video_writter.write(img)
        load = load + '.'
        count += 1
        if count % 50 == 0 :
            load = 'loading'
            print()
        print('\r',load,end='')
    video_writter.release()
    print('\n')
    print('=======================')
    print('The video is finished!')
    print('=======================')
    return 'video/new_char_video.mp4'

def video_add_mp3(file_name, mp3_file):
    outfile_name = file_name.split('.')[0] + '-finish.mp4'
    subprocess.call('ffmpeg -i ' + file_name
                    + ' -i ' + mp3_file + ' -strict -2 -f mp4 '
                    + outfile_name, shell=True)

if __name__ == '__main__':
    video_path = 'video/video.mp4'
    save_pic_path = 'cache_pic'
    save_charpic_path = 'cache_char'

    vp = cv2.VideoCapture(video_path)
    number, mp3_file = video_to_pic(vp,video_path)
    FPS = vp.get(cv2.CAP_PROP_FPS)
    star_to_char(number , save_pic_path)
    vp.release()
    file_name = jpg_to_video(save_charpic_path,FPS)
    video_add_mp3(file_name, mp3_file)
 #公衆號【測試員小何】


 

最後還是希望你們能給我點一波小小的關注。

奉上自己誠摯的愛心