base64与BytesIO简单介绍
io.BytesIO
和 Base64 编码都是用于在内存中处理二进制数据的方法,但它们的目的和使用场景有所不同。
1) io.BytesIO
io.BytesIO
是 Python io
库中的一个类,它提供了一个在内存中处理二进制数据的接口,模拟了一个文件对象。它允许你像操作文件一样操作内存中的二进制数据,这对于处理图像、音频、视频等二进制数据非常有用。BytesIO
对象可以用于读取和写入数据,并且可以轻松地将数据转换为字节字符串。
使用 BytesIO
的优点:
- 在内存中处理数据,不需要磁盘I/O。
- 可以轻松地将数据流转换为字节字符串或字节对象。
- 适用于需要在程序内部传递二进制数据的场景。
2) Base64 编码
Base64 是一种编码方案,用于将二进制数据转换为可打印的ASCII字符。这种编码通常用于在不支持二进制数据的通信环境中传输二进制数据,如电子邮件、HTTP等。Base64 编码后的字符串长度会增加约33%,因为它使用64个字符来表示6个二进制位(即3个二进制字节)。
使用 Base64 编码的优点:
- 可以在不支持二进制数据的环境中传输二进制数据。
- 编码后的字符串是可打印的ASCII字符,可以在文本环境中安全传输。
- 可以用于在Web应用中传输图像和其他二进制文件。
区别
- 用途:
BytesIO
主要用于在内存中处理二进制数据流,而Base64编码主要用于在文本环境中传输二进制数据。 - 数据表示:
BytesIO
直接处理原始的二进制数据,而Base64编码将二进制数据转换为ASCII字符。 - 数据大小:使用
BytesIO
处理的数据大小不会改变,而Base64编码后的数据大小会增加约33%。 - 传输效率:在需要传输二进制数据的场景中,Base64编码可能会增加传输的开销,因为它需要额外的编码和解码步骤。
在处理图像时,BytesIO
通常用于图像处理库(如Pillow)中,用于读取和写入图像数据。而Base64编码则常用于Web开发中,用于在HTTP请求和响应中传输图像数据。
1、base64 图片进行编码、解码
编码
import base64
# 假设您有一个图像文件,例如 'image.jpg'
with open(r"C:\Users\l****1686722996428308480-1 (1).jpg", 'rb') as image_file:
# 读取图像文件的二进制数据
image_data = image_file.read()
# 将二进制数据编码为Base64字符串
encoded_string = base64.b64encode(image_data).decode('utf-8')
print(encoded_string)
解码
import base64
from PIL import Image
from io import BytesIO
# Base64 编码的字符串
base64_string = encoded_string
# 去除头部信息并进行解码
image_data = base64.b64decode(base64_string)
# 创建 BytesIO 对象来保存解码后的数据
buffered_io = BytesIO()
buffered_io.write(image_data)
# 打开图片文件
img = Image.open(buffered_io)
# 显示图片(如果需要)
img.show()
2、BytesIO图片进行编码、解码
编码:
from PIL import Image
import io
# 读取图像文件
image_path = r"C:\Users\l****1973_status_1686722996428308480-1 (1).jpg"
with Image.open(image_path) as img:
# 将图像保存到BytesIO对象中
output = io.BytesIO()
img.save(output, format='JPEG')
output.seek(0) # 将指针移回文件开头
output
解码:
# 读取BytesIO对象中的数据
image_data = output.read()
# 将二进制数据解码回图像
decoded_img = Image.open(BytesIO(image_data))
# 显示图像
decoded_img
# 保存解码后的图像
decoded_img.save('decoded_image.jpg')
3、api调用
参考:https://blog.csdn.net/weixin_42357472/article/details/135528846?spm=1001.2014.3001.5501
flask后端接口
from flask import Flask, request
app = Flask(__name__)
@app.route('/receive-base64', methods=['POST'])
def receive_base64():
# 从POST请求中获取Base64编码的字符串
base64_string = request.form.get('data')
if base64_string:
# 这里可以添加处理Base64字符串的逻辑,例如解码或存储
print(f"Received Base64 string: {base64_string}")
# 返回确认消息
return "Base64 string received successfully."
else:
# 如果没有接收到Base64字符串,返回错误消息
return "No Base64 string received."
if __name__ == '__main__':
app.run(debug=True)
requests请求
import requests
import base64
# 假设你有一个Base64编码的字符串
base64_string = "your_base64_encoded_string_here"
# 将Base64字符串转换为字节对象
data_bytes = base64.b64decode(base64_string)
# 构建请求的payload
payload = {
'data': data_bytes
}
# 发送POST请求
response = requests.post('http://your-flask-server-address/receive-base64', files=payload)
# 打印响应内容
print(response.text)