挺方便的,希望再增加2个参数,一个是压缩率 o1-o3,二是删除帧:起始帧1-结束帧1,起始帧2-结束帧2,...
看了一下命令行, 真的好复杂 Read the gifsicle man page
压缩率
删除帧
gifsicle a.gif --delete "#0"
#num 选择帧数。(第一帧是 “#0”。负数从最后一帧向后计数,即 “#-1”) #num1-num2 选择帧 num1 到 num2。 #num1- 选择帧 num1 到最后一帧。 #name 选择名为“name”的帧。 “#”字符对于许多 shell 具有特殊含义,因此您通常 需要引用它。
这个命令可以输出帧数,还可以删除奇数偶数帧。
其实,对Gifsicle来说,压缩GIF主要的参数不是很多,你的动作已经做了压缩率(只不过没有选择,默认o3),图片缩放和颜色参数,其实加上删除帧,对于一般压缩处理基本就全了。
附翻译后的Gifsicle手册
gifsicle
操纵GIF图像和动画
简介
Gifsicle [选项, 帧, 文件名]...
说明
gifsicle是一个强大的命令行程序,用于创建、编辑、操作和获取GIF图像和动画的信息。
Gifsicle通常根据其命令行选项处理输入GIF文件,并将结果写入标准输出。
例如,-i选项告诉gifsicle交错输入:
gifsicle -i <pic.gif> interlaced-pic.gif
Gifsicle擅长创建和操纵GIF动画。默认情况下,它将两个或多个输入文件组合成“动画书”动画:
gifsicle pic1.gif pic2.gif pic3.gif > animation.gif
使用--delay、--loopcount和--optimize等选项来调整动画。
要就地修改GIF文件,请使用--batch选项。使用--batch,gifsicle将修改您指定的文件,而不是将新文件写入标准输出。
要交错当前目录中的所有GIF,可以输入:
Gifsicle --batch -i *.gif
概念索引
概念在左边,gifsicle相关选项在右边。
图像变换
命令行
gifsicle的命令行由GIF输入文件和选项组成。大多数选项以破折号(-)或加号(+)开头;帧选择,一种选项,以数字符号(#)开头。其他任何内容都是GIF输入文件。
gifsicle按顺序读取和处理GIF输入文件。如果没有提供GIF输入文件,或者您提供了特殊的文件名“-”,它将从标准输入中读取。
如果没有错误,gifsicle退出时状态为0,否则状态为1。
选项
每个选项都有一个长格式,“--长描述性名称”。您不需要键入整个长描述性名称,只要足以使其明确即可。
有些选项也有一个简短的形式“-X”。如果不接受参数,可以组合短选项:'-IIb'与'-I -I -b'相同。但是要小心那些带有参数的选项:“-cblah”是“-c blah”,而不是“-c-b-l-a-h”。
许多选项也有一个相反的“--no-option”,它会关闭选项。你可以通过输入“+X”来关闭做空选项“-X”。
模式选项
模式选项告诉gifficle要生成什么样的输出。最多可以有一个,并且它必须在任何GIF输入之前。
--merge, -m
将所有GIF输入组合成一个具有多个帧的文件,并将该文件写入标准输出。这是默认模式。
--batch, -b
通过读取和写入同一文件名来修改每个GIF输入。(从标准输入读取的GIF将写入标准输出。)
--explode, -e
为每个输入文件的每一帧创建一个输出GIF。输出GIF名为“xxx.000”、“xxx.001”等,其中“xxx”是输入文件的名称(或使用“--output”指定的任何名称),数字扩展名是帧号。
--explode-by-name, -E
与--explore相同,但将任何命名帧写入文件“xxx.name”而不是“xxx.frame number”。使用“--name”选项命名帧。
常规选项
常规选项控制信息礼品印刷品及其输出的位置。可以使用“--no-X”关闭信息选项和--verbose。
--info, -I
将每个输入GIF的可读描述打印到标准输出,或使用 -o 指定的任何文件。此选项抑制正常输出,并且不能与--batch等模式选项组合使用。然而,如果您给出两个--info或-I选项,则信息将打印为标准错误,正常输出照常进行。
--color-info, --cinfo
比如--info,但也可以打印有关输入文件颜色映射的信息。
--extension-info, --xinfo
像--info,但也可以以类似于hexdump(1)的格式打印任何无法识别的GIF扩展名。
--size-info, --sinfo
比如--info,但也可以打印有关压缩图像大小的信息。
--help, -h
打印使用信息并退出。
-o file
--output file
将输出发送到文件。特殊文件名“-”表示标准输出。
--verbose, -V
将进度信息(读取和写入的文件)打印为标准错误。
--no-warnings, -w
抑制所有警告消息。
--no-ignore-errors
遇到非常错误的GIF时,以状态1退出。默认情况是蒙混过关。
--version
打印版本号和一些简短的非保修信息并退出。
--careful
编写稍微大一点的GIF,以避免其他GIF实现中的错误。某些Java和Internet Explorer版本无法显示Gifsicle生成的正确的最小GIF。如果您对特定图像有问题,请使用--careful选项。
--conserve-memory
以处理时间为代价节省内存使用。如果您在没有太多内存的计算机上处理大型GIF,这可能很有用。或者输入--no-conserve-memory。
--nextfile
允许输入文件包含多个连接的GIF图像。如果文件名在命令行中出现多次,gifsicle每次都会从文件中读取一个新图像。此选项可以帮助脚本避免需要临时文件。例如,要创建具有不同延迟的三个帧的动画GIF,可以运行“gifsicle --nextfile -d10 - -d20 - -d30 - > out.GIF”并按顺序将三个GIF图像写入gifsicle标准输入。
--multifile
类似于--nextfile,但从每个文件中读取尽可能多的GIF图像。此选项适用于脚本。例如,要将未知数量的GIF图像合并到一个动画中,请运行“gifsicle --multifile - > out.gif”并按顺序将GIF图像写入gifsicle标准输入。任何帧选择仅适用于串联中的最后一个文件。
框架选择
帧选择告诉gifsicle要使用当前输入文件中的哪些帧。它们只对动画有用,因为非动画GIF只有一帧。以下是框架规范的可接受形式。
#num
选择帧编号。(第一帧为“#0”。负数从最后一帧开始向后计数,即“#-1”。)
#num1-num2
选择第num1帧到第num2帧。
#num1-
选择第num1帧到最后一帧。
#name
选择名为name的框架。
“#”字符对于许多外壳都有特殊含义,因此通常需要引用它。
例如
gifsicle happy.gif "#0"
使用happy.gif中的第一帧;
gifsicle happy.gif "#0-2"
使用其前三帧;和
gifsicle happy.gif "#-1-0"
以相反的顺序使用其帧(从帧#1开始,最后一帧)。
对选定帧执行的操作取决于当前模式。在合并模式下,只有选定的帧被合并到输出GIF中。在批处理模式下,仅修改选定的帧;其他帧保持不变。在分解模式中,只有选定的帧被分解为输出GIF。
框架更改选项
帧更改选项将新帧插入动画中,或替换或删除已存在的帧。例如,在动画中更改一个帧很难用帧选择来表达,但更改帧很容易。
--delete frames [frames...]
从输入GIF中删除帧。
--insert-before frame other-GIFs
在输入GIF的帧之前插入其他GIF。
--append other-GIFs
将其他GIF添加到输入GIF。
--replace frames other-GIFs
用其他GIF替换输入GIF中的帧。
--done
完成当前帧更改集。
帧参数是帧选择(见上文)。这些参数始终引用原始输入GIF中的帧。因此,如果“a.gif”有3帧而“b.gif”有一帧,则此命令
gifsicle a.gif --delete "#0" --replace "#2" b.gif
将生成2帧的输出动画:“a.gif”第1帧,然后是“b.gif”。
其他GIF参数是任意数量的GIF输入文件和帧选择。这些图像以合并模式合并并添加到输入GIF中。其他gif将持续到下一帧更改选项,因此此命令将“in.gif”的第一帧替换为“a.gif”和“b.gif”的合并:
gifsicle -b in.gif --replace "#0" a.gif b.gif
但是,此命令将“in.gif”的第一帧替换为“a.gif”,然后分别处理“b.gif”:
gifsicle -b in.gif --replace "#0" a.gif --done b.gif
警告:您不应在同一输入GIF上同时使用帧选择和帧更改。
图像选项
例如,图像选项通过更改隔行扫描、透明度和裁剪来修改输入图像。图像选项有三种形式:“--X”、“--no-X”和“--same-X”。“--X”表单为功能选择一个值,“--no-X”表单关闭功能,“--same-X”表单表示从每个输入复制功能的值。默认值始终为“--same-X”。例如,-background=“#0000FF”将背景颜色设置为蓝色,--no background将背景颜色关闭(通过将其设置为0),--same background使用输入图像的现有背景颜色。您可以多次给出每个选项;例如
gifsicle -b -O2 -i a.gif --same-interlace b.gif c.gif
将使'a.gif'交错,但仅当'b.gif'和'c.gif'已经交错时,才将它们保留为交错。
-B color
--background color
将输出GIF的背景设置为彩色。参数的形式可以与下面的--transparent选项相同。
--crop x1,y1-x2,y2
--crop x1,y1+widthxheight
将以下输入帧裁剪为较小的矩形区域。此矩形的左上角为(x1,y1);可以给出右下角(x2,y2)或矩形的宽度和高度。在x1,y1+widthxheight形式中,宽度和高度可以为零或负。零维表示裁剪区域到达图像边缘;负维度使许多像素从图像边缘返回的裁剪区域。例如,--crop 2,2+-2x-2将从输入图像的每一侧减去2个像素。裁剪发生在任何旋转、翻转、调整大小或定位之前。
--crop-transparency
裁剪以下输入帧的任何透明边框。由于--crop选项,在任何裁剪之后都会发生这种情况。它处理原始输入图像;例如,尚未应用任何透明度选项。
--flip-horizontal
--flip-vertical
水平或垂直翻转以下框架。
-i
--interlace
启用隔行扫描。
-S widthxheight
--logical-screen widthxheight
将输出逻辑屏幕设置为widthxheight。--no-logical-screen将输出逻辑屏幕设置为最大输出帧的大小,而--same-logical-screen将输出逻辑屏设置为最大输入逻辑屏。--screen是--logic screen的同义词。
-p x,y
--position x,y
将以下帧的位置设置为(x,y)--无位置表示--位置0,0。通常,--位置x,y将每个后续帧精确地放置在x,y处。但是,如果输入了整个动画,x,y将被视为动画的位置。
--rotate-90
--rotate-180
--rotate-270
将以下帧旋转90、180或270度--无旋转将关闭任何旋转。
-t color
--transparent color
在以下帧中使颜色透明。颜色可以是颜色映射索引(0-255)、十六进制颜色规范(如“#FF00FF”代表品红色),或斜线或逗号分隔的红色、绿色和蓝色值(每个值介于0和255之间)。
扩展选项
扩展选项将非可视信息添加到输出GIF。这包括名称、注释和通用扩展。
--app-extension app-name extension
将名为app-name的应用程序扩展名和值扩展名添加到输出GIF--没有应用程序扩展会从输入图像中删除应用程序扩展。
-c text
--comment text
将注释、文本添加到输出GIF。注释将放置在流中的下一帧之前。--no-comments从输入图像中删除注释。
--extension number extension
向输出GIF添加扩展名编号和值扩展名。数字可以是十进制、八进制、十六进制,也可以是单个字符,如“n”,使用其ASCII值。--no-extensions(或+x)从输入图像中删除扩展。
-n text
--name text
将下一帧的名称设置为文本。此名称作为扩展名存储在输出GIF中(扩展名0xCE,后跟帧名的字符)。--no-names会从输入图像中删除名称扩展名。
动画选项
动画选项适用于GIF动画或GIF动画中的单个帧。与图像选项一样,大多数动画选项有三种形式,“--X”、“--no-X”和“--same-X”,您可以多次提供动画选项;例如
gifsicle -b a.gif -d50 "#0" "#1" -d100 "#2" "#3"
将帧0和1的延迟设置为50,将帧2和3的延迟设置成100。
-d time
--delay time
将帧之间的延迟设置为以百分之一秒为单位的时间。
-D method
--disposal method
将以下帧的处理方法设置为方法。帧的处理方法决定了当需要显示下一帧时,观众应该如何移除该帧。方法可以是一个介于0和7之间的数字(尽管通常只有0到3才有意义),也可以是以下名称之一:none(使框架可见以供将来的框架构建)、asis(与“none”相同)、background(或bg)(用背景替换框架)或previous(用上一个显示的框架中的区域替换框架)。--no-disposal意味着--disposal=无。
-l[count]
--loopcount[=count]
将Netscape循环扩展名设置为count。计数是一个整数,或者永远循环。如果提供--loopcount选项而不指定count,Gifsicle将永远使用--no loopcount(默认值)关闭循环。
将循环计数设置为比希望动画运行的次数少一次。没有循环计数的动画将显示每一帧一次--loopcount=1将循环一次,因此每帧显示两次;等等请注意,--loopcount=0相当于--loopccount=forever,而不是--no loopcount。
-O[level]
--optimize[=level]
尝试缩小GIF动画的文件大小。级别决定了优化的程度;更高的水平需要更长的时间,但可能会有更好的结果。目前有三个级别:
-O1
仅存储每个图像的更改部分。这是默认设置。
-O2
仅存储每个图像的更改部分,并使用透明度。
-O3
尝试几种优化方法(通常速度较慢,有时效果更好)。
其他优化标志提供更精细的控制。
-Okeep-empty
保留空的透明帧(默认情况下会将其删除)。
您可能还对缩小GIF的其他选项感兴趣,例如-k、--lossive和--no-extensions。请注意,-O不能保证缩小文件大小,在极少数情况下,甚至-O3也可能会放大文件大小。
-U
--unoptimize
将GIF动画优化为易于编辑的格式。
GIF动画通常被优化(参见--optimize),以使其更小、加载更快,不幸的是,这使其难以编辑。--unoptimize将优化的输入GIF更改为未优化的GIF,其中每一帧都是用户在动画中该点所看到内容的忠实表示。
图像转换选项
图像转换选项适用于读取或写入的整个GIF。可以使用“--no option”关闭它们。
--resize widthxheight
将输出GIF调整为给定的宽度和高度。如果宽度或高度是下划线“_”,则选择该尺寸以使纵横比保持不变。调整大小发生在所有输入帧被合并之后和优化之前。调整大小使用逻辑屏幕尺寸;如果输入流有一个不寻常的逻辑屏幕(许多GIF显示器忽略逻辑屏幕),您可能需要提供--no-logical-screen(或+S)来重置它,因此gifsicle使用图像尺寸。另请参见--resize-method。
--resize-width width
--resize-height height
调整到给定的宽度或高度,保持纵横比。相当于--resize widthx_或--resize _xheight。
--resize-fit widthxheight
--resize-touch widthxheight
调整输出GIF的大小,使其适合宽x高的矩形。纵横比保持不变。--resize fit选项仅收缩图像,如果GIF已经适合矩形,则不执行调整大小。宽度或高度都可以是下划线“_”,这将使该维度不受约束。
--resize-fit-width width
--resize-fit-height height
--resize-touch-width width
--resize-touch-height height
类似于--resize-fit和--resize-touch,但仅限制一个维度。
--scale Xfactor[xYfactor]
按Xfactor和Yfactor缩放输出GIF的宽度和高度。如果未给定Yfactor,则默认为Xfactor。缩放发生在所有输入帧被组合之后和优化之前。
--resize-method method
设置用于调整图像大小的方法。“采样”方法运行速度很快,但当缩小图像时,会产生噪声结果。“混合”方法稍微慢一些,但会产生更好的结果。默认方法当前为“mix”。
细节:缩小图像时,调整大小的方法差异最大。“sample”方法是一个点采样器:输出图像中的每个像素位置正好映射到输入中的一个像素位置。收缩时,输入中的完整行和列将被删除。其他方法使用所有输入像素,这通常会产生更好看的图像。“盒子”方法是一种盒子采样器,它比更复杂的过滤器更快,产生的结果也更清晰,但当在一个维度上缩小少量图像时会出现异常。(一些输出像素将恰好对应于1个输入行或列,而另一些输出像素则恰好对应于2个输入行和列。)“mix”方法是一个完全双线性插值器。这会比较慢,产生一些模糊的结果,但避免了异常。
Gifsicle还支持更复杂的重采样器,包括Catmull-Rom立方重采样(“catrom”)、Mitchell Netravali滤波器(“Mitchell”)、2瓣Lanczos滤波器(“lanczos2”)和3瓣lanczos3滤波器(“Lanczos 3”)。这些过滤器仍然较慢,但可以提供更清晰、更好的结果。
--resize-colors n
允许Gifsicle在调整图像大小时添加中间颜色。通常,Gifsicle的调整大小算法使用输入图像的调色板而不进行更改。当缩小颜色非常少的图像(例如,纯黑白图像)时,添加中间颜色可以改善结果。示例:--resize colors 64允许Gifsicle为输入颜色少于64的图像添加中间颜色。
颜色选项
颜色选项适用于读取或写入的整个GIF。可以使用“--no option”关闭它们。
-k num
--colors num
将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2和256之间。这可用于缩小输出GIF或消除任何局部颜色表。
通常,从现有颜色表中选择一组自适应颜色。您可以使用--color-method选项或使用--use colormap。提供自己的colormap来影响此过程。如果图像中有透明度,Gifsicle可能需要添加额外的颜色(使num+1)。
--color-method method
确定如何选择较小的颜色贴图diversity是xv(1)的分集算法,它使用现有颜色的严格子集,通常会产生良好的结果“混合多样性”是对这一点的修改:一些颜色值是从现有颜色组混合而来的中值切割”是Heckbert描述的中值切割算法。--method是--color-method的同义词。
-f
--dither[=method]
当--dither处于启用状态且颜色贴图发生更改时,将使用颜色组合来近似缺失的颜色。这看起来更好,但会生成更大的文件,并可能导致动画瑕疵,因此默认情况下禁用。
使用可选的方法参数指定抖动算法。默认值“floyd-steinberg”,使用Floyd-Steinberg误差扩散。这通常看起来最好,但可能会导致动画瑕疵,因为抖动选择会因帧而异。Gifsicle还支持避免动画瑕疵的有序抖动算法。“ro64”模式使用大的随机外观模式,通常会产生良好的结果。“o3”、“o4”和“o8”模式使用更小、更规则的模式。“有序”模式选择良好的有序抖动算法。要获得特殊效果,请尝试半色调模式“半色调”、“方形半色调”和“对角线”。某些模式使用逗号接受可选参数。半色调模式采用单元大小和颜色限制:“半色调,10,3”创建10像素宽的半色调单元,每个单元最多使用3种颜色。
--gamma gamma
将gamma校正设置为gamma,它可以是实数或“srgb”。粗略地说,较高的数字会夸大阴影,较低的数字会渲染高光。默认值是标准sRGB颜色空间定义的函数,通常工作正常。(其效果类似于--gamma=2.2。)Gifsicle在选择调色板(--colors)和抖动(--dither)时使用gamma校正。
--lossy[=lossiness]
改变图像颜色以减少输出文件的大小,但会产生伪影和噪声。损耗决定允许多少工件;值越大,文件大小越小,但会产生更多的伪影。默认损失为20。
--change-color color1 color2
将以下输入GIF中的color1更改为color2。(颜色参数的形式与-t选项中的相同。)通过多次指定选项来更改多种颜色。颜色变化不会相互干扰,因此您可以使用“--change-color color1 color2 --change-color color2 color1”安全地交换两种颜色。它们都在输入GIF被读取时生效。--no-change-color取消所有颜色变化。
--transform-colormap command
命令应该是从标准输入读取并写入标准输出的shell命令。输出GIF中的每个颜色映射都被转换为文本颜色映射格式(请参见下面的--use colormap),并通过管道发送到命令。命令生成的输出(也应为文本颜色映射格式)将替换输入颜色映射。替换不考虑颜色匹配,因此在输入中使用颜色槽n的像素在输出中仍然使用颜色槽n。
--use-colormap colormap
更改图像以使用颜色映射。图像中的每个像素都会更改为颜色映射中最接近的匹配(或者,如果启用了--dither,则更改为颜色贴图中颜色的抖动组合)。彩色地图可用于216色“web安全调色板”的web;灰度为灰色;bw表示黑白;或文件名。该文件应该是文本文件(格式如下所述)或GIF文件,将使用其全局颜色映射。如果同时给定--colors=N,则将使用颜色映射的N大小子集。
文本颜色映射文件使用以下格式:
; 每个非注释行代表一种颜色,“红-绿-蓝”
; 每个组件应介于0和255之间
0 0 0 ; 这样地
255 255 255
; 或使用web十六进制表示法
#ffffff ;这样地
示例
首先,让我们创建一个动画“anim.gif”:
gifsicle a.gif b.gif c.gif d.gif > anim.gif
该动画将非常快速地移动:由于我们没有指定延迟,浏览器将尽可能快地循环播放帧。让我们使用--delay选项减慢速度并在帧之间暂停0.5秒。
gifsicle --delay 50 a.gif b.gif c.gif d.gif > anim.gif
如果我们还希望GIF循环三次,我们可以使用--loopcount:
gifsicle -d 50 --loop=3 a.gif b.gif c.gif d.gif > anim.gif
(我们没有再次键入--delay,而是使用了它的缩写形式-d。许多选项都有缩写形式;您可以通过运行“gifsicle --help”来查看它们。我们还将--loopcount缩写为--loop,这是可以的,因为没有其他选项以“loop”开头。)
要将“anim.gif”分解为其组件帧,请执行以下操作:
gifsicle --explode anim.gif
ls anim.gif*
anim.gif anim.gif.000 anim.gif.001 anim.gif.002 anim.gif.003
要优化“anim.gif”:
gifsicle -b -O2 anim.gif
要将“anim.gif”的第二帧更改为“x.gif”,请执行以下操作:
gifsicle -b --unoptimize -O2 anim.gif --replace "#1" x.gif
由于“anim.gif”在最后一步中进行了优化,因此使用了--unoptimize。在--unoptimize的情况下,在优化的GIF中编辑单个帧是危险的;更改后的帧之后的帧可能会因更改而损坏。当然,这可能是你想要的。
注意--unoptimize和--optimize可以同时启用。--unoptimize会影响输入GIF文件,而--optimize会影响输出GIF文件。
要打印有关“anim.gif”的第一帧和第四帧的信息,请执行以下操作:
gifsicle -I "#0" "#3" < anim.gif
要使当前目录中所有GIF的透明颜色为黑色,并打印每个GIF的信息:
gifsicle -bII --trans "#000000" *.gif
给予-I两次会强制正常输出。如果只有一个-I,GIF将不会被修改。
要将“anim.gif”更改为使用Web安全调色板的64色子集,请执行以下操作:
gifsicle -b --colors=64 --use-col=web anim.gif
要制作“anim.gif”的抖动黑白版本,请执行以下操作:
gifsicle --dither --use-col=bw anim.gif > anim-bw.gif
要将一个GIF叠加在另一个GIF上,生成一个看起来像两个输入叠加的单帧输出GIF,请使用gifsicle两次:
gifsicle bottom.gif top.gif | gifsicle -U "#1" > result.gif
好的,我有时间好好重构一下动作。