python打包资源文件并调用_Python如何将图像音视频等资源文件隐藏在代码中(小技巧)...

本文介绍如何使用Python将图像、音频等资源文件转换为Python脚本,以便在打包代码时避免外部文件依赖。通过提供bin2module函数,将二进制文件转储为python模块,并提供了获取二进制IO对象和保存为本地文件的方法。此外,还展示了如何按间隔从视频中截取图片。
摘要由CSDN通过智能技术生成

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值