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计算牛顿迭代多项式实例分析
May 07 Python
MySQL中表的复制以及大型数据表的备份教程
Nov 25 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
为什么入门大数据选择Python而不是Java?
Mar 07 Python
Anaconda2 5.2.0安装使用图文教程
Sep 19 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
Django使用模板后无法找到静态资源文件问题解决
Jul 19 Python
Django框架基础模板标签与filter使用方法详解
Jul 23 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
python3列表删除大量重复元素remove()方法的问题详解
Jan 04 Python
Python中相见恨晚的技巧
Apr 13 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php中实现字符串翻转的方法
2017/02/22 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
Array对象方法参考
2006/10/03 Javascript
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
Javascript Object.extend
2010/05/18 Javascript
JavaScript定义类的几种方式总结
2014/01/06 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
2017/05/22 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
Python的randrange()方法使用教程
2015/05/15 Python
使用pycharm生成代码模板的实例
2018/05/23 Python
pytorch + visdom CNN处理自建图片数据集的方法
2018/06/04 Python
python 顺时针打印矩阵的超简洁代码
2018/11/14 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
Python Numpy库常见用法入门教程
2020/01/16 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
长青弘远的面试题
2012/06/09 面试题
家长给老师的道歉信
2014/01/13 职场文书
高三体育教学反思
2014/01/29 职场文书
土建工程师岗位职责
2014/06/10 职场文书
英语系本科生求职信
2014/07/15 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
保险公司演讲稿
2014/09/02 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
教师个人成长总结
2015/02/11 职场文书
会计工作态度自我评价
2015/03/06 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
Go语言并发编程 sync.Once
2021/10/16 Golang