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中sets模块的用法实例
Sep 30 Python
Python中利用sorted()函数排序的简单教程
Apr 27 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 Python
python如何把嵌套列表转变成普通列表
Mar 20 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
python同步两个文件夹下的内容
Aug 29 Python
python hashlib加密实现代码
Oct 17 Python
Python API len函数操作过程解析
Mar 05 Python
opencv-python的RGB与BGR互转方式
Jun 02 Python
Python如何解除一个装饰器
Aug 07 Python
解决Pyinstaller打包软件失败的一个坑
Mar 04 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和XSL stylesheets转换XML文档
2006/10/09 PHP
解析smarty 截取字符串函数 truncate的用法介绍
2013/06/20 PHP
PHP goto语句简介和使用实例
2014/03/11 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
php实现数组纵向转横向并过滤重复值的方法分析
2017/05/29 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
javascript表单验证使用示例(javascript验证邮箱)
2014/01/07 Javascript
js导出txt示例代码
2014/01/14 Javascript
js使用eval解析json(js中使用json)
2014/01/17 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
vue 标签属性数据绑定和拼接的实现方法
2018/05/17 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
20招让你的Python飞起来!
2016/09/27 Python
python实现石头剪刀布小游戏
2021/01/20 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
python torch.utils.data.DataLoader使用方法
2020/04/02 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
解决Python 函数声明先后顺序出现的问题
2020/09/02 Python
纯CSS3发光分享按钮的实现教程
2014/09/06 HTML / CSS
html5简单示例_动力节点Java学院整理
2017/07/07 HTML / CSS
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
Linux文件系统类型
2012/02/15 面试题
中学生校园广播稿
2014/01/16 职场文书
运动会入场解说词300字
2014/01/25 职场文书
博士生求职信
2014/07/06 职场文书
2016学习雷锋精神活动倡议书
2015/04/27 职场文书
优秀家长事迹材料(2016推荐版)
2016/02/29 职场文书
Python 正则模块详情
2021/11/02 Python