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中使用lambda高效操作列表的教程
Apr 24 Python
利用Python如何制作好玩的GIF动图详解
Jul 11 Python
远程部署工具Fabric详解(支持Python3)
Jul 04 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
Aug 13 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
详解Django配置优化方法
Nov 18 Python
Python scrapy增量爬取实例及实现过程解析
Dec 24 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 Python
python中str内置函数用法总结
Dec 27 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 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的中问验证码
2006/11/25 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
php实现网站留言板功能
2015/11/04 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
Jquery动态改变图片IMG的src地址示例
2013/06/25 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
AngularJs ng-route路由详解及实例代码
2016/09/14 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
layui结合form,table的全选、反选v1.0示例讲解
2018/08/15 Javascript
跟老齐学Python之玩转字符串(1)
2014/09/14 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
Python实现可自定义大小的截屏功能
2018/01/20 Python
python如何爬取个性签名
2018/06/19 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
详解python with 上下文管理器
2020/09/02 Python
Python面试题集
2012/03/08 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
项目管理计划书
2014/01/09 职场文书
六查六看自查材料
2014/02/17 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
跟班学习心得体会(共6篇)
2016/01/23 职场文书
2016天猫双十一广告语
2016/01/28 职场文书
2019入党申请书格式
2019/06/25 职场文书
Python机器学习之基础概述
2021/05/19 Python
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android