Bash 脚本检查图像是否为动画 png (apng)

2023-12-15

试图在我的 bash 脚本中找出一种方法来检查文件是否是动画 PNG (apng) 文件。就我而言,如果是的话,我想忽略它。有任何想法吗 ?

更新: 下面使用 pngcheck 的答案允许我检查图像是否是动画。此外,我还会检查文件的大小,如果它“大”,我也会忽略它。最后,截至 2017 年 11 月,“识别”不起作用,这主要是我最初的问题。感谢马克的帮助。


动画 PNG 的特点是存在acTL(动画控制块),以及fcTL(帧控制块)-参见维基百科文章.

所以,我认为一个合适的测试是运行pngcheck使用详细选项,并至少查找acTL chunk:

pngcheck -v animated.png | grep -E "acTL|fcTL"

样本输出

  chunk acTL at offset 0x00025, length 8
  chunk fcTL at offset 0x00039, length 26
  chunk fcTL at offset 0x02f27, length 26
  chunk fcTL at offset 0x05901, length 26
  chunk fcTL at offset 0x083a2, length 26
  chunk fcTL at offset 0x0aea8, length 26
  chunk fcTL at offset 0x0d98c, length 26
  chunk fcTL at offset 0x10406, length 26
  chunk fcTL at offset 0x12e19, length 26
  chunk fcTL at offset 0x15985, length 26
  chunk fcTL at offset 0x185e2, length 26
  chunk fcTL at offset 0x1b2b0, length 26
  chunk fcTL at offset 0x1dfe1, length 26
  chunk fcTL at offset 0x20d24, length 26
  chunk fcTL at offset 0x23a03, length 26
  chunk fcTL at offset 0x26663, length 26
  chunk fcTL at offset 0x29218, length 26
  chunk fcTL at offset 0x2bcdf, length 26
  chunk fcTL at offset 0x2e7e0, length 26
  chunk fcTL at offset 0x312b0, length 26
  chunk fcTL at offset 0x33c51, length 26
  chunk fcTL at offset 0x36598, length 26
  chunk fcTL at offset 0x38f49, length 26
  chunk fcTL at offset 0x3b9bd, length 26
  chunk fcTL at offset 0x3e45e, length 26
  chunk fcTL at offset 0x40ed9, length 26
  chunk fcTL at offset 0x4393c, length 26
  chunk fcTL at offset 0x46521, length 26
  chunk fcTL at offset 0x4919b, length 26
  chunk fcTL at offset 0x4bde2, length 26
  chunk fcTL at offset 0x4eabd, length 26
  chunk fcTL at offset 0x51827, length 26
  chunk fcTL at offset 0x5453a, length 26
  chunk fcTL at offset 0x571c7, length 26
  chunk fcTL at offset 0x59d94, length 26

因此,这将建议在脚本中进行此测试:

# Test an animated image, `grep` exit status is zero meaning `acTL` was found
pngcheck -v animated.png | grep -q "acTL"
echo $?
0

# Test a still image, `grep` exit status is 1 meaning `acTL` was not found
pngcheck -v still.png | grep -q "acTL"
echo $?
1

如果您没有或不想发货pngcheck在你的项目中,我制作了一个 Perl 脚本,它只是对 PNG 文件进行分块并告诉你分块和偏移量,并且它应该在任何地方运行,因为它是 Perl。欢迎您使用它。

样品运行

./pngchunks ball.png

13 IHDR
8 acTL                   <--- This one means it is animated
26 fcTL
4634 IDAT
26 fcTL
4344 fdAT
26 fcTL
4042 fdAT
26 fcTL
3828 fdAT
26 fcTL
3521 fdAT
26 fcTL
3168 fdAT
26 fcTL
2777 fdAT
26 fcTL
2588 fdAT
26 fcTL
2720 fdAT
26 fcTL
2792 fdAT
26 fcTL
2665 fdAT
26 fcTL
2581 fdAT
26 fcTL
2652 fdAT
26 fcTL
2774 fdAT
26 fcTL
2844 fdAT
26 fcTL
2886 fdAT
26 fcTL
2966 fdAT
26 fcTL
3197 fdAT
26 fcTL
3518 fdAT
26 fcTL
3995 fdAT
0 IEND

#!/usr/bin/perl -w
################################################################################
# pngchunks
# Mark Setchell
#
# Simple Perl tool to read the chunks in a PNG image file
# See https://en.wikipedia.org/wiki/Portable_Network_Graphics
#
# Usage: pngchunks image.png
################################################################################
use strict;
use Fcntl qw( SEEK_CUR );

my $f=shift or die "Usage: pngchunks image.png\n";

my ($handle,$offset,$buffer,$type,$length);

# Open file
open($handle,'<',$f) || die("Error opening file\n");

# Check 8 byte PNG signature
read($handle,$buffer,8);
if(substr($buffer,0,8) ne "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"){
   die("ERROR: Invalid PNG signature\n");
}

# Loop till IEND chunk
for(;;){

   # Read 4 bytes of length, Network (big-endian)
   read($handle,$buffer,4);
   $length=unpack("N",$buffer);

   # Read 4 bytes of chunk type
   read($handle,$buffer,4);
   $type=substr($buffer,0,4);

   printf("%d %s\n",$length,$type);

   # Break out of loop if IEND chunk
   last if $type eq "IEND";

   # Seek past this chunk and its 4 byte CRC
   $offset=4+$length;
   seek($handle,$offset,SEEK_CUR);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 脚本检查图像是否为动画 png (apng) 的相关文章

  • 无法理解 shell 脚本内的 [-t 0]

    这个浏览器要点 https gist github com 318247by defunkt github 用户以此 shell 表达式开始 if t 0 then 这行代码的含义是什么 UPDATE 您还能解释一下为什么我在做其他事情之前
  • Linux Bash - 日期格式

    我的日期格式是 yyyy mm dd hh mm ss 如何检查我的输入 它应该是这样的 bin bash read p Date format yy mm dd HH MM SS input check date Y m d H M S
  • sed:替换文本块

    我有一堆文件 从一段代码开始 我试图用另一个代码块替换 Replace
  • Bash:使用参数扩展查找和替换

    我想更换输入法 find string include 圆进度 38px 30px 4eb630 和输出 输出字符串 include 圆进度 38px 30px using find string pattern replacement s
  • 具有此处文档重定向的 Makefile 配方

    有谁知道如何在菜谱上使用此处文档重定向 test sh lt
  • 为什么 bash for 循环出错?

    我正在尝试使用 for 循环运行以下代码 但出现语法错误 请帮忙 输入格式 输入的第一行包含一个整数N 表示整数的个数 下一行包含 N 个空格分隔的整数 它们构成数组 A read n sum 0 for i 1 i lt n i do r
  • 为什么 iTerm2 中不显示 git 颜色

    所以我有我的 gitconfig 设置来处理颜色 在终端中它工作得很好 看起来也不错 然而 在 iTerm2 中 除非我为 git 设置反向属性 否则我的 gitconfig 根本不会显示颜色 然后它们就出现了 但是谁喜欢相反的颜色呢 为什
  • 如何正确中断使用 matplotlib 创建的动画?

    我想正确地中断动画 背景 我有一个封装到 tkinter 实例中的 matplotlib 图 动画 我希望当用户按下 tkinter 按钮时 动画必须停止 删除并重新启动 我正在中断旧动画 通过使用del fig在回调函数 由按钮调用 的开
  • 移动除一个文件之外的所有文件

    如何移动除一个文件之外的所有文件 我正在寻找类似的东西 mv Linux Old Tux png Linux New 我将旧的东西移动到新的东西文件夹中 除了Tux png 符号代表否定 有一些工具可以完成这项工作吗 如果您使用 bash
  • CMake的execute_process和任意shell脚本

    CMake s execute processcommand 似乎只让你执行一个进程 而不是你可以输入命令 shell 的任意行 问题是 我想使用管道 文件描述符重定向等 但这似乎不可能 另一种选择对我来说会非常痛苦 我认为 我应该怎么办
  • 在詹金斯管道作业中将变量传递给bash脚本

    我有一个 Jenkins 管道作业 其中我使用名为 setup sh 的 bash 脚本配置我的环境 如下所示 bin bash export ARCH 1 echo architecture ARCH 在 Jenkins 管道脚本中 我使
  • 如何在每个 xargs 命令之间休眠 1 秒?

    例如 如果我执行 ps aux awk print 1 xargs I echo 我想让 shell 在每次之间休眠 1 秒echo 如何更改我的 shell 命令 您可以使用以下语法 ps aux awk print 1 xargs I
  • Emacs shell:保存提交消息

    我几天前开始使用 emacs 在 emacs shell M x shell 中使用 git 时遇到问题 当我 git commit 或 git commit amend 时 它会打开 vim 来编辑并保存提交消息 我对此表示同意 但我找不
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 没有jquery的动画,左右滑动

    我试图在显示 div 时将其向左滑动 在隐藏它时将其向右滑动 但我不想使用 jQuery 有没有一种方法可以在不使用javascript库的情况下制作简单的动画并支持IE7和IE8 这是我的显示 隐藏js function showHide
  • 如何在 shell 中解码 URL 编码的字符串?

    我有一个文件 其中包含已编码的用户代理列表 例如 Mozilla 2F5 0 20 28Macintosh 3B 20U 3B 20Intel 20Mac 20OS 20X 2010 6 3B 20en 我想要一个 shell 脚本 它可以
  • 寻找 shell 重定向交错行为的解释

    给定以下脚本 t sh bin bash if eq 0 then log if gt 0 then printf s n else cat fi tee a logged out else log if gt 0 then printf
  • 如何在shell脚本中运行R代码?

    我有一个 R 文件 myfile R 我想使用 shell 脚本来运行它 我怎样才能做到这一点 我试过这个 bin bash Rscript myfile R 但它给了我这个错误 Rscript 找不到命令 我也尝试过这个 bin bash
  • Shell脚本通过curl调用API并处理响应

    我需要创建一个通过curl 调用我的登录API 的shell 脚本 该脚本应该能够存储和处理来自curl api 调用的响应 myscript sh bin bash echo Extract bearer token from curl
  • 疯狂的 crond 行为。不断使 bash 进程失效

    我有一个看起来像这样的 crontab SHELL bin bash PATH sbin bin usr sbin usr bin MAILTO root HOME 0 59 var www html private fivemin zda

随机推荐

  • 如何使用 GNU GAS 或 LLVM 汇编 ARM SVE 指令并在 QEMU 上运行?

    我想玩新的ARM SVE指令使用开源工具 首先 我想组装一个最小的示例 https developer arm com docs dui0965 latest getting started with the sve compiler as
  • Tesseract + opencv 3.0 + windows,文本模块尺寸小,链接错误

    我两天前在answers opencv org 上发布了这篇文章 现在我也将其发布在这里 http answers opencv org question 68634 text contrib module and tesseract 大家
  • 将窗口对象存储在本地存储中

    我需要能够保留窗口对象 我尝试对窗口对象进行字符串化 但在尝试将窗口对象转换为 JSON 时收到错误 将循环结构转换为 JSON 错误 无论如何 我可以将 window open 中的窗口对象存储在本地存储中吗 var myWindow w
  • 将列附加到 pandas 数据框

    这可能很简单 但我有以下数据 在数据框 1 中 index dat1 0 9 1 5 在数据框 2 中 index dat2 0 7 1 6 我想要一个具有以下形式的数据框 index dat1 dat2 0 9 7 1 5 6 我尝试过使
  • 在 C++ 中创建稀疏数组的最佳方法是什么?

    我正在研究一个需要操作巨大矩阵的项目 特别是用于连接计算的金字塔求和 简而言之 我需要跟踪矩阵 多维数组 中大量零的相对少量的值 通常为 1 在极少数情况下超过 1 稀疏数组允许用户存储少量值 并假设所有未定义的记录都是预设值 由于物理上不
  • PHP 显示中文字符:SET NAMES 'utf8' 不起作用

    我正在尝试使用我拥有的数据库 但无法在其中显示中文字符 数据库实际上首先是一个 MS Access 文件 我用程序将其转换为 mysql 无论如何 很多行中都有中文字符 我无法让它们在任何浏览器中正确显示 否则我可以很好地显示汉字 如果我使
  • 配置旁遮普向 Openfire 发送 xmpp 请求

    我正在尝试将旁遮普连接管理器与 Openfire 一起使用 我已经有一个正在运行的 Openfire 服务器 我还安装了 punjab 并且服务器正常启动 允许我导航到本地主机上的端口 5280 虽然http localhost 5280
  • 将整数和文本字符串等数据从手机发送到网络数据库

    我有一个项目 我应该将整数 浮点数和文本字符串等数据从 Android 应用程序发送到 Web 数据库 但是我不知道如何做到这一点 有人可以解释一下吗 任何建议或帮助将不胜感激 您需要编写一些服务器端逻辑 通过POST或GET方法接受参数k
  • 使用角度2中的viewchild更新元素的innerhtml

    我有像这样的html元素 section class span title span span class value span section 我使用访问组件中的元素 ViewChild hiddenElement hiddenEleme
  • 在 ftp 服务器中不递归地列出文件、目录、子文件和子目录的想法

    我正在尝试生成 ftp 服务器中给定目录及其子目录的文件列表 服务器工作正常 我已经成功地生成了当前目录的文件列表 当我尝试列出子目录及其文件时 事情就变得复杂了 我被要求不要使用递归算法 所以我自己做了一些研究 我尝试过使用线程 对于找到
  • FutureTask 获取与运行,任务永远不会完成

    我正在学习 Callables 并决定制作一个非常简单的程序 问题是当我调用 getFutureTask 时线程被阻塞 Thread State TIMED WAITING 在对象监视器上 您能否告诉我为什么会这样以及为什么当我在 futu
  • 替换字符串中字符的实例

    这个简单地尝试用冒号替换分号 在特定位置 的简单代码不起作用 for i in range 0 len line if line i and i in rightindexarray line i 它给出了错误 line i TypeErr
  • 当“OrdinalBase”字段设置为 1 时,“kernel32.dll”如何导出序数 0?

    查看加载到内存中的 kernel32 dll 我看到以下导出序数表 gdb x 400hd eax 0x776334b0
  • 通过 shell 脚本拒绝 cat 的权限[重复]

    这个问题在这里已经有答案了 我在 bin rclone sync ACD log 中的日志文件上的 shell 脚本中运行 cat 时遇到问题 这是 shell 脚本中的行 RESULT cat LOGFILE tail 1 但是当运行脚本
  • 时区代码到时区信息

    在我们的 MS Dynamics CRM 项目中 我们创建了一个海量用户上传批次 该批处理从 Excel 文件读取并批量上传用户 该批次需要设置的内容之一是时区代码 在 Excel 文件中 时区将写为 UTC 1 CRM 使用的代码似乎是
  • 查找数组中最接近的值

    int array new int 5 5 7 8 15 20 int TargetNumber 13 对于目标数字 我想找到数组中最接近的数字 例如 当目标数字为 13 时 上面数组中最接近它的数字是 15 我如何在 C 中以编程方式实现
  • Linux打开设备时串口缓冲区不为空

    我有一个系统 我在串行端口上看到了我意想不到的奇怪行为 我以前曾在 USB 转串口适配器上偶尔看到过这种情况 但现在我也在本机串行端口上看到过这种情况 而且频率要高得多 该系统被设置为运行自动化测试 并且将首先执行一些任务 这些任务会导致在
  • 如何在ios模拟器中安装IPA?

    我建了一个 ipa使用后Xcode存档然后分发为ad hoc通常我会将其复制到真实的 ios 设备 但今天它失败了 说 安装失败 问题是使用 xcode gt 窗口 gt 设备和模拟器 不向我显示正在运行的模拟器 我有一个正在运行的 ios
  • 如何使用 eventBus 作为总线来将更新传递给 Vue 组件中的视图?

    监听组件 b 中总线的自定义事件 然而 在组件a中分派事件后 它访问组件b 执行了组件b的监听函数 但是msg数据功能未更新 请不要说Vuex 相关代码基于Vue CLi3 这里的代码 A组份
  • Bash 脚本检查图像是否为动画 png (apng)

    试图在我的 bash 脚本中找出一种方法来检查文件是否是动画 PNG apng 文件 就我而言 如果是的话 我想忽略它 有任何想法吗 更新 下面使用 pngcheck 的答案允许我检查图像是否是动画 此外 我还会检查文件的大小 如果它 大