Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
作者:天元浪子 发布时间:2023-08-03 10:29:49
标签: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如何将图像音视频等资源文件隐藏在代码中(小技巧),希望对大家有所帮助!
来源:https://blog.csdn.net/xufive/article/details/104332523
猜你喜欢
- 一、为什么要包管理默认Go的第三方包都是放在Gopath的src目录下,而且这些包都没有版本号的概念,这样的可能会出现一些问题。举个例子:当
- 问题有一个元素序列,想知道在序列中出现次数最多的元素是什么解决方案collections 模块中的 Counter 类转让给女士为此问题所设
- 什么是迭代器?迭代器是带有next方法的简单对象,当然也要实现__iter__函数。迭代器能在一序列的值上进行迭代,当没有可供迭代时,nex
- Python语言与Perl,C和Java等语言有许多相似之处。但是,也存在一些差异。在本章中我们将来学习Python的基础语法,让你快速学会
- 前言虽然各种编程语言之间大部分语法存在共通的地方,但是在一些细节的处理上还是千差万别才接触Python不久(之前是学Java的),实在想吐槽
- 今天也碰到了el表达式无法解析的事情,于是在网上查询了下,大多说是因为web.xml中声明的版本问题于是收集了如下版本:web-app_2_
- 一、背景:近期在利用 pycharm 安装第三方库时会提示 pip 不是最新版本, 因此对 pip 进行更新,但是生成最新版本之后, pi
- 一、前言 说实话,刚测试ES的时候,我的内心是崩溃的,好多单词都不知道
- 一下demo演示2.0中的vue-router是如何获取到不同参数的,并在地址栏中匹配不同的信息 <!DOCTYPE html>
- 前言相信大家在日常的web开发中,作为前端经常会遇到处理图片拉伸问题的情况。例如banner、图文列表、头像等所有和用户或客户自主操作图片上
- “自定义函数”是我们平常的说法,而“用户定义的函数”是 SQL Server 中书面的说法。 SQL Server 2000 允许用户创建自
- 创建变长数组类型CREATE TYPE varray_type AS VARRAY(2) OF VARCHAR2(50);这个变长数组最多可
- 获取数据(四种方式)1. url: 需要正则去匹配 url(r'^index/(num)/$
- 前言:一般处理数据使用的是pandas和numpy库,但是填充单元格颜色需要在excel中,使用的是openpyxl库,所以不能直接达到我们
- 第一步:安装SQL200,并启动SQL2000。到网上下载SQL2000,并安装完毕。( * 作系统是XP,装的是SQL个人版),按照下面所示
- 一、时间日期基本介绍时间日期类型在Python中主要有两个模块:time模块 和 datetime模块time模块: 是基于Unix Tim
- 环境准备数据库版本:MySQL 5.7.20-log建表 SQLDROP TABLE IF EXISTS `t_ware_sale_stat
- 2010新的架构工具可以让我们了解应用程序和功能设计,并帮助验证设计和执行不偏离。它除了支持一般系统分析设计流程(需求→实体)外,也支持另一
- 1.函数的声明定义//func关键字//getStudent函数名//(id int, classId int) 参数列表//(name s
- 迭代dict的key和value我们了解了如何迭代 dict 的key和value,那么,在一个 for 循环中,能否同时迭代 key和va










