下午有同学Python学习群里说,使用pyinstaller打包源码时,因为代码中使用了图像、音频、视频等资源文件,无法将程序打包成单一的可执行文件。有没有方法将这些资源文件按保存在代码中呢?我想了一下,应该是可以的。于是乎,花了一个小时,写出了下面的代码,算是抛砖引玉吧。
这段代码可以将二进制文件转存为python脚本文件,供其他脚本引用。代码最后附有使用的例子,演示用的图片可以随便照一张。除了转存二进制数据,还提供了两个方法:
- get_fp():返回二进制的IO对象(类文件对象)
- save():保存为本地文件
# -*- coding: utf-8 -*- """以python模块形式存储、使用二进制文件""" import os import base64 from io import BytesIO def bin2module(bin_file, py_file=None): """二进制文件转存为python模块 bin_file - 二进制文件名 py_file - 生成的模块文件名,默认使用二进制文件名,仅更改后缀名 """ 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__': """测试代码""" # 将图像文件转存为img_demo.py bin2module('forever.png', 'demo.py') # 导入刚刚生成的demo模块 import demo # 用pillow打开图像,验证demo模块的get_fp():返回二进制的IO对象(类文件对象) from PIL import Image im = Image.open(demo.get_fp()) im.show() # 保存为本地文件,验证demo模块的save():保存文件 demo.save('demo_save.png')
补充:下面看下Python实现将视频按间隔截取为图片(附代码)
输入:一段视频。
输出:取出的视频帧。
准备:新建一个文件夹,用来放置截出来视频帧。
代码实现:
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'])
总结
以上所述是小编给大家介绍的Python如何将图像音视频等资源文件隐藏在代码中(小技巧),希望对大家有所帮助!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
白云城资源网 Copyright www.dyhadc.com
暂无“Python如何将图像音视频等资源文件隐藏在代码中(小技巧)”评论...
更新日志
2024年11月08日
2024年11月08日
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]