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 相关文章推荐
推荐11个实用Python库
Jan 23 Python
Python中动态创建类实例的方法
Mar 24 Python
梯度下降法介绍及利用Python实现的方法示例
Jul 12 Python
Python实现GUI学生信息管理系统
Apr 05 Python
Django自定义manage命令实例代码
Feb 11 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
pyinstaller还原python代码过程图解
Jan 08 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
python批量修改xml属性的实现方式
Mar 05 Python
Python filter()及reduce()函数使用方法解析
Sep 05 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
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP执行批量mysql语句的解决方法
2013/05/02 PHP
php集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
PHP格式化MYSQL返回float类型的方法
2016/03/30 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
通过sails和阿里大于实现短信验证
2017/01/04 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
快速处理vue渲染前的显示问题
2018/03/05 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
js+springMVC 提交数组数据到后台的实例
2019/09/21 Javascript
Element-UI+Vue模式使用总结
2020/01/02 Javascript
JS实现“全选”和"全不选"功能代码实例
2020/02/06 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python sort、sort_index方法代码实例
2019/03/28 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Django RBAC权限管理设计过程详解
2019/08/06 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Python扫描端口的实现
2021/01/25 Python
网站性能延迟加载图像的五种技巧(小结)
2020/08/13 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
Myprotein丹麦官网:欧洲第一运动营养品牌
2019/04/15 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
高中军训感想800字
2014/02/23 职场文书
买房委托公证书
2014/04/08 职场文书
小学生寒假家长评语
2014/04/16 职场文书
大学社团招新的通讯稿
2014/09/10 职场文书
女生抽烟检讨书
2014/10/05 职场文书
青年文明号汇报材料
2014/12/23 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
2016学雷锋优秀志愿者事迹材料
2016/02/25 职场文书