JPEG图片解析

article/2025/9/21 16:32:12

Preface

之前做了一些涉及对后缀为.JPEG格式的图片的解析工作,虽然最终证明是努力错了方向,但是对.JPEG图片解析也学到一些,整理一下,以备不时之需,同样也希望给有这个需求的人一定帮助。

XMP&Exif

这两种一般是我们常见的所谓的图片的“信息”,一般情况下,对与原始图片,我们单击右键属性,弹出来的相关信息即是储存在这两个文件中间。

Exif(Exchangeable image file format)与XMP(Extensible Metadata Platform)可以简单的理解XMP存储比Exif更多的信息,很多信息可以以XMP的形式存储于图片中,使用python3,两者分别可以使用exifread,以及libxmp进行相应信息读取:

#get the exif info from the image
def exif(infile):import sysimport exifreadimage_content = open(infile, 'rb')tags = exifread.process_file(image_content)if tags is None:print('Could not open ' + infile)sys.exit(1)image_content.close()return tags
#read the relevant xmp informationdef xmp_info(infile):from libxmp import XMPFiles, conststry:xmpfile = XMPFiles(file_path=infile, open_forupdate=True)xmp = xmpfile.get_xmp()return xmpexcept:print('Unable to get xmp information')

对于Exif信息,可以使用piexif进行相应编辑,例如可以将exif信息进行转移:

import piexif
piexif.transplant(src, dst)

可以参考包的相关描述:

piexif.load(filename) - Get exif data as dict.
piexif.dump(exif_dict) - Get exif as bytes.
piexif.insert(exif_bytes, filename) - Insert exif into JPEG, or WebP.
piexif.remove(filename) - Remove exif from JPEG, or WebP.
piexif.transplant(filename, filename) - Transplant exif from JPEG to JPEG.

Marker

大部分的时候,对图像的一些简单信息提取,或者相应编辑,使用exif以及xmp中的metadata足以应付。对于图像更深度信息提取,需要对图像本身的结构做一定了解。所有的文件,不管是图片还是其他,都是数据,对JPEG文件而言,其使用了一些特定的字符来进行其数据的标记,即所谓的markers,一副图片的完整数据结构如下所示:

SOI(0xFFD8)代表Start Of Image,因此,所有的图片数据开始的字符均是FFD8。 

EOI(0xFFD9)代表End Of Image,一般图片的结尾应该是FFD9,但可能存在需要将一些额外信息写入图片,这种情况下,在FFD9之后还会存在其他markers。 

对于不同markers代表意思。详见此文章:List of JPEG Markers。

狭义上,我们所关注的图片为图中红色部分,而广义部分则是包括header+payload,而我们所谓的exif或者xmp其实就是其头信息的一部分。而不同的markers(即图片中括号内FFD8等)是由2个字节组成。读取图片并以16进制显示:

#read images by bytes and return as in Hexadecimal Systemdef read_bytes(image): with open(image, 'rb') as f:data = f.read()return data.hex()

在传统一般的ffd8-ffd9外还有ffe2—ffe5四个marker段,这四个markers即常被称为APP2-APP5(application segment),这四段一般为自定义段,一般的都是用户写入一些自定义的信息或者扩展信息。而我么熟悉的exif或者xmp一般即写在ffe1内,关于头文件内部的详细一些介绍,可以查看这篇文章:JPEG文件格式解析(一)Exif与JFIF。

JPEG图片解析代码:

def image_parse(image):# read image and save as bytes in a listwith open(image, 'rb') as f:image_data = f.read()image_data = ['%x' % image_data[i] for i in range(len(image_data))]# index = ['d8', 'e1', 'db', 'c4', 'c0', 'da', 'd9', 'e2', 'e3', 'e4', 'e5']# parse the image markers and save in dictionarytagmarker = dict()tag = ''tag_start = Falsedata_start = Falsefor i, b in enumerate(image_data):if len(b) == 1:b = '0' + bif b == 'ff':tag_start = Truecontinueif tag_start:if b != 'ff' and (b != '00'):#if b in index:tag = 'ff' + bif not tag in tagmarker:tagmarker[tag] = list()tag_start = Falsedata_start = Truecontinueelse:tag_start = Falsetagmarker[tag].append('ff')if data_start:tagmarker[tag].append(b)# list the markersfor tag, arr in tagmarker.items():s = len(arr)if s == 0:print(tag)continueprint("{}:\t{}\tbytes".format(tag, s))# pdb.set_trace()return tagmarker

上述代码需要一定的优化,并非所有ff代表的就是marker开始,使用该方法粗略找到之后,可以再进行一次筛选(即自定义index即可以)。或者进行相应的优化即可。(由于这个也不是工作重点,所以代码也没进行普遍性优化),另:这段代码是在哪里copy来的,也不太记得了,所以就没参考了。

下图即为实际图片解析后结构:

ffd8
ffe1:	9364	bytes
ffdb:	432	bytes
ffc4:	1382	bytes
ffc0:	69	bytes
ffda:	228997	bytes
ffd9
ffe2:	180	bytes
ffe3:	655382	bytes
ffe4:	2561	bytes
ffe5:	32540	bytes

Refer

  1. 图像元数据(Metadata) 及 Exif信息分析
  2. piexif · PyPI
  3. python修改图片exif信息
  4. JPEG头部解析
  5. JPEG文件格式解析(一) Exif 与 JFIF
  6. List of JPEG Markers
  7. Corrupt JPEG Files and how to fix them

http://chatgpt.dhexx.cn/article/WPs9Dk5C.shtml

相关文章

图片格式:JPG;RAW ;TIFF;PNG;GIF的解析

参考图片格式:JPG;RAW ;TIFF;PNG;GIF的解析 - 云社区 - 腾讯云 相信大家平时在拍摄照片的时候,一定遇到过各种各样纷繁复杂的图片格式。 同时在后期处理的时候,存储图像也面临着各种不同选择。…

常见图片宽高解析

于比较常用的图片格式Png、Jpg、Gif、Bmp,我们需要针对不同的图片格式使用不同的控件来显示,这里就有一个来解析图片格式的问题。我们不能单纯的用文件后缀名.png、.jpg、.jpeg、.gif、.bmp来区分图片格式,因为实际上我们可以直接修改图片后缀…

图片类型解析

文章目录 PNGPNG 特点PNG 类型PNG 数据结构PNG 适用场景PNG 压缩过程 JPG/JPEGWebP PNG PNG 特点 无损压缩:PNG图片采取了基于LZ77派生算法对文件进行压缩,使得它压缩比率更高,生成的文件体积更小,并且不损失数据。体积小&#…

激活函数(5)ELU函数、PReLU函数

ELU函数 ELU函数公式和曲线如下图 ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的情况下,是有一定的输出的,而且这部分输出还具有一定的抗干扰能力。这样可以消除ReLU死掉的问题,不过还是有梯度饱…

激活函数(relu,prelu,elu,+BN)对比on cifar10

最近做了个对比实验,通过修改激活函数观察对图片分类准确率的影响,现记录如下: 一.理论基础 1.1激活函数 1.2 elu论文(FAST AND ACCURATE DEEP NETWORK LEARNING BY EXPONENTIAL LINEAR UNITS (ELUS))…

22个激活函数,ReLU、RReLU、LeakyReLU、PReLU、Sofplus、ELU、CELU、SELU、GELU、ReLU6、Sigmoid、Tanh、Softsign、Hardtanh等

转自:https://www.pianshen.com/article/33331174884/ 1.22.Linear常用激活函数 1.22.1.ReLU torch.nn.ReLU() 1.22.2.RReLU torch.nn.RReLU() 1.22.3.LeakyReLU torch.nn.LeakyReLU() 1.22.4.PReLU torch.nn.PReLU() 1.22.5.Sofplus torch.nn.Softplus() 1.22.6.E…

常用激活函数(Sigmiod、Tanh、Softmax、ReLU、elu、LReLU、Softplus)函数表达式、特点、图像绘制(代码)---已解决

楼主最近在研究激活函数,索性将常用的激活函数进行了简单的整理,方便以后翻看,也希望能帮到你。 1、sigmoid函数 函数表达式:f(x) 1/(1e^-x) 函数特点: 优点:1.输出[0,1]之间;2.连续函数&#…

Sigmoid,tanh,Relu,Leaky ReLu,ELU,GeLu 激活函数理解

目录 1 神经网络为什么需要非线性激活函数?2 Sigmoid2.1缺陷2.1.1 梯度消失2.2.2 Output非zero-centered 3 Tanh3.1 缺陷 4 ReLu4.1 缺陷 5 Leaky ReLu6 ELU7 GeLu7.1 基础知识回顾7.1.1 正态分布7.1.2 概率密度函数7.1.3 累积分布函数7.1.4 Φ(x)与erf(x)函数关系公…

Elu函数~小朋友

Elu激励函数的数学表达式如下: 图一:摘自 https://blog.csdn.net/zrh_CSDN/article/details/81266188 代码如下: #code:utf-8import numpy as np import matplotlib.pyplot as pltdef elu(x,a):y x.copy()for i in range(y.shape[0]):if y[…

【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

【Python–torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 【Python--torch】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)1. 介绍2. 常用激活函数说明2.1 Sigmoid2.1.1 公式2.1.2 图像2.1.3 代码解读 2.2 Softmax2.2.1 公式2.2.2 代码解读 2.3 EL…

A.深度学习基础入门篇[四]:激活函数介绍:tanh、sigmoid、ReLU、PReLU、ELU、softplus、softmax、swish等

【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…

el-descriptions

<el-descriptions title"用户信息"><el-descriptions-item label"用户名">kooriookami</el-descriptions-item><el-descriptions-item label"手机号">18100000000</el-descriptions-item><el-descriptions-ite…

功能性模块:(8)一文理解常用激活函数(Sigmoid,ReLU,ELU,GELU...)

一文理解常用激活函数 1. Sigmoid 公式&#xff1a; Sigmoid ( x ) 1 1 exp ⁡ ( − x ) \text{Sigmoid}(x) \frac{1}{1 \exp(-x)} Sigmoid(x)1exp(−x)1​ Sigmoid的函数形状如下图所示: 对应的导数形式如下图所示&#xff1a; Sigmoid函数的优点&#xff1a; 便于求…

深入理解ReLU、Leaky ReLU、 PReLU、ELU、Softplus

文章目录 ReLULeaky ReLUPReLUELUSoftplus ReLU ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;&#xff0c;也叫Rectifier 函数&#xff0c;它的定义如下&#xff1a; Relu可以实现单侧抑制&#xff08;即把一部分神经元置0&#xff09;&#x…

搞懂激活函数(Sigmoid/ReLU/LeakyReLU/PReLU/ELU)

1. 简介 在深度学习中&#xff0c;输入值和矩阵的运算是线性的&#xff0c;而多个线性函数的组合仍然是线性函数&#xff0c;对于多个隐藏层的神经网络&#xff0c;如果每一层都是线性函数&#xff0c;那么这些层在做的就只是进行线性计算&#xff0c;最终效果和一个隐藏层相当…

YOLOv5改进系列(13)——更换激活函数之SiLU,ReLU,ELU,Hardswish,Mish,Softplus,AconC系列等

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

【PyTorch】教程:torch.nn.ELU

torch.nn.ELU CLASS torch.nn.ELU(alpha1.0, inplaceFalse) paper: Fast and Accurate Deep Network Learning by Exponential Linear Units (ELUs). 参数 alpha ([float]) – α \alpha α 默认为1.0inplace ([bool] ) – 内部做, 默认为 False ELU 定义 ELU ( x ) { x , …

【YOLOv7/YOLOv5系列算法改进NO.54】改进激活函数为ReLU、RReLU、Hardtanh、ReLU6、Sigmoid、Tanh、Mish、Hardswish、ELU、CELU等

文章目录 前言一、解决问题二、基本原理三、​添加方法四、总结 前言 作为当前先进的深度学习目标检测算法YOLOv7&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系…

常用激活函数:Sigmoid、Tanh、Relu、Leaky Relu、ELU优缺点总结

1、激活函数的作用 什么是激活函数&#xff1f; 在神经网络中&#xff0c;输入经过权值加权计算并求和之后&#xff0c;需要经过一个函数的作用&#xff0c;这个函数就是激活函数&#xff08;Activation Function&#xff09;。 激活函数的作用&#xff1f; 首先我们需要知道…

深度学习—激活函数详解(Sigmoid、tanh、ReLU、ReLU6及变体P-R-Leaky、ELU、SELU、Swish、Mish、Maxout、hard-sigmoid、hard-swish)

非线性激活函数详解 饱和激活函数Sigmoid函数tanh函数hard-Sigmoid函数 非饱和激活函数Relu&#xff08;修正线性单元&#xff09;&#xff1a;Relu6&#xff08;抑制其最大值&#xff09;&#xff1a;ELU&#xff08;指数线性单元&#xff09;SELULeaky-Relu / R-ReluP-Relu&a…