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函数式编程指南(二):从函数开始
Jun 24 Python
python访问mysql数据库的实现方法(2则示例)
Jan 06 Python
PyTorch CNN实战之MNIST手写数字识别示例
May 29 Python
完美解决python中ndarray 默认用科学计数法显示的问题
Jul 14 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
对python中矩阵相加函数sum()的使用详解
Jan 28 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
对Tensorflow中Device实例的生成和管理详解
Feb 04 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
使用python+pygame开发消消乐游戏附完整源码
Jun 10 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与SQL注入攻击[三]
2007/04/17 PHP
判断PHP数组是否为空的代码
2011/09/08 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
2011/02/23 Javascript
javascript删除数组元素并且数组长度减小的简单实例
2014/02/14 Javascript
Javascript实现代码折叠功能
2016/08/25 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
2017/07/12 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
Vue+mui实现图片的本地缓存示例代码
2018/05/24 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
javascript网页随机点名实现过程解析
2019/10/15 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
Python 含参构造函数实例详解
2017/05/25 Python
python机器学习案例教程——K最近邻算法的实现
2017/12/28 Python
python删除过期log文件操作实例解析
2018/01/31 Python
Python删除n行后的其他行方法
2019/01/28 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
python 将字符串中的数字相加求和的实现
2019/07/18 Python
python标准库OS模块详解
2020/03/10 Python
python如何随机生成高强度密码
2020/08/19 Python
YSL圣罗兰美妆英国官网:Yves Saint Laurent Beauty UK
2019/08/03 全球购物
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
如何写一个自定义标签
2012/12/28 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
银行批评与自我批评
2014/02/10 职场文书
交通事故协议书范文
2014/04/16 职场文书
生活小常识广播稿
2014/09/16 职场文书
公司员工离职证明书
2014/10/04 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers