基於Python實現合並多張圖片轉成mp4視頻
前言
隨著現代科技飛速發展和人們提升視覺上體驗,利用圖片生成視頻的方法,確實為工作或者提升生活體驗感做瞭很多成功案例:
1、簡單的幻燈片演示,如展示旅遊照片、產品展示等;
2、改編圖片動畫,如口紅試色、時尚大片中的效果;
3、制作日記式的視頻內容,將一段長時間內的照片串在一起,如婚禮紀實、Baby成長記錄等;
4、制作信息圖表,如將各種數據圖表整合在一起以便展示和詮釋數據。
以上隻是一些普遍運用的例子,實際上還有更廣泛的使用場景,取決於制作者的目的和創意。
下面咱們用python代碼實現多張圖片合成MP4視頻為實例,做下詳細代碼講解。
一、需要調入的模塊
1、imageio模塊
Python模塊imageio是一個用於讀取和寫入圖像及視頻數據的庫。它支持多種格式,並且可以使用NumPy數組進行操作。
以下是一些關鍵的函數:
- imageio.imread():從文件中讀取圖像數據並返回一個NumPy數組。
- imageio.imwrite():將一個NumPy數組寫入到文件。
- imageio.mimsave():將多個圖像幀組成的列表保存為動畫文件(例如GIF)。
- imageio.get_reader():獲取一個對象,該對象用於逐幀讀取給定文件中的動畫圖像。
- imageio.get_writer():獲取一個對象,該對象用於逐幀寫入動畫圖像到指定文件中。
使用這些函數,可以方便地讀取、寫入和處理各種圖像及視頻數據格式。
2、Image 模塊
PIL 是 Python 中常用的圖像處理庫,Image 模塊是其中的一個重要模塊,它提供瞭各種圖像操作和處理的函數。
以下是 Image 模塊中一些主要函數及其作用:
- open(): 打開並返回指定文件路徑的圖像對象。
- fromarray(): 將 numpy 數組或 PIL 圖像對象轉換為 PIL 圖像對象。
- new(): 創建一個新的指定大小、模式和顏色的空白圖像對象。
- save(): 將圖像保存為指定格式的文件。
- resize(): 修改圖像的大小。
- crop(): 裁剪圖像的指定區域。
- rotate(): 旋轉圖像指定角度。
- show(): 顯示圖像。
除此之外,還有很多其他常用的函數,例如調整亮度和對比度、應用濾鏡等等。這些函數可以幫助我們實現各種復雜的圖像處理任務,並且通常也會有一些參數可用於進一步調節函數的行為,具體使用時可以參考相關文檔。
二、實現合並多張圖片轉成 mp4 視頻
使用 Python 中的畫圖庫 PIL(Python Imaging Library)或者 OpenCV 讀取每一張圖片。
使用第三方庫 imageio 將多張圖片合並成一個視頻文件。
配置生成視頻文件的視頻幀數、視頻尺寸和視頻播放速度等參數。
以下是一個簡單的示例代碼:
import os import imageio from PIL import Image # 設置生成的視頻文件名和路徑 filename = 'output.mp4' filepath = os.path.join(os.getcwd(), filename) # 讀取所有 PNG 圖片 images = [] for file_name in sorted(os.listdir()): if file_name.endswith('.png'): images.append(Image.open(file_name)) # 將圖片轉換為視頻 fps = 30 # 每秒鐘30幀 with imageio.get_writer(filepath, fps=fps) as video: for image in images: frame = image.convert('RGB') video.append_data(frame)
實現原理,讀取所有需要合並的圖片文件,將它們存儲到一個列表中。然後使用 imageio 庫的 get_writer() 函數創建一個視頻寫入器對象,並設置視頻的播放速度(fps)。之後在循環過程中,讀取列表中的每一張圖片,在將其轉換為帶有 RGB 顏色模式的格式後添加到視頻幀中。最終輸出一個合並瞭所有目標圖片的視頻文件。
三、優化改進一下
將程序並行化進行處理,加快處理多張圖片的速度。註:以下方法可能並非最優方法
import os import concurrent.futures import imageio from PIL import Image # 設置生成的視頻文件名和路徑 filename = "output.mp4" filepath = os.path.join(os.getcwd(), filename) def process_image(file_name): if file_name.endswith(".png"): image = Image.open(file_name) return image.convert("RGB") with concurrent.futures.ThreadPoolExecutor() as executor: # 尋找所有 png 文件 image_files = [file for file in os.listdir() if file.endswith(".png")] # 利用線程池並行處理圖像 images = list(executor.map(process_image, image_files)) # 將圖片轉換為視頻文件 fps = 30 # 每秒鐘30幀 with imageio.get_writer(filepath, fps=fps) as video: for image in images: video.append_data(image)
這裡使用 concurrent.futures 庫中的 ThreadPoolExecutor 對象進行並行處理。首先在主線程中尋找讀取當前工作目錄下的所有需要合並的 PNG 圖片,創建任務列表。然後將任務提交給線程池中並保證能夠快速、異步地處理目標文件。在處理完所有 PNG 圖片之後,將其存儲到一個 images 中的列表中並最後轉換成視頻。
總結
以上就是今天要講的內容,本文僅僅簡單介紹瞭python代碼實現圖片轉成視頻的使用,而imageio中提供瞭大量能使我們快速便捷地處理數據的函數和方法。
註意,由於 GIL 的存在,Python 的多線程並不總能帶來真正的性能提升。如果性能是關鍵,請考慮使用更優秀的 Python 解釋器、使用類似 joblib 的庫以及使用其他語言編寫多線程實現。
到此這篇關於基於Python實現合並多張圖片轉成mp4視頻的文章就介紹到這瞭,更多相關Python合並圖片轉成視頻內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 三行Python代碼提高數據處理腳本速度
- 如何使用Python快速生成gif圖
- python對gif圖壓縮的完美解決方案
- 基於Python實現傻瓜式GIF制作工具
- Python自動化短視頻生成腳本實現熱門視頻流水線生產