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求解水仙花数的方法
May 11 Python
python实现爬虫下载美女图片
Jul 14 Python
Python实现身份证号码解析
Sep 01 Python
解析Python编程中的包结构
Oct 25 Python
使用python读取txt文件的内容,并删除重复的行数方法
Apr 18 Python
多个应用共存的Django配置方法
May 30 Python
利用python循环创建多个文件的方法
Oct 25 Python
python中强大的format函数实例详解
Dec 05 Python
深入学习python多线程与GIL
Aug 26 Python
提升python处理速度原理及方法实例
Dec 25 Python
Python 一行代码能实现丧心病狂的功能
Jan 18 Python
Python list列表删除元素的4种方法
Nov 01 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
PHP模型Model类封装数据库操作示例
2019/03/14 PHP
可输入的下拉框
2006/06/19 Javascript
基于jquery的下拉框改变动态添加和删除表格实现代码
2020/09/12 Javascript
分页栏的web标准实现
2011/11/01 Javascript
javascript学习笔记(四) Number 数字类型
2012/06/19 Javascript
jQuery()方法的第二个参数详解
2015/04/29 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
Bootstrap Search Suggest使用例子
2016/12/21 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
vue中使用router全局守卫实现页面拦截的示例
2020/10/23 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
python实现的DES加密算法和3DES加密算法实例
2015/06/03 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python 实现数据结构-堆栈和队列的操作方法
2019/07/17 Python
python实现一个函数版的名片管理系统过程解析
2019/08/27 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
项目考察欢迎辞
2014/01/17 职场文书
学校消防安全制度
2014/01/30 职场文书
付款委托书范本
2014/04/04 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
2014年就业工作总结
2014/11/26 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
2015年党总支工作总结
2015/05/25 职场文书
2015初中生物教研组工作总结
2015/07/21 职场文书
如何做好工作总结!
2019/04/10 职场文书
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP