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 logging模块的使用方法
Apr 17 Python
Windows下python3.7安装教程
Jul 31 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
django2笔记之路由path语法的实现
Jul 17 Python
django中SMTP发送邮件配置详解
Jul 19 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
解决reload(sys)后print失效的问题
Apr 25 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
python3的pip路径在哪
Jun 23 Python
Python Django路径配置实现过程解析
Nov 05 Python
如何用python清洗文件中的数据
Jun 18 Python
Python数组变形的几种实现方法
May 30 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封装的验证码类分享
2017/02/26 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP7修改的函数
2021/03/09 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
javascript 函数调用规则
2009/08/26 Javascript
javascript中类的定义及其方式(《javascript高级程序设计》学习笔记)
2011/07/04 Javascript
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
2012/08/22 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
多个$(document).ready()的执行顺序实例分析
2014/07/26 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
整理Javascript流程控制语句学习笔记
2015/11/29 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
Websocket协议详解及简单实例代码
2016/12/12 Javascript
清除输入框内的空格
2016/12/21 Javascript
通过命令行创建vue项目的方法
2017/07/20 Javascript
Puppet的一些技巧
2018/09/17 Javascript
vue2.0自定义指令示例代码详解
2019/04/25 Javascript
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
vue调用语音播放的方法
2019/09/27 Javascript
Python中的pprint折腾记
2015/01/21 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
python飞机大战pygame游戏背景设计详解
2019/12/17 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
2012/10/15 面试题
花卉与景观设计系大学生求职信
2013/10/01 职场文书
金融专业推荐信
2013/11/14 职场文书
仓库管理专业个人的自我评价
2013/12/30 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
用Python写一个简易版弹球游戏
2021/04/13 Python
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
vue3语法糖内的defineProps及defineEmits
2022/04/14 Vue.js