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文件比较示例分享
Jan 10 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python入门教程之识别验证码
Mar 04 Python
Python模块搜索路径代码详解
Jan 29 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
python多线程实现TCP服务端
Sep 03 Python
python3.6使用SMTP协议发送邮件
May 20 Python
Python使用sys.exc_info()方法获取异常信息
Jul 23 Python
Pyside2中嵌入Matplotlib的绘图的实现
Feb 22 Python
如何使用flask将模型部署为服务
May 13 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 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设计模式之调解者模式的深入解析
2013/06/13 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
php 判断过去离现在几年的函数(实例代码)
2016/11/15 PHP
javascript Keycode对照表
2009/10/24 Javascript
仿jQuery的siblings效果的js代码
2011/08/09 Javascript
JS分页控件 可用于无刷新分页
2013/07/23 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
JAVASCRIPT代码编写俄罗斯方块网页版
2015/11/26 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
JS实现HTML表格排序功能
2016/08/05 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
JS触摸屏网页版仿app弹窗型滚动列表选择器/日期选择器
2016/10/30 Javascript
jQuery简易时光轴实现方法示例
2017/03/13 Javascript
vue组件实现可搜索下拉框扩展
2020/10/23 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
[01:36:19]Secret vs NB 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
django 将model转换为字典的方法示例
2018/10/16 Python
对python中的six.moves模块的下载函数urlretrieve详解
2018/12/19 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
python 函数中的参数类型
2020/02/11 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
加拿大便宜的隐形眼镜商店:Clearly
2016/09/15 全球购物
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
新西兰最大的天然保健及护肤品网站:HealthPost(直邮中国)
2021/02/13 全球购物
文明家庭先进事迹材
2014/01/27 职场文书
C++程序员求职信
2014/05/07 职场文书
幼儿教师年度个人总结
2015/02/05 职场文书
党支部对转正的意见
2015/06/02 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
《分一些蚊子进来》读后感3篇
2020/01/09 职场文书
Sql-Server数据库单表查询 4.3实验课
2021/04/05 SQL Server
Python实现批量自动整理文件
2022/03/16 Python