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

在PYTHON中用zlib模块对文本进行压缩,写入图片的EXIF中,后在C#中读取EXIF并用SharpZipLib进行解压获取压缩前文本

在PYTHON中用zlib模块对文本进行压缩长度,写入图片的EXIF中,并在C#中读取EXIF后用SharpZipLib进行解压缩获取压缩前文本。

PS:当压缩后的字节数组长度为单数时,无法写入EXIF的XPComment中,需要在后面增加一个以utf-8编码的空格, 使其在原基础上在1变为双数 。另外,解压时要根据压缩时的编码选择对应的解压编码。

PYTHON代码

def save_file(args):#增加在主图片主题属性中增加CV2抠图返回的点 START_, cnt_original, _ = cv2.findContours(synthetic, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours_list = cnt_original[0].tolist()process_contours_list = []for list in contours_list:process_contours_list.append(list[0])# 数据格式 [[12,33],[1232,212],[1233,244].....]    # list转字符串process_contours_list_bytes = json.dumps(process_contours_list)   compress_contors = zlibCompress(process_contours_list_bytes)    exif_dict = piexif.load(image_name)if 'exif' not in image.info.keys():software = ""copyright = ""XPComment = ""else:exifData = piexif.load(image.info['exif'])exifData = exifData['0th']software = exifData[piexif.ImageIFD.Software]copyright = exifData[piexif.ImageIFD.Copyright]XPComment = exifData[piexif.ImageIFD.XPComment]zeroth_ifd = {piexif.ImageIFD.XPSubject: compress_contors,piexif.ImageIFD.XPComment: XPComment,piexif.ImageIFD.Software:software,piexif.ImageIFD.Copyright:copyright}# exif_dict['0th'] = zeroth_ifdexif_dict = {"0th": zeroth_ifd}# print(exif_dict)exif_bytes = piexif.dump(exif_dict)img.save(filename + "_s.jpg", format="JPEG", quality=quality, dpi=dpi,exif=exif_bytes)#用Zlib进行压缩        
# 参数为字符串,返回为bytes[]
# 当压缩后的字节数组长度为单数时,无法写入EXIF的XPComment中,需要在后面增加一个以utf-8编码的空格,
# 使其在原基础上在1变为双数            
def zlibCompress(data):compress_contors = zlib.compress(data.encode('utf-16'))if (len(compress_contors) % 2 != 0):add_byte = bytes(' ',encoding='utf-8')compress_contors += add_byte# tem_data = data + '.'# tem_data = tem_data.encode('utf-16')# compress_contors = zlib.compress(tem_data)return compress_contors 

C#读取并用SharpZipLib库 进行解压解压文本

using MetadataExtractor;
using System;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.Zip.Compression;//读取图片EXIF并解压内容
private void button6_Click(object sender, EventArgs e)
{try{string filename = "G://test/test/_200_s.jpg";if (File.Exists(filename)){StringBuilder sb = new StringBuilder();IReadOnlyList<MetadataExtractor.Directory> directories = ImageMetadataReader.ReadMetadata(filename);foreach (MetadataExtractor.Directory directory in directories){if (directory.HasTagName(40095)){byte[] resDes = directory.GetByteArray(40095);byte[] res0 = SharpZipLibDecompress(resDes);string result = System.Text.Encoding.Unicode.GetString(res0);//根据压缩时的编码选择对应的解压编码//string result = System.Text.Encoding.UTF8.GetString(res0);Console.WriteLine(result);}}}}catch (Exception ex){System.Windows.Forms.MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);}
}//用SharpZipLib进行解压
public static byte[] SharpZipLibDecompress(byte[] data){MemoryStream compressed = new MemoryStream(data);MemoryStream decompressed = new MemoryStream();InflaterInputStream inputStream = new InflaterInputStream(compressed);inputStream.CopyTo(decompressed);return decompressed.ToArray();}

相关文章:

在PYTHON中用zlib模块对文本进行压缩,写入图片的EXIF中,后在C#中读取EXIF并用SharpZipLib进行解压获取压缩前文本

在PYTHON中用zlib模块对文本进行压缩长度&#xff0c;写入图片的EXIF中&#xff0c;并在C#中读取EXIF后用SharpZipLib进行解压缩获取压缩前文本。 PS:当压缩后的字节数组长度为单数时&#xff0c;无法写入EXIF的XPComment中&#xff0c;需要在后面增加一个以utf-8编码的空格&a…...

centos / oracle Linux 常用运维命令讲解

目录 1.shell linux常用目录&#xff1a; 2.命令格式 3.man 帮助 4.提示符 5.echo输出字符串或变量值 6.date显示及设置系统的时间或日期 7.重启系统 8.关闭系统 9.登录注销 10.wget 下载文件 11.ps 查看系统的进程 12.top动态监视进程信息和系统负载等信息 13.l…...

EMNLP 2023 录用论文公布,速看NLP各领域最新SOTA方案

EMNLP 2023 近日公布了录用论文。 开始前以防有同学不了解这个会议&#xff0c;先简单介绍介绍&#xff1a;EMNLP 是NLP 四大顶会之一&#xff0c;ACL大家应该都很熟吧&#xff0c;EMNLP就是由 ACL 下属的SIGDAT小组主办的NLP领域顶级国际会议&#xff0c;一年举办一次。相较于…...

互联网Java工程师面试题·Java 并发编程篇·第三弹

目录 26、什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; 27、为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 27.1 为什么要使用 Executor 线程池框架 27.2 使用 Executor 线程池框架的优点 28、java 中有几种方法可以实现一个线程…...

mac jdk的环境变量路径,到底在哪里?

在mac 电脑中&#xff0c;直接执行 java -version 显示Jdk的版本为1.8 然后打印Java环境变量 在终端中执行 echo $JAVA_HOME 1、情况一&#xff1a;发现环境变量是空的 我草&#xff0c;没配置环境变量怎么能使用Java &#xff0c;和查看jdk版本 2、情况二&#xff1a;环…...

PyQt5 PyQt6 Designer 的安装

pip国内的一些镜像 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣(douban) http://pypi.douban.com/simple/ 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/ 中国科学技术大学 http://pypi.mirrors.ustc.…...

数据库:Hive转Presto(四)

这次补充了好几个函数&#xff0c;并且新加了date_sub函数&#xff0c;代码写的比较随意&#xff0c;有的地方比较繁琐&#xff0c;还待改进&#xff0c;而且这种文本处理的东西&#xff0c;经常需要补充先前没考虑到的情况&#xff0c;要经常修改。估计下一篇就可以补充完所有…...

16基于otsuf方法的图像分割,程序已调通,可更换自己的图片进行分割,程序具有详细的代码注释,可轻松掌握。基于MATLAB平台,需要直接拍下。

基于otsuf方法的图像分割&#xff0c;程序已调通&#xff0c;可更换自己的图片进行分割&#xff0c;程序具有详细的代码注释&#xff0c;可轻松掌握。基于MATLAB平台&#xff0c;需要直接拍下。 16matlab图像处理图像分割 (xiaohongshu.com)...

2、使用阿里云镜像加速器提升Docker的资源下载速度

1、注册阿里云账号并登录 https://www.aliyun.com/ 2、进入个人控制台&#xff0c;找到“容器镜像服务” 3、在“容器镜像服务”中找到“镜像加速器” 4、在右侧列表中会显示你的加速器地址&#xff0c;复制地址 5、进入/etc/docker目录&#xff0c;编辑daemon.json&#xff0…...

贴片电容材质的区别与电容的主要作用

一、贴片电容材质NPO、COG、X7R、X5R、Y5V、Z5U区别 主要是介质材料不同&#xff0c;不同介质种类由于它的主要极化类型不一样&#xff0c;其对电场变化的响应速度和极化率也不一样。在相同的体积下的容量就不同&#xff0c;随之带来的电容器介质的损耗、容量的稳定性也就不同…...

flink1.15 savepoint 超时报错 java.util.concurrent.TimeoutException

savepoint命令 flink savepoint e04813d4e7480c526912eb4d32bba510 hdfs://flink/flink/migration/savepoint56650 -Dyarn.application.id=application_1683808492336_1222报错内容 org.apache.flink.util.FlinkException: Triggering a savepoint for the job e04813d4e7480…...

并发编程——1.java内存图及相关内容

这篇文章&#xff0c;我们来讲一下java的内存图及并发编程的预备内容。 首先&#xff0c;我们来看一下下面的这两段代码&#xff1a; 下面&#xff0c;我们给出上面这两段代码在运行时的内存结构图&#xff0c;如下图所示&#xff1a; 下面&#xff0c;我们来具体的讲解一下。…...

Android studio安装详细教程

Android studio安装详细教程 文章目录 Android studio安装详细教程一、下载Android studio二、安装Android Studio三、启动Android Studio 一、下载Android studio Android studio安装的前提是必须保证安装了jdk1.8版本以上 1、打开android studio的官网&#xff1a;Download…...

Jetson Orin NX 开发指南(7): EGO-Swarm 的编译与运行

一、前言 EGO-Planner 浙江大学 FAST-LAB 实验室的开源轨迹规划算法是&#xff0c;受到 IEEE Spectrum 等知名科技媒体的报道&#xff0c;其理论技术较为前沿&#xff0c;是一种不依赖于ESDF&#xff0c;基于B样条的规划算法&#xff0c;并且规划成功率、算法消耗时间、代价数…...

nginx的重定向

nginx重定向--rewrite重写功能介绍 rewrite 的功能介绍 rewrite功能就是&#xff0c;使用nginx提供的全局变量或自己设置的变量&#xff0c;结合正则表达式和标记位实现URL重写以及重定向。 比如&#xff1a;更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需…...

理解Go中的数组(Array)和切片(Slice)

引言 在Go中&#xff0c;数组和切片是由有序的元素序列组成的数据结构。当需要处理许多相关值时&#xff0c;这些数据集非常适合使用。它们使你能够将本应放在一起的数据放在一起&#xff0c;压缩代码&#xff0c;并一次性对多个值执行相同的方法和操作。 尽管Go中的数组和切…...

计算机毕业设计选什么题目好?springboot 高校学生综合测评管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…...

在liunx下读取串口的数据

1. 设置串口参数 首先是通过stty工具设置串口参数&#xff1a; sudo stty -F /dev/ttyUSB0 比特率 cs8 -cstopb如&#xff1a;sudo stty -F /dev/ttyUSB0 115200 cs8 -cstopb. 注意&#xff1a; 需要注意的是这里需要sudo权限&#xff1b; 2. 读取串口数据 然后读取串口的…...

Python中使用IDLE调试程序

在IDLE中&#xff0c;使用菜单栏中的“Debug”对IDLE打开的python程序进行调试。 1 打开调试开关 选择IDLE菜单栏的“Debug->Debugger”&#xff0c;如图1①所示&#xff1b;此时在IDLE中会显示“[DEBUG ON]”&#xff0c;即“调试模式已打开”&#xff0c;如图1②所示&am…...

发个地区和对应的价格方案

在当今数字化的世界中&#xff0c;网络工程师面临着各种挑战&#xff0c;从跨界电商到爬虫&#xff0c;从出海业务到网络安全&#xff0c;再到游戏领域。为了应对这些挑战&#xff0c;网络工程师需要了解并利用各种技术&#xff0c;其中Socks5代理和代理IP技术成为了他们的得力…...

启动Java应用的黑魔法:初始化性能解密@PostConstrut,InitialzingBean,init-method,BeanPostProcessor

我们在项目中经常会遇到启动时做一些逻辑的处理&#xff0c;比如配置信息的预加载&#xff0c;缓存信息的预加载等等&#xff0c;那都有哪些方法了&#xff0c;我们一起来探讨一下&#xff1a; 1. 方式 1. 构造方法初始化&#xff1a; 使用构造方法进行对象的基本属性初始化。…...

STM32-C语言结构体地址

定义2个结构体 typedef struct _demo_node_{ //结构体本身的地址struct _demo_node_* pprenode; //实际地址开始的位置&#xff0c;最下面的输出结果可以看出struct _demo_node_* pnextnode;unsigned long member_num;unsigned short age;char addr[0]; …...

Go HTTP 调用(下)

今天分享的内容是 Go HTTP 调用。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本文有错误的地方&#xff0c;欢迎指出&#xff01; 前言 上篇文章 Go HTTP 调用&#…...

mysql5.7获取json数组中的某个对象

前言 表中的一个字段类型是字符串&#xff0c;存的是一个对象数据。 现在要根据对象中的某个属性&#xff0c;获取到整个对象信息。 如果是mysql8&#xff0c;则可以使用JSON_TABLE。 示例&#xff1a;https://blog.csdn.net/weixin_44071721/article/details/123347229 sele…...

PTE考试解析

Pte 考试题目 注入漏洞 空格被过滤 用/**/代替空格&#xff0c;发现#被过滤 对&#xff03;进行url编码为%23 输入构造好的payload http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/**/and/**/11%23 http://172.16.12.100:81/vulnerabilities/fu1.php?id1%27)/*…...

UE4和C++ 开发-UE4怎么删除C++类

1 关闭visual stdio&#xff0c;关闭UE4引擎。 2 打开你的项目文件夹。找到你要删除的.h,.cpp文件删除。 3、删除Binaries文件夹。 4 右击.uproiect文件&#xff0c;点击Generate Visual Studio project files. 5 双击.uproiect文件,忽略警告打开就看到已经删除了想要删除的C类…...

基于图像识别的迁移学习之一

案例分析 加载数据部分同上一个案例&#xff0c;只需把数据输入到预训练的VGG-16或者ResNet50中。VGG-16的网络结构为右侧图绿色栏所示&#xff0c;其中block1中有2个包含64个卷积核的卷积层&#xff0c;block2包含2个128个卷积核的卷积层&#xff0c;block3有3个包含256个卷积…...

k8s使用

一、Kubernetes好处 ​ kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 ​ kubernetes的本质…...

HTML图片标签(2) HTML5+CSS3+移动web 前端开发入门笔记(三)

图片标签 HTML中&#xff0c;可以使用标签来插入图片。具体的语法为&#xff1a; <img src"图片路径" alt"替代文本">其中&#xff0c;src属性用于指定图片的路径&#xff0c;可以是相对路径或绝对路径。常见的有相对当前HTML文件的路径&#xff0…...

jwttoken+redis+springsecurity

思路 jwttoken不设置过期时间 redis管理过期时间&#xff0c;并且续签 redis中key"login:"userId, valuejwtUser 再次访问时&#xff0c;解析token中userId&#xff0c;并且根据过期时间自动续签JWT 实现登录认证 Token 自动续期方案 pom文件配置 <!--Redis--&…...