Python如何將圖像音視頻等資源文件隱藏在代碼中(小技巧)
下午有同學(xué)Python學(xué)習(xí)群里說,使用pyinstaller打包源碼時,因為代碼中使用了圖像、音頻、視頻等資源文件,無法將程序打包成單一的可執(zhí)行文件。有沒有方法將這些資源文件按保存在代碼中呢?我想了一下,應(yīng)該是可以的。于是乎,花了一個小時,寫出了下面的代碼,算是拋磚引玉吧。
這段代碼可以將二進(jìn)制文件轉(zhuǎn)存為python腳本文件,供其他腳本引用。代碼最后附有使用的例子,演示用的圖片可以隨便照一張。除了轉(zhuǎn)存二進(jìn)制數(shù)據(jù),還提供了兩個方法:
- get_fp():返回二進(jìn)制的IO對象(類文件對象)
- save():保存為本地文件
# -*- coding: utf-8 -*-
"""以python模塊形式存儲、使用二進(jìn)制文件"""
import os
import base64
from io import BytesIO
def bin2module(bin_file, py_file=None):
"""二進(jìn)制文件轉(zhuǎn)存為python模塊
bin_file - 二進(jìn)制文件名
py_file - 生成的模塊文件名,默認(rèn)使用二進(jìn)制文件名,僅更改后綴名
"""
fpath, fname = os.path.split(bin_file)
fn, ext = os.path.splitext(fname)
if not py_file:
py_file = os.path.join(fpath, '%s.py'%fn)
with open(bin_file, 'rb') as fp:
content = fp.read()
content = base64.b64encode(content)
content = content.decode('utf8')
with open(py_file, 'w') as fp:
fp.write('# -*- coding: utf-8 -*-\n\n')
fp.write('import base64\n')
fp.write('from io import BytesIO\n\n')
fp.write('content = """%s"""\n\n'%content)
fp.write('def get_fp():\n')
fp.write(' return BytesIO(base64.b64decode(content.encode("utf8")))\n\n')
fp.write('def save(file_name):\n')
fp.write(' with open(file_name, "wb") as fp:\n')
fp.write(' fp.write(base64.b64decode(content.encode("utf8")))\n')
if __name__ == '__main__':
"""測試代碼"""
# 將圖像文件轉(zhuǎn)存為img_demo.py
bin2module('forever.png', 'demo.py')
# 導(dǎo)入剛剛生成的demo模塊
import demo
# 用pillow打開圖像,驗證demo模塊的get_fp():返回二進(jìn)制的IO對象(類文件對象)
from PIL import Image
im = Image.open(demo.get_fp())
im.show()
# 保存為本地文件,驗證demo模塊的save():保存文件
demo.save('demo_save.png')
補充:下面看下Python實現(xiàn)將視頻按間隔截取為圖片(附代碼)
輸入:一段視頻。
輸出:取出的視頻幀。
準(zhǔn)備:新建一個文件夾,用來放置截出來視頻幀。
代碼實現(xiàn):
import cv2
import argparse
import os
def parse_args():
"""
Parse input arguments
"""
parser = argparse.ArgumentParser(description='Process pic')
parser.add_argument('--input', help='video to process', dest='input', default=None, type=str)
parser.add_argument('--output', help='pic to store', dest='output', default=None, type=str)
#default為間隔多少幀截取一張圖片
parser.add_argument('--skip_frame', dest='skip_frame', help='skip number of video', default=100, type=int) #此處可更改提取幀的間隔
args = parser.parse_args(['--input','','--output','']) #此處添加路徑,input為輸入視頻的路徑 ,output為輸出存放圖片的路徑
return args
def process_video(i_video, o_video, num):
cap = cv2.VideoCapture(i_video)
num_frame = cap.get(cv2.CAP_PROP_FRAME_COUNT)
expand_name = '.jpg'
if not cap.isOpened():
print("Please check the path.")
cnt = 0
count = 0
while 1:
ret, frame = cap.read()
cnt += 1
# how
# many
# frame
# to
# cut
if cnt % num == 0:
count += 1
cv2.imwrite(os.path.join(o_video, str(count) + expand_name), frame)
if not ret:
break
if __name__ == '__main__':
args = parse_args()
if not os.path.exists(args.output):
os.makedirs(args.output)
print('Called with args:')
print(args)
process_video(args.input, args.output, args.skip_frame)
運行起來非常容易,若是出錯請檢查 路徑書寫 是否正確。如下是一種絕對路徑的寫法舉例,前方加 r。
args = parser.parse_args(['--input', r'F:\data_video\IMG_4395.MOV', '--output', r'F:data_rgb_\video_to_frame'])
總結(jié)
以上所述是小編給大家介紹的Python如何將圖像音視頻等資源文件隱藏在代碼中(小技巧),希望對大家有所幫助!
相關(guān)文章
Python嵌套式數(shù)據(jù)結(jié)構(gòu)實例淺析
這篇文章主要介紹了Python嵌套式數(shù)據(jù)結(jié)構(gòu),結(jié)合實例形式簡單分析了Python字典與列表元素的嵌套存儲相關(guān)定義與操作技巧,需要的朋友可以參考下2019-03-03
pyinstaller 3.6版本通過pip安裝失敗的解決辦法(推薦)
這篇文章主要介紹了pyinstaller 3.6版本通過pip安裝失敗的解決辦法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01
python數(shù)據(jù)分析之聚類分析(cluster analysis)
聚類分析本身不是一個特定的算法,而是要解決的一般任務(wù)。它可以通過各種算法來實現(xiàn),這些算法在理解群集的構(gòu)成以及如何有效地找到它們方面存在顯著差異。這篇文章主要介紹了python數(shù)據(jù)分析之聚類分析(cluster analysis),需要的朋友可以參考下2021-11-11
Python實現(xiàn)輕松識別數(shù)百個快遞單號
當(dāng)我們要寄出很多快遞時,為了及時反饋物流信息,需要盡快將快遞單號提取出來。這時用手動去識別真的太麻煩,所以本文將用Python實現(xiàn)輕松識別數(shù)百個快遞單號,需要的可以參考一下2022-06-06
Python?Requests?基本使用及Requests與?urllib?區(qū)別
在使用Python爬蟲時,需要模擬發(fā)起網(wǎng)絡(luò)請求,主要用到的庫有requests庫和python內(nèi)置的urllib庫,一般建議使用requests,它是對urllib的再次封裝,今天通過本文給大家講解Python?Requests使用及urllib區(qū)別,感興趣的朋友一起看看吧2022-11-11

