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 网络编程起步(Socket发送消息)
Sep 06 Python
Python命令行参数解析模块optparse使用实例
Apr 13 Python
Python日志模块logging基本用法分析
Aug 23 Python
在双python下设置python3为默认的方法
Oct 31 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
Python使用线程来接收串口数据的示例
Jul 02 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
Python爬虫教程知识点总结
Oct 19 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高自定义性安全验证码代码
2011/11/27 PHP
thinkphp3.0 模板中函数的使用
2012/11/13 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
js Event对象的5种坐标
2011/09/12 Javascript
为原生js Array增加each方法
2012/04/07 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
jquery实现鼠标滑过后动态图片提示效果实例
2015/08/10 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
使用Vue组件实现一个简单弹窗效果
2018/04/23 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
vue debug 二种方法
2018/09/16 Javascript
JS中的算法与数据结构之栈(Stack)实例详解
2019/08/20 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
js实现简单的点名器随机色实例代码
2020/09/20 Javascript
vue开发chrome插件,实现获取界面数据和保存到数据库功能
2020/12/01 Vue.js
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
python中zip和unzip数据的方法
2015/05/27 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
python进程管理工具supervisor的安装与使用教程
2017/09/05 Python
Python秒算24点实现及原理详解
2019/07/29 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
2019/07/31 Python
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
浅谈keras通过model.fit_generator训练模型(节省内存)
2020/06/17 Python
《识字五》教学反思
2014/03/01 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
2014年幼儿园重阳节活动方案
2014/09/16 职场文书
党员反对四风思想汇报范文
2014/10/25 职场文书
最感人的道歉情书
2015/05/12 职场文书