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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/235792.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-shell简单学习

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 其他…

Qt6入门教程 4:Qt Creator常用技巧

在上一篇Qt6入门教程 3:创建Hello World项目中,通过创建一个Qt项目,对Qt Creator已经有了比较直观的认识,本文将介绍它的一些常用技巧。 Qt Creator启动后默认显示欢迎页面 创建项目已经用过了,打开项目也很简单&#…

C++力扣题目226--翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

Apache Doris 入门 10 问

基于 Apache Doris 在读写流程、副本一致性机制、 存储机制、高可用机制等方面的常见疑问点进行梳理,并以问答形式进行解答。在开始之前,我们先对本文相关的名词进行解释: FE:Frontend,即 Doris 的前端节点。主要负责接…

《堆排序》与《Top—k》

目录 ​编辑 前言: 关于《堆排序》: 第一步:建堆 第二步:排序 《Top—K问题》 关于Top—k问题: 前言: 我们在前面的blog中,对于《堆》已经有了初步的概念,那么接下来我们可以…

FineBI实战项目一(18):每小时上架商品个数分析开发

点击新建组件,创建每小时上架商品个数组件。 选择线图,拖拽cnt(总数)到纵轴,拖拽hourStr到横轴。 修改横轴和纵轴的文字。 调节连线样式。 添加组件到仪表板。

MYSQL的学习——单行函数详解

目录 1. 数值函数 1) 基本函数 2) 角度与弧度互换函数 3) 三角函数 4) 指数与对数函数 5) 进制间的转换 2. 字符串函数 3. 日期和时间函数 1) 获取日期、时间 2) 日期与时间戳的转换 3) 获取月份、星期、星期数、天数等函数 4) 日期的操作函数 5) 时间和秒钟转换的…

程序员有哪些接单的渠道?

这题我会!程序员接单的渠道那可太多了,想要接到合适的单子,筛选一个合适的平台很重要。如果你也在寻找一个合适的接单渠道,可以参考以下这些方向。 首先,程序员要对接单有一个基本的概念:接单渠道可以先粗略…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-3(2) 刚体的位形 Configuration of Rigid Body

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

SpringBoot中使用LocalDateTime踩坑记录

文章目录 前言一、为什么推荐使用java.time包的LocalDateTime而不是java.util的Date?二、使用LocalDateTime和LocalDate时遇到了哪些坑?2.1 Redis序列化报错2.1.1 问题现象2.1.2 问题分析2.1.3 解决方案 2.2 LocalDateTime和LocalDate类型的属性返回给前…

python_数据可视化_pandas_导入excel数据

目录 1.1导入库 1.2读取excel文件 1.3读取excel,指定sheet2工作表 1.4指定行索引 1.5指定列索引 1.6指定导入列 案例速览: 1.1导入库 import pandas as pd 1.2读取excel文件 pd.read_excel(文件路径) data pd.read_excel(D:/desktop/TestExcel…

Docker安装Jenkins,配置Maven和Java

前言 这是一个java的springboot项目,使用maven构建 安装准备 需要将maven和jdk安装在服务器上,Jenkins需要用到,还有创建一个jenkins的目录,安装命令如下: docker run -d -uroot -p 9095:8080 -p 50000:50000 --n…

Vue-8、Vue事件处理

1、点击事件 <!DOCTYPE html> <html lang"en" xmlns:v-model"http://www.w3.org/1999/xhtml" xmlns:v-bind"http://www.w3.org/1999/xhtml"xmlns:v-on"http://www.w3.org/1999/xhtml"> <head><meta charset&quo…

微信小程序:发送小程序订阅消息

文档&#xff1a;小程序订阅消息&#xff08;用户通过弹窗订阅&#xff09;开发指南 目录 步骤一&#xff1a;获取模板 ID步骤二&#xff1a;小程序端获取参数2.1、获取消息下发权限2.2、获取登录凭证&#xff08;code&#xff09; 步骤三&#xff1a;后端调用接口下发订阅消息…

vue知识-03

购物车案例 要实现的功能&#xff1a; 1、计算商品总价格 2、全选框和取消全选框 3、商品数量的增加和减少 <body> <div id"app"><div class"row"><div class"col-md-6 col-md-offset-3"><h1 class"text-center…

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

Kafka集群部署 (KRaft模式集群)

KRaft 模式是 Kafka 在 3.0 版本中引入的新模式。KRaft 模式使用了 Raft 共识算法来管理 Kafka 集群元数据。Raft 算法是一种分布式共识算法&#xff0c;具有高可用性、可扩展性和安全性等优势。 在 KRaft 模式下&#xff0c;Kafka 集群中的每个 Broker 都具有和 Zookeeper 类…

直流负载的基础知识

直流负载的主要特性包括电阻、电感和电容。电阻是直流负载的基本特性&#xff0c;它决定了负载消耗电能的能力。电感和电容则是直流负载的动态特性&#xff0c;它们决定了负载对电压和电流变化的响应速度。此外&#xff0c;直流负载还具有非线性特性&#xff0c;即负载的电压和…

SpringBoot外部配置文件

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…

查看Linux磁盘空间

(1)、该命令会列出当前系统所有挂载的文件系统以及它们的使用情况&#xff0c;包括总容量、已用空间、可用空间、使用百分比等信息 df -h如果查看某一个文件夹的,可以 df -h folderName (2)、计算指定目录下所有文件和子目录所占用的磁盘空间大小&#xff0c;并以人类可读的格…