Python自制日常办公辅助工具之:批量视频截图,子集固定尺寸截图+序列化命名
Python自制日常辦公輔助工具之:批量視頻截圖
本人大學時期有一定的代碼基礎,但畢業這么多年幾乎都快忘完了,從事的也是非技術行業。最近因為工作需要重新從零開始學習Python基礎小知識,用于輔助日常辦公。不足頗多,見笑之處還望包涵,個人博客也只是用于學習記錄。
文章目錄
- Python自制日常辦公輔助工具之:批量視頻截圖
- 解決需求
- 一、思路是什么?
- 二、代碼
- 1.引入庫
- 2.確認操作的視頻節目
- 3.定義好截圖方法def ResizeImage
- 4.for循環執行
- 5.調用方法改成所需要的尺寸
- 測試運行
- 總結
解決需求
將一批節目內的各條視頻進行批量截圖,設置固定尺寸和具體時間點,同時生成在指定路徑中對應的節目文件夾內
一、思路是什么?
for循環依次執行:1、打開視頻 2、設置截圖尺寸 3、完成截圖并存儲至對應文件夾
二、代碼
1.引入庫
視頻操作涉及的庫如下:可以從Pycharm軟件內嵌入,也可以直接下載對應版本的whl文件直接在根目錄運行安裝。個人感覺后者更方便點,只是要注意下載對應的python版本和放在正確的路徑下安裝
import cv2 import os from natsort import natsorted,ns from PIL import Image2.確認操作的視頻節目
代碼如下(示例):
path = r'E:\1' source_path = r'Y:/out/天津高清/【2022年節目】/' dirnames = [f for f in os.listdir(path) if os.path.isdir(path + '\\' + f)] print(dirnames)將要操作的節目文件夾先在E:\1內建立空的文件夾,僅用于獲取文件夾名稱數組(dirnames)
節目原始存放路徑為source_path,如下圖,節目庫內數量很多,每個節目內約有20+視頻子集,但這邊僅操作3部節目的視頻截圖作為參考。
因此E:\1內僅建三個空的文件夾:
3.定義好截圖方法def ResizeImage
代碼如下(示例):
def ResizeImage(filein, width, height):img = Image.open(filein)out = img.resize((width, height),Image.ANTIALIAS) #resize image with high-qualityout.save(filein)filein 為視頻路徑,width以及height為要截取的視頻寬高。調用Image內的resize方法進行截取。要注意reSize的方法邏輯更多的是改變圖片的尺寸大小,即截取視頻全屏畫面然后進行對應尺寸的縮小。和平常使用的微信截圖或者手機自定義截圖不太一樣,簡單來說就是截屏改尺寸。
關于精確到具體位置的視頻截圖后續可以再深入研究。
4.for循環執行
代碼如下(示例):
for dir_name in dirnames:target_path = os.path.abspath(r'E:\2' + '\\' + dir_name)if not os.path.exists(target_path):# 如果目標路徑不存在原文件夾的話就創建os.makedirs(target_path)filepath = source_path+dir_namepathDir = os.listdir(filepath)pathDir1 = natsorted(pathDir,alg=ns.PATH)print(pathDir1)i=0for allDir in pathDir1:i+=1try:vc = cv2.VideoCapture(filepath+'/'+ allDir) # 讀取視頻vc.set(cv2.CAP_PROP_POS_MSEC, 25000) # 設置讀取位置,1000毫秒rval, frame = vc.read() # 讀取當前幀,rval用于判斷讀取是否成功if rval:cv2.imencode('.jpg', frame)[1].tofile(target_path+ '\\'+str(i)+'.jpg') # 將當前幀作為圖片保存到 cover_pathelse:print("讀取失敗")except Exception as e:print(f"獲取視頻封面圖失敗: {e}")第一段for循環是按節目運行,i計數用于命名。
同時定義截圖存儲的目標路徑,并在目標路徑創建對應的節目名文件夾。
filepath為節目內單條視頻的路徑名,通過natsorted()方法將pathDir子集數組進行排序。
第二段就是開始循環嵌套了,按單個節目內各個子集運行截圖操作。
try except 設置拋出異常,防止連續中斷影響效率
用cv包內的VideoCapture方法讀取視頻,設置視頻時長位置,25000毫秒及視頻第25秒處,讀取當前幀。
imencode方法將幀保存到指定路徑中,由于i計數的存在,第一集就會被命名1.jpg
5.調用方法改成所需要的尺寸
代碼如下(示例):
filein = target_path + '\\' + str(i) + '.jpg'#fileout = target_path + '\\' + allDir + '.png'width = 408height = 230#type = 'png'ResizeImage(filein, width, height)這邊設置寬408,高230。執行ResizeImage()方法。
要注意的是調用方法因放在嵌套的循環內,否則就容易報錯了。
測試運行
效果如下:
E:\2成功創建拷貝的文件夾
三個文件夾內全部子集的截圖已生成,并將子集以序列命名。
查看圖片屬性,為設置好的480*230
總結
測試運行僅是三個節目文件,日常工作可能就會遇到成百上千的截圖需求,當然一些軟件也可以做到批量圖片截圖。
但使用python基礎方法進行解決還可以加入自己想要的一些要求,例如固定命名為1.2.3.4…的序列化命名。
后期會嘗試將完成的子集截圖加上文字描述。
總結
以上是生活随笔為你收集整理的Python自制日常办公辅助工具之:批量视频截图,子集固定尺寸截图+序列化命名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于睡眠分期中人工判读的一些个人总结
- 下一篇: iShot——Mac上功能最全的截图、录