希望进一步优化参数

功能建议 · 333 次浏览
臭冬瓜 创建于 2023-03-16 09:28

挺方便的,希望再增加2个参数,一个是压缩率 o1-o3,二是删除帧:起始帧1-结束帧1,起始帧2-结束帧2,...


回复内容
紫cm煞 2023-03-17 12:17
#1

好的,我有时间好好重构一下动作。

臭冬瓜 2023-03-17 09:50
#2

其实,对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选项。使用--batchgifsicle将修改您指定的文件,而不是将新文件写入标准输出。

要交错当前目录中的所有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实现中的错误。某些JavaInternet 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

将以下输入帧裁剪为较小的矩形区域。此矩形的左上角为(x1y1);可以给出右下角(x2y2)或矩形的宽度和高度。在x1y1+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

将以下帧的位置设置为(xy--无位置表示--位置0,0。通常,--位置xy将每个后续帧精确地放置在xy处。但是,如果输入了整个动画,xy将被视为动画的位置。

 

--rotate-90

--rotate-180

--rotate-270

将以下帧旋转90180270--无旋转将关闭任何旋转。

 

-t color

--transparent color

在以下帧中使颜色透明。颜色可以是颜色映射索引(0-255)、十六进制颜色规范(如“#FF00FF”代表品红色),或斜线或逗号分隔的红色、绿色和蓝色值(每个值介于0255之间)。

 

扩展选项

扩展选项将非可视信息添加到输出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"

将帧01的延迟设置为50,将帧23的延迟设置成100

 

-d time

--delay time

将帧之间的延迟设置为以百分之一秒为单位的时间。

 

-D method

--disposal method

将以下帧的处理方法设置为方法。帧的处理方法决定了当需要显示下一帧时,观众应该如何移除该帧。方法可以是一个介于07之间的数字(尽管通常只有03才有意义),也可以是以下名称之一:none(使框架可见以供将来的框架构建)、asis(与“none”相同)、background(或bg)(用背景替换框架)或previous(用上一个显示的框架中的区域替换框架)。--no-disposal意味着--disposal=无。

 

-l[count]

--loopcount[=count]

Netscape循环扩展名设置为count。计数是一个整数,或者永远循环。如果提供--loopcount选项而不指定countGifsicle将永远使用--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]

XfactorYfactor缩放输出GIF的宽度和高度。如果未给定Yfactor,则默认为Xfactor。缩放发生在所有输入帧被组合之后和优化之前。

 

--resize-method method

设置用于调整图像大小的方法。采样方法运行速度很快,但当缩小图像时,会产生噪声结果。混合方法稍微慢一些,但会产生更好的结果。默认方法当前为“mix”

细节:缩小图像时,调整大小的方法差异最大。“sample”方法是一个点采样器:输出图像中的每个像素位置正好映射到输入中的一个像素位置。收缩时,输入中的完整行和列将被删除。其他方法使用所有输入像素,这通常会产生更好看的图像。盒子方法是一种盒子采样器,它比更复杂的过滤器更快,产生的结果也更清晰,但当在一个维度上缩小少量图像时会出现异常。(一些输出像素将恰好对应于1个输入行或列,而另一些输出像素则恰好对应于2个输入行和列。)“mix”方法是一个完全双线性插值器。这会比较慢,产生一些模糊的结果,但避免了异常。

Gifsicle还支持更复杂的重采样器,包括Catmull-Rom立方重采样(“catrom”)、Mitchell Netravali滤波器(“Mitchell”)、2Lanczos滤波器(“lanczos2”)和3lanczos3滤波器(“Lanczos 3”)。这些过滤器仍然较慢,但可以提供更清晰、更好的结果。

 

--resize-colors n

允许Gifsicle在调整图像大小时添加中间颜色。通常,Gifsicle的调整大小算法使用输入图像的调色板而不进行更改。当缩小颜色非常少的图像(例如,纯黑白图像)时,添加中间颜色可以改善结果。示例:--resize colors 64允许Gifsicle为输入颜色少于64的图像添加中间颜色。

 

颜色选项

颜色选项适用于读取或写入的整个GIF。可以使用“--no option”关闭它们。

 

-k num

--colors num

将每个输出GIF中不同颜色的数量减少到num或更少。数字必须介于2256之间。这可用于缩小输出GIF或消除任何局部颜色表。

通常,从现有颜色表中选择一组自适应颜色。您可以使用--color-method选项或使用--use colormap。提供自己的colormap来影响此过程。如果图像中有透明度,Gifsicle可能需要添加额外的颜色(使num+1)。

 

--color-method method

确定如何选择较小的颜色贴图diversityxv1)的分集算法,它使用现有颜色的严格子集,通常会产生良好的结果混合多样性是对这一点的修改:一些颜色值是从现有颜色组混合而来的中值切割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大小子集。

 

文本颜色映射文件使用以下格式:

; 每个非注释行代表一种颜色,-绿-

; 每个组件应介于0255之间

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两次会强制正常输出。如果只有一个-IGIF将不会被修改。

 

要将“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

臭冬瓜 最后更新于 2023-03-17 09:55
紫cm煞 2023-03-16 22:54
#3

这个命令可以输出帧数,还可以删除奇数偶数帧。

紫cm煞 2023-03-16 22:46
#4

看了一下命令行, 真的好复杂  Read the gifsicle man page

压缩率 

-O[级别]
尝试缩小 GIF 动画的文件大小。级别决定了完成多少优化;更高的水平需要更长的时间,但 可能会有更好的结果。目前有三个级别:

-O1
仅存储每个图像的更改部分。这是默认值。
-O2
仅存储每个图像的更改部分,并使用透明度。
-O3
尝试几种优化方法(通常较慢,有时结果更好)。

删除帧

gifsicle a.gif --delete "#0"
#num
选择帧数。(第一帧是 “#0”。负数从最后一帧向后计数,即 “#-1”)
#num1-num2
选择帧 num1 到 num2。
#num1-
选择帧 num1 到最后一帧。
#name
选择名为“name”的帧。
“#”字符对于许多 shell 具有特殊含义,因此您通常 需要引用它。

回复主贴