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函数返回多个值的示例方法
Dec 04 Python
python海龟绘图实例教程
Jul 24 Python
Python入门之modf()方法的使用
May 15 Python
Python实现以时间换空间的缓存替换算法
Feb 19 Python
Python文件操作基本流程代码实例
Dec 11 Python
关于Python正则表达式 findall函数问题详解
Mar 22 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
Python requests接口测试实现代码
Sep 08 Python
Python 实现集合Set的示例
Dec 21 Python
解决python的空格和tab混淆而报错的问题
Feb 26 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 和 MySQL 基础教程(一)
2006/10/09 PHP
redis 队列操作的例子(php)
2012/04/12 PHP
php 读取文件头判断文件类型的实现代码
2013/08/05 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
2015/10/22 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
JavaScript 注册事件代码
2011/01/27 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jQuery EasyUI 布局之动态添加tabs标签页
2015/11/18 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
实例详解JSON取值(key是中文或者数字)方式
2017/08/24 Javascript
使用JQ完成表格隔行换色的简单实例
2017/08/25 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
微信小程序http连接访问解决方案的示例
2018/11/05 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
原生JS运动实现轮播图
2021/01/02 Javascript
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
python+opencv识别图片中的圆形
2020/03/25 Python
Python简单定义与使用二叉树示例
2018/05/11 Python
Selenium定位元素操作示例
2018/08/10 Python
Python面向对象之继承和多态用法分析
2019/06/08 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Topman美国官网:英国著名的国际平价时尚男装品牌
2017/12/22 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
儿子婚宴答谢词
2014/01/09 职场文书
房地产项目建议书
2014/03/12 职场文书
平安家庭事迹材料
2014/12/20 职场文书
总经理助理岗位职责
2015/01/31 职场文书
校长一岗双责责任书
2015/05/09 职场文书
教师节班会开场白
2015/06/01 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python