图像与二进制数据间的转换

概述

此文档主要是记录图像与二进制互相转换的方法,此文档记录于20220811

进行图片和二进制的互相转换
若想转为base64,可以看 图像与base64互转 的内容。

Python

资料:python 图片和二进制转换的三种方式_脸不大的CVer的博客-CSDN博客_python 二进制转图片

环境: python 3.8

– OpenCV图像(numpy数组)与二进制转换

import cv2
import numpy as np
import base64def imgTobyte_cv2(img, img_type="jpg"):'''将opencv 读取的图像(numpy矩阵)转为二进制格式:param img opencv 读取的BGR图像:param img_type  图片的原始后缀, 如 jpg/jpeg/png等:return 图像的base64编码字符,不带base64头的'''# 对数组的图片格式进行编码# success, encoded_image = cv2.imencode(f".{img_type}", img)encode_image = cv2.imencode(f".{img_type}", img)[1]  # 用cv2压缩/编码,转为一维数组byte_data = encode_image.tobytes()  # 转换为二进制return byte_datadef byteToImg_cv2(byte_data):'''将二进制格式图像转为opencv图像:param byte_data 传入为BGR格式下的二进制数据:reurn 传出BGR格式的numpy矩阵'''encode_image = np.asarray(bytearray(byte_data), dtype="uint8")  # 二进制转换为一维数组img_array = cv2.imdecode(encode_image, cv2.IMREAD_COLOR)  # 用cv2解码为三通道矩阵return img_arrayif __name__ == '__main__':img_type = "jpg"img_path = "../imgs/car.jpg"img_cv2 = cv2.imread(img_path)byte_cv2 = imgTobyte_cv2(img_cv2, img_type)img_cv2_new = byteToImg_cv2(byte_cv2)cv2.imshow("img_cv2", img_cv2)cv2.imshow("img_cv2_new", img_cv2_new)cv2.waitKey(0)

– PIL格式图像与二进制互转

from io import BytesIO
from PIL import Imagedef imgToByte_PIL(image, img_type="jpeg"):# 输入为PIL读取的图片,输出为base64格式byte_data = BytesIO()# 创建一个字节流管道image.save(byte_data, format=img_type)# 将图片数据存入字节流管道,format按照具体文件的格式填写byte_data = byte_data.getvalue()# 从字节流管道中获取二进制return byte_datadef byteToImg_PIL(byte_data):# 输入为base64格式字符串,输出为PIL格式图片image = Image.open(BytesIO(byte_data)) # 将二进制转为PIL格式图片return imageif __name__ == '__main__':img_type = "jpeg"  ##jpg需要使用jpeg的后缀img_path = "../imgs/car.jpg"img_pil = Image.open(img_path)byte_data_pil = imgToByte_PIL(img_pil, img_type)img_pil_new = byteToImg_PIL(byte_data_pil)img_pil.show("img")img_pil_new.show("img_new")

– 本地图片与二进制互相转换

import cv2
import numpy as npdef imgFileToByte(img_path):'''本地图片转为二进制数据:param path 本地图像路径:return 图像的base64数据, 格式为str'''with open(img_path,"rb") as f:  ##以二进制方式读取图像文件byte_data = f.read()return byte_datadef byteToImgFile(img_byte_data, save_path):'''二进制数据保存为本地图片:param img_byte_data  图像的二进制数据:param save_path 保存的图像路径'''# 将图片保存为文件with open(save_path, 'wb') as f:f.write(img_byte_data)f.close()def readByteFromTxt(txt_path):'''从txt文件读取图像的二进制数据'''with open(txt_path, 'rb') as f:  ##以二进制方式读img_type = f.read()return img_typedef saveByteToTxt(img_byte_data, txt_path):'''将图像的二进制数据写到TXT文件中'''with open(txt_path, 'wb') as f: ##以二进制方式写f.write(img_byte_data)f.close()def byteToImg_cv2(byte_data):'''将二进制格式图像转为opencv图像:param byte_data 传入为BGR格式下的二进制数据:reurn 传出BGR格式的numpy矩阵'''encode_image = np.asarray(bytearray(byte_data), dtype="uint8")  # 二进制转换为一维数组img_array = cv2.imdecode(encode_image, cv2.IMREAD_COLOR)  # 用cv2解码为三通道矩阵return img_arrayif __name__ == '__main__':img_type = "jpg"img_path = "../imgs/car.jpg"byte_data = imgFileToByte(img_path)img_new_path = "/d/byte.jpg"img_cv2_new = byteToImgFile(byte_data, img_new_path)txt_path = "/d/byte.txt"saveByteToTxt(byte_data, txt_path)byte_data_new = readByteFromTxt(txt_path)img = byteToImg_cv2(byte_data_new)cv2.imshow("img", img)cv2.waitKey(0)

C++

– cv::Mat 转二进制 + 二进制转cv::Mat

//
// Created by fwq on 2023/7/20.
//
#include <iostream>
#include <fstream>
#include "opencv2/opencv.hpp"/*** cv::Mat转二进制;二进制转cv::Mat;二进制保存为文件;读取二进制文件转cv::Mat都测试成功**  ps1:这里转为的二进制都以std::vector<uchar>存储, 其余的 std::vector<uint8_t>/std::vector<char> 等其实都是一样的*//** 将二进制图像转为cv::Mat*/
cv::Mat binaryImageToCvMat(std::vector<uchar>& binaryImage)
{// 这里根据需要选择flags, 详细的自己看// BGR图像都是cv::IMREAD_COLOR// gray图像是:cv::IMREAD_GRAYSCALEcv::Mat img = cv::imdecode(binaryImage, cv::IMREAD_COLOR);return img;
}/*** 将cv::Mat 图像转为二进制数据* @param img  cv::Mat图像* @param imgType 编码的图像格式* @return*/
std::vector<uchar> cvMatToBinaryImage(cv::Mat& img, const std::string &imgType = "jpg")
{assert(!img.empty());assert(imgType == "jpg" || imgType == "png" || imgType == "jpeg" || imgType == "bmp");std::string img_data;std::vector<uchar> vecImg;std::vector<int> vecCompression_params;vecCompression_params.push_back(cv::IMWRITE_JPEG_QUALITY);vecCompression_params.push_back(50); //值越大,编码质量越高// 若不需要设置编码方式,直接去掉vecCompression_params即可。cv::imencode("." + imgType, img, vecImg, vecCompression_params);//    cv::imwrite("/d/50-50-2r.jpg", img, vecCompression_params); //将图片vecCompression_params处理后的数据保存为图像return vecImg;
}/*** 将编码后的二进制图像数据写入文件中* @param binaryImage* @param file_name* @return*/
bool saveBinaryImageTofile(std::vector<uchar>& binaryImage, std::string file_name)
{// 将编码后的数据写入文件std::ofstream outputFile(file_name, std::ios::binary);if (!outputFile) {return false;}outputFile.write(reinterpret_cast<const char*>(binaryImage.data()), binaryImage.size());outputFile.close();return true;
}/*** 读取图像二进制数据生成的二进制文件,并转为cv::Mat* @param file_name* @return*/
cv::Mat binaryFileToCvMat(const std::string& file_name)
{std::ifstream inputFile(file_name, std::ios::binary);if (!inputFile) {return cv::Mat(); // 返回空的cv::Mat对象表示失败}// 获取文件大小inputFile.seekg(0, std::ios::end);std::streampos fileSize = inputFile.tellg();inputFile.seekg(0, std::ios::beg);// 读取文件数据到缓冲区std::vector<uint8_t> buffer(fileSize);inputFile.read(reinterpret_cast<char*>(buffer.data()), fileSize);inputFile.close();// 将二进制数据解码为cv::Mat对象cv::Mat image;image = cv::imdecode(buffer, cv::IMREAD_COLOR); // 或者使用cv::IMREAD_GRAYSCALE,取决于图像的颜色格式return image;
}int main()
{std::string img_path = "/home/fwq/Projects/MyGiteeProjects/MyCppOpenCVStudy/test_files/1.jpg";cv::Mat img = cv::imread(img_path);std::vector<uchar> binaryImage = cvMatToBinaryImage(img);cv::Mat new_img = binaryImageToCvMat(binaryImage);std::string save_file = "/home/fwq/Projects/MyGiteeProjects/MyCppOpenCVStudy/test_files/1.bin";bool ret = saveBinaryImageTofile(binaryImage,save_file);if (!ret){std::cout << "保存编码文件失败\n";return 0;}cv::Mat new_img2 = binaryFileToCvMat(save_file);if (new_img2.empty()){std::cout << "读取编码文件转cv::Mat失败\n";return 0;}cv::imshow("src_img", img);cv::imshow("new_img", new_img);cv::imshow("new_img2", new_img2);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

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

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

相关文章

统计学-R语言-7.3

文章目录 前言总体方差的检验一个总体方差的检验两个总体方差比的检验 非参数检验总体分布的检验正态性检验的图示法Shapiro-Wilk和K-S正态性检验总体位置参数的检验 练习 前言 本篇文章继续对总体方差的检验进行介绍。 总体方差的检验 一个总体方差的检验 在生产和生活的许多…

1 月 26日算法练习

文章目录 九宫幻方穿越雷区走迷宫 九宫幻方 小明最近在教邻居家的小朋友小学奥数&#xff0c;而最近正好讲述到了三阶幻方这个部分&#xff0c;三阶幻方指的是将1~9不重复的填入一个33的矩阵当中&#xff0c;使得每一行、每一列和每一条对角线的和都是相同的。 三阶幻方又被称…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

第十七讲_HarmonyOS应用开发Stage模型应用组件

HarmonyOS应用开发Stage模型应用组件 1. 应用级配置2. Module级配置3. Stage模型的组件3.1 AbilityStage3.1.1 AbilityStage的创建和配置3.1.2 AbilityStage的生命周期回调3.1.3 AbilityStage的事件回调&#xff1a; 3.2 UIAbility3.2.1 UIAbility生命周期3.2.3 UIAbility启动模…

CSAPP fall2015 深入理解计算机系统 Cache lab详解

Cache Lab cache lab 缓存实验 代码下载 从CSAPP上面下载对应的lab代码 http://csapp.cs.cmu.edu/3e/labs.html 环境准备 需要安装 valgrind。可以参考文章Valgrind centos。 安装好以后执行valgrind --version可以看到版本号。 Cache simulator cache simulator not a …

ART: Automatic multi-step reasoning and tool-use for large language models 导读

ART: Automatic multi-step reasoning and tool-use for large language models 本文介绍了一种名为“自动推理和工具使用&#xff08;ART&#xff09;”的新框架&#xff0c;用于解决大型语言模型&#xff08;LLM&#xff09;在处理复杂任务时需要手动编写程序的问题。该框架可…

【音视频原理】音频编解码原理 ③ ( 音频 比特率 / 码率 | 音频 帧 / 帧长 | 音频 帧 采样排列方式 - 交错模式 和 非交错模式 )

文章目录 一、音频 比特率 / 码率1、音频 比特率2、音频 比特率 案例3、音频 码率4、音频 码率相关因素5、常见的 音频 码率6、视频码率 - 仅做参考 二、音频 帧 / 帧长1、音频帧2、音频 帧长度 三、音频 帧 采样排列方式 - 交错模式 和 非交错模式1、交错模式2、非交错模式 一…

排序问题上机考试刷题

排序与查找可以说是计算机领域最经典的问题&#xff0c;排序和查找问题在考研机试真题中经常出现。排序考点在历年机试考点中分布广泛。排序既是考生必须掌握的基本算法&#xff0c;又是考生 学习其他大部分算法的前提和基础。首先学习对基本类型的排序。对基本类型排序&#x…

【C++中的STL】函数对象

函数对象 函数对象概念谓词概念 内建函数对象算术仿函数关系仿函数逻辑仿函数&#xff08;基本用不到&#xff09; 函数对象概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff0c;函数对象使用重载的()时。行为类似函数调用&#xff0c;也叫仿函数。 函数…

分析crash日志

每一天都要快乐的进步~~ 文章目录 在分析 crash 日志时&#xff0c;通常需要关注以下信息&#xff1a; 1️⃣ 错误信息&#xff1a;了解 crash 的具体错误信息&#xff0c;这有助于定位问题的根源所在。 2️⃣ 堆栈跟踪&#xff1a;查看堆栈跟踪&#xff0c;确定 crash 发生的…

4.F1 评分机器学习模型性能的常用的评估指标

F1评分作为机器学习领域中的一个综合性评价指标&#xff0c;旨在在准确率和召回率之间寻求平衡&#xff0c;进而提供对模型性能全面评估的手段。本文将深入探讨F1评分的定义、计算方法、应用领域、案例研究以及未来发展方向&#xff0c;力求为读者提供详实而全面的了解。 一.F…

C#学习笔记_StringBuilder+程序效率测试

String问题&#xff1a;当程序中进行过多字符串处理操作时&#xff0c;会在内存中产生过多垃圾信息&#xff0c;影响程序效率。 StringBuilder简介 StringBuilder为一个类&#xff0c;属于引用类型。StringBuilder与string的区别在于&#xff0c;StringBuilder对于字符串的操…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

语音方向精典论文品读_HuBERT

英文名称: HuBERT: Self-Supervised Speech Representation Learning by Masked Prediction of Hidden Units 中文名称: HuBERT&#xff1a;通过隐藏单元的屏蔽预测进行自监督语音表示学习 链接: http://arxiv.org/abs/2106.07447v1 代码: https:// github.com/pytorch/fairseq…

vertica10.0.0单点安装_ubuntu18.04

ubuntu的软件包格式为deb&#xff0c;而rpm格式的包归属于红帽子Red Hat。 由于项目一直用的vertica-9.3.1-4.x86_64.RHEL6.rpm&#xff0c;未进行其他版本适配&#xff0c;而官网又下载不到vertica-9.3.1-4.x86_64.deb&#xff0c;尝试通过alian命令将rpm转成deb&#xff0c;但…

盘古信息IMS OS 数垒制造操作系统+ 产品及生态部正式营运

启新址吉祥如意&#xff0c;登高楼再谱新篇。2024年1月22日&#xff0c;广东盘古信息科技股份有限公司新办公楼层正式投入使用并举行了揭牌仪式&#xff0c;以崭新的面貌、奋进的姿态开启全新篇章。 盘古信息总部位于东莞市南信产业园&#xff0c;现根据公司战略发展需求、赋能…

交叉熵损失函数求导与Softmax函数求导

交叉熵损失函数求导与Softmax函数求导 前情提要 交叉熵损失函数 对Softmax函数求导 对交叉熵损失函数求导 前情提要 在做单分类的时候&#xff0c;一般模型的最后一层是线性层Linear做分类器&#xff0c;输出在每个标签上的logits。损失函数为交叉熵损失函数&#xff0c;会…

redis过期事件监听、可以做延时任务 第二篇(简单)

在使用redis时&#xff0c;所有的key都要设置过期时间&#xff0c;过期之后&#xff0c;redis就会把对应的key清除掉。 此方法可以监听redis的key失效&#xff0c;在失效时做一些逻辑处理 redis过期监听 不像mq有保证 不推荐用来弄需要有保证的业务 现象&#xff1a; redis …

AWS 专题学习 P12 (CloudWatch、CloudTrail、AWS Config)

文章目录 专题总览1. CloudWatch1.1 Amazon CloudWatch Metrics1.2 CloudWatch Metric Streams1.3 CloudWatch LogsCloudWatch Logs - SourcesCloudWatch Logs Metric Filter & InsightsCloudWatch Logs – S3 ExportCloudWatch Logs SubscriptionsCloudWatch Logs Aggrega…

MATLAB|【完全复现】含可再生能源和储能的区域微电网的最优运行(考虑鲁棒性和不确定性)【多阶段鲁棒调度模型】

目录 主要内容 模型研究 一、区域微网模型 二、模型优化流程​ 结果一览 下载链接 主要内容 该程序实现了一种基于可再生能源和储能的区域微电网的多阶段优化调度方法&#xff0c;该方法可以同时保证优化调度方案的鲁棒性和非预测性。模型考虑两类不确定性&…