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实现全局变量的两个解决方法
Jul 03 Python
Python写入数据到MP3文件中的方法
Jul 10 Python
神经网络理论基础及Python实现详解
Dec 15 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
Jun 04 Python
利用pyuic5将ui文件转换为py文件的方法
Jun 19 Python
Python脚本利用adb进行手机控制的方法
Jul 08 Python
Django中的FBV和CBV用法详解
Sep 15 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
Python进程间通信multiprocess代码实例
Mar 18 Python
通过自学python能找到工作吗
Jun 21 Python
python 简单的调用有道翻译
Nov 25 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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
php根据操作系统转换文件名大小写的方法
2014/02/24 PHP
php parse_str() 函数的定义和用法
2016/05/23 PHP
PHP自定义错误用法示例
2016/09/28 PHP
Yii2.0中使用js异步删除示例
2017/03/10 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
window.ActiveXObject使用说明
2010/11/08 Javascript
jquery 简短几句代码实现给元素动态添加及获取提示信息
2011/09/01 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
判断js数据类型的函数实例详解
2019/05/23 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
微信小程序实现签到弹窗动画
2020/09/21 Javascript
[01:14]DOTA2亚洲邀请赛 ShowOpen
2015/02/07 DOTA
python爬虫爬取淘宝商品信息
2018/02/23 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
python list的index()和find()的实现
2020/11/16 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
2020/11/26 Python
python压包的概念及实例详解
2021/02/17 Python
html5 canvas 画图教程案例分析
2012/11/23 HTML / CSS
向全球直邮输送天然健康产品:iHerb.com
2020/05/03 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
企业文化口号
2014/06/12 职场文书
暑期培训心得体会
2014/09/02 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
个人年终总结开头
2015/03/06 职场文书
盗窃案辩护词
2015/05/21 职场文书
学习雷锋主题班会
2015/08/14 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
sentinel支持的redis高可用集群配置详解
2022/04/01 Redis