Python如何将图像音视频等资源文件隐藏在代码中(小技巧)


Posted in Python onFebruary 16, 2020

下午有同学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如何将图像音视频等资源文件隐藏在代码中(小技巧),希望对大家有所帮助!

Python 相关文章推荐
介绍Python中的文档测试模块
Apr 28 Python
Linux下python制作名片示例
Jul 20 Python
Python中几种属性访问的区别与用法详解
Oct 10 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
Jan 22 Python
Python生成MD5值的两种方法实例分析
Apr 26 Python
python matplotlib 画dataframe的时间序列图实例
Nov 20 Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
Python unittest discover批量执行代码实例
Sep 08 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
python如何做代码性能分析
Apr 26 Python
python中的 zip函数详解及用法举例
Feb 16 #Python
Python中zip()函数的解释和可视化(实例详解)
Feb 16 #Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 #Python
使用Tensorboard工具查看Loss损失率
Feb 15 #Python
Keras使用tensorboard显示训练过程的实例
Feb 15 #Python
Python利用逻辑回归分类实现模板
Feb 15 #Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 #Python
You might like
Smarty模板快速入门
2007/01/04 PHP
PHP安全性漫谈
2012/06/28 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
tp5.1 框架数据库高级查询技巧实例总结
2020/05/25 PHP
JS 用6N±1法求素数 实例教程
2009/10/20 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
JavaScript window.location对象
2014/11/14 Javascript
node.js中的fs.fsync方法使用说明
2014/12/15 Javascript
js操作滚动条事件实例
2015/01/29 Javascript
Bootstrap每天必学之模态框(Modal)插件
2016/04/26 Javascript
AngularJS表单详解及示例代码
2016/08/17 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
JavaScript两个变量交换值的实现方法
2017/03/01 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
MAC中PyCharm设置python3解释器
2017/12/15 Python
Pycharm导入Python包,模块的图文教程
2018/06/13 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
使用Python画出小人发射爱心的代码
2019/11/23 Python
Python实现随机取一个矩阵数组的某几行
2019/11/26 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
CSS3常用的几种颜色渐变模式总结
2016/11/18 HTML / CSS
学校卫生检查制度
2014/02/03 职场文书
村抢险救灾方案
2014/05/09 职场文书
公司节能减排方案
2014/05/16 职场文书
新学期红领巾广播稿
2014/10/04 职场文书
工作失误检讨书范文
2015/01/26 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
你喜欢篮球吗?Python实现篮球游戏
2021/06/11 Python