程式設計師可以沒錢,但不能不騷

痴海發表於2018-04-06

程式設計師不騷,那當什麼程式設計師

20180406
20180406

前言

程式設計師在人們的映像中是一個高智商、但同時又很呆板的一個形象。今天我就教如何大家騷起來,可以說學會今天的教程,發到朋友圈,非常的酷。今天教給大家 python3 一個程式,用來讀取一個 mp4 格式的視訊,並以終端的形式輸出出來。最後呈現的效果,真的相當的騷氣。我們可以先看下最後的輸出結果。

視訊連結

前期準備

這個程式有 3 個程式碼檔案:getIamge.py、image2txt,py、play.py,兩個存放圖片和文字的資料夾,以及一個 mp4 視訊。在執行之前首先要確定你是否已經安裝了 PIL 與 numpy 第三方庫,以及 ffmpeg 外掛。

專案檔案結構
專案檔案結構

PIL 和 numpy 可以通過 pip 來安裝。而 ffmpeg 可以去官網下載(https://www.ffmpeg.org/download.html#build-windows)。開啟官網對應你的系統,點選下面的圖示,去下載。

ffmpeg 安裝
ffmpeg 安裝

安裝好 ffmpeg,在配置下環境變數:右擊我的電腦-屬性-高階系統設定-環境變數-Path,加上「;d:\ffmpeg\bin」(你自己的安裝路徑)即可。

getImage.py

所需的第三庫和 ffmpeg 安裝好以後,就可以開始執行 python 程式碼。首先執行的是 getImage.py。getImage.py 是用於從視訊中提取幀圖片,提取的幀圖片存放於「images/」資料夾,若資料夾中已存在幀圖片可不執行該程式。若要調整每幀圖片數可調整變數 crop_time 累加的數值,清空已存在的圖片集,修改視訊路徑「videoPath」、幀圖片目錄路徑「imagePath」,再執行 getImage.py。

getImage.py 程式碼:

import os
def getImage(videoPath, imagePath):
    img_count = 1
    crop_time = 0.0
    while crop_time <= 15.0:
        os.system('ffmpeg -i %s -f image2 -ss %s -vframes 1 %s.png' % (videoPath, str(crop_time), imagePath + str(img_count)))
        img_count += 1
        print('Geting Image ' + str(img_count) + '.png' + ' from time ' + str(crop_time))
        crop_time += 0.1
    print('Image Collected')
if __name__ == '__main__':
    videoPath = 'E:/badapple/a/1.mp4'
    imagePath = 'E:/badapple/a/images/'
    getImage(videoPath, imagePath)
複製程式碼

image2txt.py

image2txt.py 用於將圖片轉化為一定尺寸的字元畫,從「images/」資料夾中提取圖片並轉化為 txt 文字存放於「txt/」資料夾。預設要求的終端尺寸為 100x50 ,若螢幕不能支援該大小,可以將引數 charWidth 修改為自定義的每行顯示字元數,調整後若執行 play.py 要求終端大小為 (charWidth)x(charWidth/2) 。引數值具體多少,沒有一個固定的值,可以自己多嘗試下。

注意:這個檔案單獨執行是沒有任何反應的,因為在這個檔案中只是定義了 getImage 函式,並沒有去呼叫。具體的呼叫是在「play.py」中。

程式碼:

from PIL import Image
import numpy 
def image2txt(inputFile, outputFile):
    im = Image.open(inputFile).convert('L')
    charWidth = 100
    im = im.resize((charWidth, charWidth // 2))
    target_width, target_height = im.size
    data = numpy.array(im)[:target_height, :target_width]
    f = open(outputFile, 'w',encoding='utf-8')
    for row in data:
        for pixel in row:
            if pixel > 127:
                f.write('1')
            else:
                f.write(' ')
        f.write('\n')
    f.close()
複製程式碼

play.py

「play.py」用於獲取 txt 文字集與依次顯示 txt 文字集,以達到在終端播放字元動畫的效果。執行之前請修改視訊目錄「videoPath」、txt 資料夾目錄「txt_dir_path」、images 資料夾目錄「img_dir_path」。然後執行 play.py。

注意:如果你是蘋果系統,那你還需要把程式碼中的「type」改成「cat」,window 的就不用改。即:

os.system('cat ' + txtPath + str(txt_count) + '.txt')
複製程式碼

寫在最後

我已經把對應的程式原始碼和視訊檔案上傳到公眾號「痴海」,你只需在後臺回覆「python程式碼」就可以獲得。如果覺得這期的教程不錯,歡迎點贊和轉發到朋友圈。最後趕緊把程式碼下載下來,執行起來,錄製一個視訊,發朋友圈吧。

程式設計師也是可以騷起來的!


相關文章