Python如何将图像音视频等资源文件隐藏在代码中(小技巧)

 更新时间:2020年02月16日 11:23:20   作者:天元浪子  
有朋友问小编使用pyinstaller打包源码时,因为代码中使用了图像、音频、视频等资源文件,无法将程序打包成单一的可执行文件,怎么处理呢,下面小编通过代码给大家介绍Python如何将图像音视频等资源文件隐藏在代码中,感兴趣的朋友一起看看吧

下午有同学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嵌套式数据结构实例浅析

    这篇文章主要介绍了Python嵌套式数据结构,结合实例形式简单分析了Python字典与列表元素的嵌套存储相关定义与操作技巧,需要的朋友可以参考下
    2019-03-03
  • 简单实现python画圆功能

    简单实现python画圆功能

    这篇文章主要为大家详细介绍了简单实现python画圆功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 使用python+whoosh实现全文检索

    使用python+whoosh实现全文检索

    今天小编就为大家分享一篇使用python+whoosh实现全文检索,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 10个示例带你掌握python中的元组

    10个示例带你掌握python中的元组

    这篇文章主要介绍了python中的元组的相关资料,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-11-11
  • pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)

    pyinstaller 3.6版本通过pip安装失败的解决办法(推荐)

    这篇文章主要介绍了pyinstaller 3.6版本通过pip安装失败的解决办法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-01-01
  • python数据分析之聚类分析(cluster analysis)

    python数据分析之聚类分析(cluster analysis)

    聚类分析本身不是一个特定的算法,而是要解决的一般任务。它可以通过各种算法来实现,这些算法在理解群集的构成以及如何有效地找到它们方面存在显着差异。这篇文章主要介绍了python数据分析之聚类分析(cluster analysis),需要的朋友可以参考下
    2021-11-11
  • 浅谈基于Pytest框架的自动化测试开发实践

    浅谈基于Pytest框架的自动化测试开发实践

    Pytest是Python的一种易用、高效和灵活的单元测试框架,本文主要介绍了基于Pytest框架的自动化测试开发实践,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Python实现轻松识别数百个快递单号

    Python实现轻松识别数百个快递单号

    当我们要寄出很多快递时,为了及时反馈物流信息,需要尽快将快递单号提取出来。这时用手动去识别真的太麻烦,所以本文将用Python实现轻松识别数百个快递单号,需要的可以参考一下
    2022-06-06
  • Python Requests 基本使用及Requests与 urllib 区别

    Python Requests 基本使用及Requests与 urllib 区别

    在使用Python爬虫时,需要模拟发起网络请求,主要用到的库有requests库和python内置的urllib库,一般建议使用requests,它是对urllib的再次封装,今天通过本文给大家讲解Python Requests使用及urllib区别,感兴趣的朋友一起看看吧
    2022-11-11
  • Python unittest基本使用方法代码实例

    Python unittest基本使用方法代码实例

    这篇文章主要介绍了Python unittest基本使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06

最新评论