Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
下午有同学Python学习群里说,使用pyinstaller打包源码时,因为代码中使用了图像、音频、视频等资源文件,无法将程序打包成单一的可执行文件。有没有方法将这些资源文件按保存在代码中呢?我想了一下,应该是可以的。于是乎,花了一个小时,写出了下面的代码,算是抛砖引玉吧。
这段代码可以将二进制文件转存为python脚本文件,供其他脚本引用。代码最后附有使用的例子,演示用的图片可以随便照一张。除了转存二进制数据,还提供了两个方法:
- get_fp():返回二进制的IO对象(类文件对象)
- save():保存为本地文件
#-*-coding:utf-8-*-
"""以python模块形式存储、使用二进制文件"""
importos
importbase64
fromioimportBytesIO
defbin2module(bin_file,py_file=None):
"""二进制文件转存为python模块
bin_file-二进制文件名
py_file-生成的模块文件名,默认使用二进制文件名,仅更改后缀名
"""
fpath,fname=os.path.split(bin_file)
fn,ext=os.path.splitext(fname)
ifnotpy_file:
py_file=os.path.join(fpath,'%s.py'%fn)
withopen(bin_file,'rb')asfp:
content=fp.read()
content=base64.b64encode(content)
content=content.decode('utf8')
withopen(py_file,'w')asfp:
fp.write('#-*-coding:utf-8-*-\n\n')
fp.write('importbase64\n')
fp.write('fromioimportBytesIO\n\n')
fp.write('content="""%s"""\n\n'%content)
fp.write('defget_fp():\n')
fp.write('returnBytesIO(base64.b64decode(content.encode("utf8")))\n\n')
fp.write('defsave(file_name):\n')
fp.write('withopen(file_name,"wb")asfp:\n')
fp.write('fp.write(base64.b64decode(content.encode("utf8")))\n')
if__name__=='__main__':
"""测试代码"""
#将图像文件转存为img_demo.py
bin2module('forever.png','demo.py')
#导入刚刚生成的demo模块
importdemo
#用pillow打开图像,验证demo模块的get_fp():返回二进制的IO对象(类文件对象)
fromPILimportImage
im=Image.open(demo.get_fp())
im.show()
#保存为本地文件,验证demo模块的save():保存文件
demo.save('demo_save.png')
补充:下面看下Python实现将视频按间隔截取为图片(附代码)
输入:一段视频。
输出:取出的视频帧。
准备:新建一个文件夹,用来放置截出来视频帧。
代码实现:
importcv2
importargparse
importos
defparse_args():
"""
Parseinputarguments
"""
parser=argparse.ArgumentParser(description='Processpic')
parser.add_argument('--input',help='videotoprocess',dest='input',default=None,type=str)
parser.add_argument('--output',help='pictostore',dest='output',default=None,type=str)
#default为间隔多少帧截取一张图片
parser.add_argument('--skip_frame',dest='skip_frame',help='skipnumberofvideo',default=100,type=int)#此处可更改提取帧的间隔
args=parser.parse_args(['--input','','--output',''])#此处添加路径,input为输入视频的路径,output为输出存放图片的路径
returnargs
defprocess_video(i_video,o_video,num):
cap=cv2.VideoCapture(i_video)
num_frame=cap.get(cv2.CAP_PROP_FRAME_COUNT)
expand_name='.jpg'
ifnotcap.isOpened():
print("Pleasecheckthepath.")
cnt=0
count=0
while1:
ret,frame=cap.read()
cnt+=1
#how
#many
#frame
#to
#cut
ifcnt%num==0:
count+=1
cv2.imwrite(os.path.join(o_video,str(count)+expand_name),frame)
ifnotret:
break
if__name__=='__main__':
args=parse_args()
ifnotos.path.exists(args.output):
os.makedirs(args.output)
print('Calledwithargs:')
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如何将图像音视频等资源文件隐藏在代码中(小技巧),希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。