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中集合类型(set)学习小结
Jan 28 Python
Android分包MultiDex策略详解
Oct 30 Python
详解Django中类视图使用装饰器的方式
Aug 12 Python
解决pycharm的Python console不能调试当前程序的问题
Jan 20 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
python设置随机种子实例讲解
Sep 12 Python
用python的turtle模块实现给女票画个小心心
Nov 23 Python
python实现字典嵌套列表取值
Dec 16 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
python 获取谷歌浏览器保存的密码
Jan 06 Python
python数字图像处理之图像的批量处理
Jun 28 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从数组中随机抽取一些元素的代码
2012/11/05 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php防止网站被攻击的应急代码
2015/10/21 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
PHP 计算两个特别大的整数实例代码
2018/05/07 PHP
PHP数组与字符串互相转换实例
2020/05/05 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
浅谈js中的闭包
2015/03/16 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
详解小程序输入框闪烁及重影BUG解决方案
2018/08/31 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
python函数局部变量用法实例分析
2015/08/04 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
Python基于WordCloud制作词云图
2019/11/29 Python
基于python图书馆管理系统设计实例详解
2020/08/05 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
For Art’s Sake官网:手工制作的奢华眼镜
2018/12/15 全球购物
房地产销售大学生自我评价分享
2013/11/11 职场文书
企业安全生产责任书
2014/04/14 职场文书
校庆标语集锦
2014/06/25 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
学雷锋团日活动总结
2015/05/06 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
治庸问责工作总结
2015/08/11 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
你需要掌握的20个Python常用技巧
2022/02/28 Python