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

作者:天元浪子 时间:2023-08-03 10:29:49 

下午有同学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如何将图像音视频等资源文件隐藏在代码中(小技巧),希望对大家有所帮助!

来源:https://blog.csdn.net/xufive/article/details/104332523

标签:python,文件,隐藏
0
投稿

猜你喜欢

  • python通过邮件服务器端口发送邮件的方法

    2021-10-18 02:34:09
  • tensorflow基于CNN实战mnist手写识别(小白必看)

    2021-01-26 22:33:42
  • python中随机函数random用法实例

    2023-02-09 22:13:10
  • Python 异常的捕获、异常的传递与主动抛出异常操作示例

    2023-04-16 08:42:49
  • Python下应用opencv 实现人脸检测功能

    2022-09-18 00:25:44
  • 网页内容呈现建议十条

    2007-11-06 13:24:00
  • python基础教程之常用运算符

    2021-09-07 00:11:47
  • python多环境切换及pyenv使用过程详解

    2021-08-09 02:00:08
  • python之import机制详解

    2022-11-29 02:47:40
  • python编写图书管理系统

    2022-04-12 11:07:21
  • laravel入门知识点整理

    2023-05-31 13:42:33
  • Go快速开发一个RESTful API服务

    2024-04-30 10:05:07
  • Python连接mysql数据库及简单增删改查操作示例代码

    2022-03-10 18:01:57
  • oracle数据库中如何处理clob字段方法介绍

    2024-01-17 05:55:41
  • Javascript 字符串模板的简单实现

    2024-05-02 17:30:37
  • 解决Vue警告Write operation failed:computed value is readonly

    2024-04-09 10:49:25
  • 使用Django实现商城验证码模块的方法

    2023-11-04 04:46:23
  • python爬虫容易学吗

    2023-08-24 09:48:26
  • IE6图片加载的一个BUG解决方法

    2023-09-16 03:20:10
  • Mysql存储过程学习笔记--建立简单的存储过程

    2024-01-23 14:41:21
  • asp之家 网络编程 m.aspxhome.com