ImageMagick:用identify检查图片是否完整?(jpg/gif/png图片是否损坏)
一,常用图片格式的结束标志是什么?
1,Jpg格式的文件在16进制中的表示是以 ff d9 两个字节结尾
2, gif格式的文件,结尾是 3b
3, png格式的文件,结尾是 00 00 00 00 49 45 4E 44 AE 42 60 82
说明:我们要用到identify的命令,需要安装ImageMagick
参见这一篇:
https://www.cnblogs.com/architectforest/p/12807514.html
说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest
对应的源码可以访问这里获取: https://github.com/liuhongdi/
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二,为什么要查看图片的结束标志?
图片文件在上传过程中受网络情况影响,有可能发生网络中断,
或者处理程序在处理图片时不确定文件是否已上付完成,
图片文件的结束位或结束标志就成为我们检查文件是否完整的标准
三,用linux命令查看图片的结束标志?
1,用xxd命令看一个完整图片的结束标志:
[root@blog html]# xxd a.jpg | tail -2
000041a0: 94ec a491 cc58 b396 354d 8b06 c9b7 6e90 .....X..5M....n.
000041b0: 6922 6997 2294 21f2 bcff d9 i"i.".!....
说明:文件结尾是 ffd9,说明图片文件完整
a.jpg如图:
2,用xxd命令看一个不完整图片的结束标志:
[root@blog html]# xxd b.jpg | tail -2
00002d20: 40a3 ff00 5c67 74f1 5f95 b4df d51e 6b21 @...\gt._.....k!
00002d30: 35e3 5.
说明:文件结尾不是 ffd9,说明图片文件不完整而是已损坏
b.jpg如图:
3,也可以使用od这个命令,还是上面的两张图片,举例如下:
#--endian=big: 指定大端小端以大端方式输出
#-h: 指定以16进制输出
完整图片
[root@blog html]# od --endian=big -h a.jpg | tail -2
0040660 6922 6997 2294 21f2 bcff d900
0040673
损坏图片
[root@blog html]# od --endian=big -h b.jpg | tail -2
0026460 35e3
0026462
四,用identify检查图片是否完整?
1,检查gif是否有损坏?
有损坏的gif
[root@blog img]$ identify -verbose dog.gif | grep corrupt
identify: corrupt image `dog.gif' @ error/gif.c/DecodeImage/513.
identify: corrupt image `dog.gif' @ error/gif.c/ReadGIFImage/1389.
图片如下:
无损坏的gif
[root@blog img]$ identify -verbose dog_tmb.gif | grep corrupt
没有任何输出
图片如下:
2,检查jpg图片是否有损坏?
有损坏的jpg
[root@blog html]$ identify -verbose b.jpg | grep Corrupt
identify: Premature end of JPEG file `b.jpg' @ warning/jpeg.c/JPEGWarningHandler/390.
identify: Corrupt JPEG data: premature end of data segment `b.jpg' @ warning/jpeg.c/JPEGWarningHandler/390.
无损坏的jpg不会输出包含Corrupt字样的信息
五,查看ImageMaigck的版本:
[root@blog html]# identify --version
Version: ImageMagick 6.9.10-86 Q16 x86_64 2020-01-13 https://imagemagick.org
Copyright: 1999-2020 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC Modules OpenMP(4.5)
Delegates (built-in): bzlib cairo fftw fontconfig freetype gslib gvc jbig jng jp2 jpeg lcms ltdl
lzma openexr pangocairo png ps raqm raw rsvg tiff webp wmf x xml zlib
ImageMagick:用identify检查图片是否完整?(jpg/gif/png图片是否损坏)的更多相关文章
- Java使用URL类下载的图片不完整
问题 今天在使用URL类来下载网站中的图片的时候,出现了一个问题:下载的图片不完整,并且每次下载的图片大小也不是都相同,反正就是不完整. 问题代码如下: package cn.ganlixin.tes ...
- 【5】TensorFlow光速入门-图片分类完整代码
本文地址:https://www.cnblogs.com/tujia/p/13862364.html 系列文章: [0]TensorFlow光速入门-序 [1]TensorFlow光速入门-tenso ...
- 利用php获取图片完整Exif信息类 获取图片详细完整信息类
<?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...
- JS检查当图片不存在时显示默认图片和键盘大小写键状态
当图片不存在时显示默认图片 <script type="text/javascript"> var imgs = document.images; for(var i ...
- C# 图片的裁剪,两个图片合成一个图片
图片的裁剪,两个图片合成一个图片(这是从网上摘的) /// <summary> /// 图片裁剪,生成新图,保存在同一目录下,名字加_new,格式1.png 新图1_ne ...
- 从web编辑器 UEditor 中单独提取图片上传,包含多图片单图片上传以及在线涂鸦功能
UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码.(抄的...) UEditor是非常好用的富文 ...
- 在viewPager中双指缩放图片,双击缩放图片,单指拖拽图片
我们就把这个问题叫做图片查看器吧,它的主要功能有: (项目地址:https://github.com/TZHANHONG/ImageViewer/releases/tag/1.0,里面的MyImage ...
- 阿里云使用js 实现OSS图片上传、获取OSS图片列表、获取图片外网访问地址(读写权限私有、读写权限公共);
详情请参考:https://help.aliyun.com/document_detail/32069.html?spm=a2c4g.11186623.6.763.ZgC59a 或者https://h ...
- img只显示图片一部分 或 css设置背景图片只显示图片指定区域
17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左 ...
随机推荐
- Mybatis如何执行Select语句,你真的知道吗?
持续原创输出,点击上方蓝字关注我吧 作者:不才陈某 博客:https://chenjiabing666.github.io 前言 本篇文章是Myabtis源码分析的第三篇,前两篇分别介绍了Mybati ...
- Python3 学习笔记之 数据类型
- SpringCloud实战 | 第二篇:SpringCloud整合Nacos实现注册中心
前言 随着eureka的停止更新,如果同时实现注册中心和配置中心需要SpringCloud Eureka和SpringCloud Config两个组件;配置修改刷新时需要SpringCloud Bus ...
- 使用Java Stream,提取集合中的某一列/按条件过滤集合/求和/最大值/最小值/平均值
不得不说,使用Java Stream操作集合实在是太好用了,不过最近在观察生产环境错误日志时,发现偶尔会出现以下2个异常: java.lang.NullPointerException java.ut ...
- Spring boot中配置HikariCP连接池
# jdbc_config datasourcespring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasourc ...
- golang 协程学习
协程数据传递问题 func TestGoroutineData(t *testing.T) { var wg sync.WaitGroup wg.Add(1) i := 0 go func(j int ...
- RabbitMQ安装、集群搭建、概念解析
RabbitMQ安装.集群搭建.概念解析 基本概念 为什么会产生MQ 1.解耦:采用异步方式实现业务需求达到解耦的目的. 2.缓冲流量,削峰填谷: 问:为什么会有流量冲击? 答:采用"直接调 ...
- CSS3 新特性总结
1.边框 border-radius: 1-4 length|% / 1-4 length|%; 每个半径的四个值的顺序是:左上角,右上角,右下角,左下角.若省略左下角,和右上角相同,省略右下角,左上 ...
- XXE漏洞介绍 & XXE漏洞攻击 & 修复建议
介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...
- 神作!阿里首发并发编程神仙笔记,Github已星标92K
Qzone 微信 神作!阿里首发并发编程神仙笔记,Github已星标92K JAVA超神编程 2020-09-23 21:04:06 JVM 无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎 ...