python3 在线解析jpg图片或解析本地jpg,判断jpg是否损坏

2023-11-09

一、JPEG图片格式详解

JPEG图片格式组成部分:SOI(文件头)+APP0(图像识别信息)+ DQT(定义量化表)+ SOF0(图像基本信息)+ DHT(定义Huffman表) + DRI(定义重新开始间隔)+ SOS(扫描行开始)+ EOI(文件尾)

二、数据结构

  1.段的一般结构如下表所示:

表1:段的一般结构
-----------------------------------------------------------------
名称    字节数 数据  说明
-----------------------------------------------------------------
段标识   1     FF    每个新段的开始标识
段类型   1           类型编码(称作“标记码”)
段长度   2           包括段内容和段长度本身,不包括段标识和段类型
段内容               ≤65533字节
-----------------------------------------------------------------
  说明:
①JPG 文件中所有关于宽度高度长度间隔这一类数据,凡是>1字节的,均采用Motorola格式,即:高位在前,低位在后。
②有些段没有长度描述也没有内容,只有段标识和段类型。文件头和文件尾均属于这种段。
③段与段之间无论有多少FF都是合法的,这些FF称为“填充字节”,必须被忽略掉。


  2.段类型有30种,但只有10种是必须被所有程序识别的,其它的类型都可以忽略。所以下面只列出这10种类型。

表2:段类型
---------------------------------------
名称  标记码  说明
---------------------------------------
SOI    D8     文件头 
EOI    D9     文件尾
SOF0   C0     帧开始(标准 JPEG)
SOF1   C1     同上
DHT    C4     定义 Huffman 表(霍夫曼表)
SOS    DA     扫描行开始
DQT    DB     定义量化表
DRI    DD     定义重新开始间隔
APP0   E0     定义交换格式和图像识别信息
COM    FE     注释
-----------------------------------------------------------
  说明:有的文章也将DNL段(标记码=DC,定义扫描行数)列为必须段。

具体请参考这两篇博文:

https://blog.csdn.net/yun_hen/article/details/78135122

https://blog.csdn.net/STN_LCD/article/details/78629029

三.环境

1.python3

2.安装图像处理库 pip install pillow 
 pillow 的api 函数请参考官网:https://pillow.readthedocs.io/en/4.2.x/reference/Image.html#PIL.Image.open

四、代码实例:

 
from os import PathLike
from PIL import Image
import urllib.request
import io
# 判断文件是否为有效(完整)的图片
# 从网络上判断图片是否损坏
def IsValidImage_remote_img(url):
    try:
        bValid = True
        '''python2写法
        request = urllib2.Request(img_url)
        img_data = urllib2.urlopen(request).read()
        img_buffer = StringIO.StringIO(img_data)
        img = Image.open(img_buffer)
        img.save('remote.jpg')#保存图片
        (width,height) = img.size
        out = img.resize((200,height * 200 / width),Image.ANTIALIAS)
        out.save('remote_small.jpg')        '''
        buf = urllib.request.urlopen(url).read()  # bytearray
        img_buffer = io.BytesIO(buf)  # 转换为字符串
        if not buf.startswith(b'\xff\xd8'):#是否以\xff\xd8开头
            bValid=False
        elif buf[6:10] in (b'JFIF', b'Exif'):  # “JFIF”的ASCII码
            if not buf.rstrip(b'\0\r\n').endswith(b'\xff\xd9'):#是否以\xff\xd9结尾
                bValid = False
        else:
            try:
                Image.open(img_buffer).verify()
            except Exception as e:
                bValid = False
                print(e)
    except Exception as e:
        print(e)

    return bValid
# 从本地判断图片是否损坏
def IsValidImage_native_img(file):
    try:
        bValid = True
        if isinstance(file, (str, PathLike)):  # 文件路径
            fileObj = open(file, 'rb')  # 以二进制形式打开
        else:
            fileObj = file  # 文件对象
        buf = fileObj.read()
        if not buf.startswith(b'\xff\xd8'):  # 是否以\xff\xd8开头
            bValid = False
        elif buf[6:10] in (b'JFIF', b'Exif'):  # “JFIF”的ASCII码
            if not buf.rstrip(b'\0\r\n').endswith(b'\xff\xd9'):  # 是否以\xff\xd9结尾
                bValid = False
        else:
            try:
                Image.open(fileObj).verify()
            except Exception as e:
                bValid = False
                print(e)
    except Exception as e:
        print(e)
    return bValid

#打印一个字节数组
def print_bytearray(buf):
    i = 0
    for ebuf in buf:
        i = i + 1
        print('0x%-2x' % ebuf, end='')
        print("  ", end='')
        if i == 16:
            print("\n")
            i = 0
    print("\n")

def main():
    flag1=IsValidImage_remote_img('http:XXX/xxx/xxxxx.jpg')
    flag2=IsValidImage_native_img(r'C:\Users\PC\Desktop\1.jpg')
    print(flag1)
    print(flag2)
if __name__ == '__main__':
    main()

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 在线解析jpg图片或解析本地jpg,判断jpg是否损坏 的相关文章

随机推荐

  • 【死磕 Java 基础】--- 我一口气自己就动手实现一个 LRU

    大家好 我是大明哥 个人网站 https www topjava cn LRU 即 Least Recently Use 直译为 最近最少使用 它是根据数据的历史访问记录来进行数据淘汰的 淘汰掉最先访问的数据 其核心思想是 如果数据最近被访
  • UE4_编辑器UMG关闭窗口不能立刻销毁UMG

    问题描述 运行UMG 使之创建显示到视口 效果如下 点击关闭按钮 再次运行该UMG 使之显示到视口 通过在c 中获取该UMG的数量 发现数量为2 不是所预计得1 导致编写得代码出现bug 修改办法 截图如下 该解决办法不是实用所有程序 因为
  • Linux IPC之内存映射mmap()

    导言 如何使用mmap 系统调用来创建内存映射 它可以用于IPC以及其他很多方面 概述 mmap 系统调用 在调用进程的虚拟地址空间中创建一个新内存映射 映射分为两种 文件映射 内存映射文件 将一个文件的一部分直接映射到调用进程的虚拟内存中
  • C# 文件操作之创建文件夹

    本文章主要是讲述C 中文件操作的基础知识 如何创建文件夹 创建文件 介绍Directory类 DirectoryInfo类和使用FolderBrowserDialog组件 文件夹对话框 文章属于基础知识 参考了书籍刘丽霞 C 范例开发大全
  • SpringBoot不依赖(禁用)Gemfire数据库启动的方法

    默认情况下SpringBoot的启动是要依赖GemFire做为缓存数据库的 如果做一个小的项目 不需要缓存数据库 这将是一个不容易摘除的工作 通过对其官网技术资料的分析 这个也很容易做到 说一下我的技术环境 Spring boot版本 2
  • 乐观锁与悲观锁讲解,CAS、synchronized、锁升级、ReentrantLock、AQS

    什么是乐观锁和悲观锁 乐观锁 总是假设最好的情况 每次拿数据的是时候都认为别人没有进行修改 所以不会加锁 但是为了保证线程安全 每次修改的时候都会判断这个数据有没有被修改过 适用于写少的场景 因为在写操作较多时如果失败会不断通过自旋判断数据
  • IGBT基本工作原理及IGBT的作用是什么?

    IGBT 今天我们一起来了解关于IGBT 绝缘栅双极性晶体管 芯片 在过去的几十年中 我们生活的每个角落都离不开能源的驱动 然而 传统的功率晶体管却受限于一些方面不足 幸运的是 IGBT芯片的出现彻底改变了这一局面 IGBT和MOS管都是一
  • JavaWeb01-Servlet-thymeleaf-mvd-dispatcher-controller

    Servlet servlet的基本作用 第一个servlet程序 演示servlet的生命周期 public class Demo02Servlet extends HttpServlet Override public void ini
  • CodeGeeX使用指南

    CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型 使用超过二十种编程语言训练得到 基于CodeGeeX开发的插件可以实现通过描述生成代码 补全代码 代码翻译等一系列功能 CodeGeeX同样提供可以定制的提示模式 Pro
  • 华为OD机试真题-组装数组【2023Q1】

    题目内容 给你一个整数M和数组N N中的元素为连续整数 要求根据N中的元素组装成新的数组R 组装规则 1 R中元素总和加起来等于M 2 R中的元素可以从N中重复选取 3 R中的元素最多只能有1个不在N中 且比N中的数字都要小 不能为负数 输
  • 1012 数字分类

    1012 数字分类 题目 输入格式 输入样例 输出样例 代码 小结 题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1
  • sql 选取前两条_从零开始学习SQL(二)SQL简单查询

    SQL简单语句可用于查询数据库中的内容 数据来源 SQLZOO SELECT from WORLD Tutorial zh sqlzoo net 一 基本查询语句 从数据库中查询数据时 需要使用SELECT语句 通常SELECT语句可用于指
  • 【滤波器】1. 一阶RC滤波器

    文章目录 1 低通滤波器 2 高通滤波器 3 常用工具 1 低通滤波器 电容上的分压 U C U I
  • shell awk 入门

    awk 好用的数据处理工具 awk 也是一个非常棒的数据处理工具 sed 常常用于一整个行的处理 awk 则比较倾向于一行当中分成数个 栏位 或者称为一个域 也就是一列 来处理 因此 awk 相当的适合处理小型的数据数据处理呢 awk 通常
  • 在Linux系统中如何把文件拷贝到U盘

    Linux下把所有的都当成文件处理 如果在linux系统下需要拷贝文件 哪么你需要先把U盘挂载到系统中的某一个位置 然后再使用cp命令完成拷贝 工具原料 Linux操作系统一台 U盘一枚 方法 步骤 1 把U盘插入Linux电脑 确保U盘指
  • 用C语言编写的推箱子小游戏

    大一时候的期末大作业 一直没找到 在桌子缝里找到了优盘 现在才把内容放上来 希望能帮到你们 具体内容分为实验报告和程序具体代码 程序设计基础 期末大作业报告 实验设计 1 编写推箱子小游戏 2 使用C语言 3 使用Dev C 编程程序 4
  • 7. AES加密之base64编码

    整个加密的流程 编码算法 base64算法 与加密解密无关 只是对数据进行编码 方便在网络间进行传输 import org junit jupiter api Test import java nio charset StandardCha
  • SpringBoot+EasyCaptcha实现验证码功能

    一 EasyCaptcha简介 Java图形验证码 支持gif 中文 算术等类型 可用于Java Web JavaSE等项目 开源地址 https github com whvcse EasyCaptcha 二 SpringBoot项目如何
  • 华为OD机试真题-最多获得的短信条数【2023.Q1】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • python3 在线解析jpg图片或解析本地jpg,判断jpg是否损坏

    一 JPEG图片格式详解 JPEG图片格式组成部分 SOI 文件头 APP0 图像识别信息 DQT 定义量化表 SOF0 图像基本信息 DHT 定义Huffman表 DRI 定义重新开始间隔 SOS 扫描行开始 EOI 文件尾 二 数据结构