当前位置: 首页 > news >正文

base64与BytesIO图片进行编码、解码;api调用

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, requestapp = 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)

相关文章:

  • rk3566 armbian修复usb2.0并挂载U盘
  • Hadoop集群环境下HDFS实践编程过滤出所有后缀名不为“.abc”的文件时运行报错:java.net.ConnectException: 拒绝连接;
  • 数据分析-Pandas如何轻松处理时间序列数据
  • 【LeetCode:228. 汇总区间 | 区间】
  • 大模型学习之书生·浦语大模型4——基于Xtuner大模型微调实战
  • 开源加解密库之GmSSL
  • jenkins忘记密码后的操作
  • 网关Gateway
  • 机器学习笔记一之入门概念
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • Python库学习(十四):ORM框架-SQLAlchemy
  • Jenkins-Pipeline语法总结大全
  • x-cmd pkg | trdsql - 能对 CSV、LTSV、JSON 和 TBLN 执行 SQL 查询的工具
  • 008-关于FPGA/ZYNQ直接处理图像传感器数据输出的若干笔记(裸板采集思路)
  • Python实现深度迁移学习-CIFAR100-ResNet50
  • #Java异常处理
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • ES6 学习笔记(一)let,const和解构赋值
  • Java IO学习笔记一
  • Map集合、散列表、红黑树介绍
  • mysql外键的使用
  • Redis学习笔记 - pipline(流水线、管道)
  • Selenium实战教程系列(二)---元素定位
  • storm drpc实例
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 测试开发系类之接口自动化测试
  • 复杂数据处理
  • 跨域
  • 网页视频流m3u8/ts视频下载
  • 用简单代码看卷积组块发展
  • #Z0458. 树的中心2
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)(2.10) LTM telemetry
  • (2)STM32单片机上位机
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (算法设计与分析)第一章算法概述-习题
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译) 函数式 JS #1:简介
  • (转)创业的注意事项
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET Core 2.1路线图
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 常见的偏门问题
  • @在php中起什么作用?
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ 云计算 | Azure 实践 ] 在 Azure 门户中创建 VM 虚拟机并进行验证
  • [1204 寻找子串位置] 解题报告