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实现
Aug 24 Python
理解Python中的绝对路径和相对路径
Aug 30 Python
python中的set实现不重复的排序原理
Jan 24 Python
解决python3 pika之连接断开的问题
Dec 18 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
python读写csv文件实例代码
Jul 05 Python
Python简易版图书管理系统
Aug 12 Python
python利用pytesseract 实现本地识别图片文字
Dec 14 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
Python快速优雅的批量修改Word文档样式
May 20 Python
如何使用pdb进行Python调试
Jun 30 Python
Python turtle编写简单的球类小游戏
Mar 31 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的加密方式及原理
2012/06/14 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
Javascript操纵Cookie实现购物车程序
2006/11/23 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
javascript模拟实现ajax加载框实例
2014/10/15 Javascript
js面向对象之静态方法和静态属性实例分析
2015/01/10 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
jQuery UI结合Ajax创建可定制的Web界面
2016/06/22 Javascript
Bootstrap超大屏幕的实现代码
2017/03/22 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
在Vue中使用HOC模式的实现
2020/08/23 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
在Python中marshal对象序列化的相关知识
2015/07/01 Python
解决Python 遍历字典时删除元素报异常的问题
2016/09/11 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
Django框架模板用法入门教程
2019/11/04 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Python基于Socket实现简易多人聊天室的示例代码
2020/11/29 Python
CSS3贝塞尔曲线示例:创建链接悬停动画效果
2020/11/19 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
街头时尚在线:JESSICABUURMAN
2019/06/16 全球购物
求职简历的自我评价怎样写好
2013/10/07 职场文书
会计师职业生涯规划范文
2014/02/18 职场文书
乡镇总工会学雷锋活动总结
2014/03/01 职场文书
数学高效课堂实施方案
2014/03/29 职场文书
企业演讲稿范文大全
2014/05/20 职场文书
校庆标语集锦
2014/06/25 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
div与span之间的区别与使用介绍
2021/12/06 HTML / CSS
nginx sticky实现基于cookie负载均衡示例详解
2022/12/24 Servers