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 ORM框架SQLAlchemy学习笔记之安装和简单查询实例
Jun 10 Python
Python中的类与对象之描述符详解
Mar 27 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
利用python如何处理nc数据详解
May 23 Python
浅述python中深浅拷贝原理
Sep 18 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
TensorFlow绘制loss/accuracy曲线的实例
Jan 21 Python
Python 自由定制表格的实现示例
Mar 20 Python
python中sklearn的pipeline模块实例详解
May 21 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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
简单易用的计数器(数据库)
2006/10/09 PHP
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
一个JS翻页效果
2007/07/23 Javascript
JavaScript 反科里化 this [译]
2012/09/20 Javascript
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
Nodejs sublime text 3安装与配置
2014/06/19 NodeJs
灵活的理解JavaScript中的this指向
2016/02/25 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
VUE 使用中踩过的坑
2018/02/08 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
js实现div色块碰撞
2020/01/16 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
Python探索之pLSA实现代码
2017/10/25 Python
Selenium定位元素操作示例
2018/08/10 Python
python实现反转部分单向链表
2018/09/27 Python
详解js文件通过python访问数据库方法
2019/03/03 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
雷蛇美国官网:Razer
2020/04/03 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
旅游管理毕业生自荐信
2013/11/05 职场文书
实习生单位鉴定意见
2013/12/04 职场文书
语文教学感言
2014/02/06 职场文书
大学生求职信范文
2014/05/24 职场文书
大学生心理活动总结
2014/07/04 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书
gojs实现蚂蚁线动画效果
2022/02/18 Javascript