GIFSICLE(1)
π okay bestie, letβs talk gifsicle(1) π
This is from the General Commands Manual, and itβs literally your guide to making GIFs behave. π
π NAME π
gifsicle β manipulates GIF images and animations
πΈ SYNOPSIS πΈ
gifsicle [options, frames, and filenames]...
β¨ DESCRIPTION β¨
gifsicle creates, edits, manipulates, and prints information about GIF images and animations. No cap, itβs giving main-character GIF tool energy. π¦
gifsicle normally processes input GIF files according to its command line options and writes the result to the standard output. The -i option, for example, tells gifsicle to interlace its inputs:
gifsicle -i < pic.gif > interlaced-pic.gif
By default, gifsicle combines two or more input files into a βflipbookβ animation:
gifsicle pic1.gif pic2.gif pic3.gif > animation.gif
Use options like --delay, --loopcount, and --optimize to tune your animations. π₯
To modify GIF files in place, use the --batch option. With --batch, gifsicle will modify the files you specify instead of writing a new file to the standard output. To interlace all the GIFs in the current directory, you could say:
gifsicle --batch -i *.gif
New users may want to skip to the Examples section at the end. π
π CONCEPT INDEX π
Concepts are on the left, relevant gifsicle options are on the right.
- Animations, changing β frame selections, frame changes, etc.
- disposal β
--disposal - looping β
--loopcount - portions of β frame selections
- smaller β
--optimize,--colors,--lossy - speed β
--delay
- disposal β
- Bad output β
--careful - Background color β
--background - Colors, changing β
--change-color,--use-colormap,--dither,--transform-colormap- reducing number β
--colors,--dither,--gamma
- reducing number β
- Comments β
--comment - Extensions β
--extension,--app-extension,--extension-info - File size β
--optimize,--unoptimize,--colors,--lossy - Image transformations
- cropping β
--crop,--crop-transparency - flipping β
--flip-* - resizing β
--resize,--scale - rotating β
--rotate-*
- cropping β
- Grayscale β
--use-colormap - Interlacing β
--interlace - Positioning frames β
--position - Screen, logical β
--logical-screen - Selecting frames β frame selections (like
#0) - Transparency β
--transparent - Warnings β
--no-warnings
π§ COMMAND LINE π§
gifsicleβs command line consists of GIF input files and options. Most options start with a dash (-) or plus (+); frame selections, a kind of option, start with a number sign (#). Anything else is a GIF input file. Periodt.
gifsicle reads and processes GIF input files in order. If no GIF input file is given, or you give the special filename -, it reads from the standard input.
gifsicle exits with status 0 if there were no errors and status 1 otherwise.
π OPTIONS π
Every option has a long form, --long-descriptive-name. You donβt need to type the whole long descriptive name, just enough to make it unambiguous.
Some options also have a short form, -X. You can combine short options if they donβt take arguments: -IIb is the same as -I -I -b. But be careful with options that do take arguments: -cblah means -c blah, not -c -b -l -a -h.
Many options also have a converse, --no-option, which turns off the option. You can turn off a short option -X by saying +X instead.
π¦ Mode Options π¦
Mode options tell gifsicle what kind of output to generate. There can be at most one, and it must precede any GIF inputs.
--merge,-mβ Combine all GIF inputs into one file with multiple frames and write that file to the standard output. This is the default mode.--batch,-bβ Modify each GIF input in place by reading and writing to the same filename. (GIFs read from the standard input are written to the standard output.)--explode,-eβ Create an output GIF for each frame of each input file. The output GIFs are namedxxx.000,xxx.001, and so on, wherexxxis the name of the input file (or whatever you specified with--output) and the numeric extension is the frame number.--explode-by-name,-Eβ Same as--explode, but write any named frames to filesxxx.nameinstead ofxxx.frame-number. Frames are named using the--nameoption.
π General Options π
General options control the information gifsicle prints and where it writes its output. The info options and --verbose can be turned off with --no-X.
--info,-Iβ Print a human-readable description of each input GIF to the standard output, or whatever file you specify with-o. This option suppresses normal output, and cannot be combined with mode options like--batch. If you give two--infoor-Ioptions, however, information is printed to standard error, and normal output takes place as usual.--color-info,--cinfoβ Like--info, but also print information about input filesβ colormaps.--extension-info,--xinfoβ Like--info, but also print any unrecognized GIF extensions in ahexdump(1)-like format.--size-info,--sinfoβ Like--info, but also print information about compressed image sizes.--help,-hβ Print usage information and exit.-o file,--output fileβ Send output tofile. The special filename-means the standard output.--verbose,-Vβ Print progress information (files read and written) to standard error.--no-warnings,-wβ Suppress all warning messages.--no-ignore-errorsβ Exit with status1when encountering a very erroneous GIF. Default is to muddle on.--max-screen widthxheightβ Refuse to create logical screens larger thanwidthxheight. The default is16384x16384;--no-max-screenremoves the limit. A GIFβs logical screen grows to fit its first frame, so a small or corrupt GIF can call for an enormous screen, and some operations, such as--optimizeand--unoptimize, allocate memory in proportion to the screen. When an outputβs logical screen would exceed the limit,gifsiclereports an error and doesnβt write that output; it also wonβt unoptimize such an input. The limit doesnβt apply to an explicit--logical-screensize or to resize options, but it does apply to frames that extend beyond an explicit logical screen.--versionβ Print the version number and some short non-warranty information and exit.--carefulβ Write slightly larger GIFs that avoid bugs in some other GIF implementations. Some Java and Internet Explorer versions cannot display the correct, minimal GIFs that Gifsicle produces. Use the--carefuloption if you are having problems with a particular image.--conserve-memoryβ Conserve memory usage at the expense of processing time. This may be useful if you are processing large GIFs on a computer without very much memory. Or say--no-conserve-memory.--nextfileβ Allow input files to contain multiple concatenated GIF images. If a filename appears multiple times on the command line,gifsiclewill read a new image from the file each time. This option can help scripts avoid the need for temporary files. For example, to create an animated GIF with three frames with different delays, you might run"gifsicle --nextfile -d10 - -d20 - -d30 - > out.gif"and write the three GIF images, in sequence, togifsicleβs standard input.--multifileβ Like--nextfile, but read as many GIF images as possible from each file. This option is intended for scripts. For example, to merge an unknown number of GIF images into a single animation, run"gifsicle --multifile - > out.gif"and write the GIF images, in sequence, togifsicleβs standard input. Any frame selections apply only to the last file in the concatenation.
π Frame Selections π
A frame selection tells gifsicle which frames to use from the current input file. They are useful only for animations, as non-animated GIFs only have one frame. Here are the acceptable forms for frame specifications.
#numβ Select framenum. (The first frame is#0. Negative numbers count backwards from the last frame, which is#-1.)#num1-num2β Select framesnum1throughnum2.#num1-β Select framesnum1through the last frame.#nameβ Select the frame namedname.
The # character has special meaning for many shells, so you generally need to quote it.
For example,
gifsicle happy.gif "#0"
uses the first frame from happy.gif;
gifsicle happy.gif "#0-2"
uses its first three frames; and
gifsicle happy.gif "#-1-0"
uses its frames in reverse order (starting from frame #-1 -- the last frame -- and ending at frame #0 -- the first).
The action performed with the selected frames depends on the current mode. In merge mode, only the selected frames are merged into the output GIF. In batch mode, only the selected frames are modified; other frames remain unchanged. In explode mode, only the selected frames are exploded into output GIFs.
π«Ά Frame Change Options π«Ά
Frame change options insert new frames into an animation or replace or delete frames that already exist. Some things -- for example, changing one frame in an animation -- are difficult to express with frame selections, but easy with frame changes.
--delete frames [frames...]β Delete frames from the input GIF.--insert-before frame other-GIFsβ Insertother-GIFsbeforeframein the input GIF.--append other-GIFsβ Appendother-GIFsto the input GIF.--replace frames other-GIFsβ Replaceframesfrom the input GIF withother-GIFs.--doneβ Complete the current set of frame changes.
The frames arguments are frame selections (see above). These arguments always refer to frames from the original input GIF. So, if a.gif has 3 frames and b.gif has one, this command
gifsicle a.gif --delete "#0" --replace "#2" b.gif
will produce an output animation with 2 frames: a.gif frame 1, then b.gif.
The other-GIFs arguments are any number of GIF input files and frame selections. These images are combined in merge mode and added to the input GIF. The other-GIFs last until the next frame change option, so this command replaces the first frame of in.gif with the merge of a.gif and b.gif:
gifsicle -b in.gif --replace "#0" a.gif b.gif
Lowkey the frame-change stuff gets spicy when you mix it with other frames, so watch out π β this version of the command replaces the first frame of in.gif with a.gif and then handles b.gif all by itself:
gifsicle -b in.gif --replace "#0" a.gif --done b.gif
β οΈ Warning: bestie, do not use both frame selections and frame changes on the same input GIF. It's giving chaos and you will not have a good time π
πΈ Image Options πΈ
Okay so image options are the ones that reach into your input images and change them up directly β interlacing, transparency, cropping, the whole glow-up π . And here's the vibe: image options come in three flavours:
--Xβ actually sets a value for the feature--no-Xβ turns the feature all the way off--same-Xβ copies the feature's value from each individual input
The default is always --same-X. Periodt β¨
So like, --background="#0000FF" sets the background color to blue, --no-background turns the background color off (by setting it to 0), and --same-background uses whatever background colors your input images already had. You can also stack these multiple times! For example:
gifsicle -b -O2 -i a.gif --same-interlace b.gif c.gif
will make a.gif interlaced, but leave b.gif and c.gif interlaced only if they already were π
-Bcolor,--backgroundcolor β sets the output GIF's background to color. The argument can have the same forms as in the--transparentoption down below π--cropx1,y1-x2,y2,--cropx1,y1+widthxheight β crops the following input frames down to a smaller rectangle. The top-left corner of that rectangle is (x1,y1); you can give either the lower-right corner, (x2,y2), or the width and height of the rectangle. In the x1,y1+widthxheight form, width and height can be zero or negative π«£. A zero dimension means the cropping area goes all the way to the edge of the image; a negative dimension pulls the cropping area that many pixels back from the image edge. So--crop 2,2+-2x-2will shave 2 pixels off each side of the input image β iconic little trim βοΈ. Cropping happens before any rotation, flipping, resizing, or positioning.--crop-transparencyβ crops any transparent borders off the following input frames. This happens after any cropping caused by the--cropoption. And heads up: it works on the raw input images β meaning any transparency options have not yet been applied.--flip-horizontal,--flip-verticalβ flips the following frames horizontally or vertically π¦-i,--interlaceβ turns interlacing on β¨-Swidthxheight,--logical-screenwidthxheight β sets the output logical screen to widthxheight.--no-logical-screensets the output logical screen large enough to include all output frames, while--same-logical-screensets it large enough to include all input logical screens. Also--screenis a synonym for--logical-screenπ«-px,y,--positionx,y β sets the following frames' positions to (x,y).--no-positionmeans--position 0,0. Normally--position x,yplaces every succeeding frame exactly at x,y. BUT β if a whole entire animation is input, x,y is treated as the position for the animation as a whole π--rotate-90,--rotate-180,--rotate-270β rotates the following frames by 90, 180, or 270 degrees.--no-rotateturns off any rotation π-tcolor,--transparentcolor β makes color transparent in the following frames. Color can be a colormap index (0-255), a hexadecimal color specification (like"#FF00FF"for magenta π), or slash- or comma-separated red, green and blue values (each between0and255).
π Extension Options π
Extension options are the ones that add non-visual info to your output GIF β names, comments, and generic extensions. Basically the little metadata besties that nobody sees but they're still there π«Ά
--app-extensionapp-name extension β adds an application extension named app-name with the value extension to the output GIF.--no-app-extensionsremoves application extensions from the input images.-ctext,--commenttext β adds a comment, text, to the output GIF. The comment gets placed before the next frame in the stream.--no-commentsremoves comments from the input images π¬--extensionnumber extension β adds an extension numbered number with the value extension to the output GIF. Number can be decimal, octal, hex, or it can be a single character like'n', whose ASCII value gets used.--no-extensions(or+x) removes extensions from the input images.-ntext,--nametext β sets the next frame's name to text. This name is stored as an extension in the output GIF (extension number0xCE, followed by the characters of the frame name).--no-namesremoves name extensions from the input images π·οΈ
π₯ Animation Options π₯
Animation options apply to GIF animations, or to individual frames inside GIF animations. And just like image options, most of them have three forms β --X, --no-X, and --same-X β and you can drop them multiple times. For example:
gifsicle -b a.gif -d50 "#0" "#1" -d100 "#2" "#3"
sets the delays of frames 0 and 1 to 50, and frames 2 and 3 to 100 β±οΈ
-dtime,--delaytime β sets the delay between frames to time, measured in hundredths of a second.-Dmethod,--disposalmethod β sets the disposal method for the following frames to method. A frame's disposal method decides how a viewer should remove the frame when it's time to show the next one. Method can be a number between0and7(although only0through3are generally meaningful π), or one of these names:none(leave the frame visible for future frames to build upon),asis(same as"none"),background(orbg) (replace the frame with the background), orprevious(replace the frame with the area from the previous displayed frame).--no-disposalmeans--disposal=none.-l[count],--loopcount[=count] β sets the Netscape loop extension to count. Count is an integer, orforeverto loop endlessly. If you supply a--loopcountoption without specifying count, Gifsicle will useforeverβΎοΈ.--no-loopcount(the default) turns looping off.
Set the loop count to one less than the number of times you want the animation to run. An animation with --no-loopcount will show every frame once; --loopcount=1 will loop once, thus showing every frame twice; and so on and so forth. Note that --loopcount=0 is equivalent to --loopcount=forever, not --no-loopcount π
-O[level],--optimize[=level] β attempts to shrink the file sizes of GIF animations. Level determines how much optimization gets done; higher levels take longer but may have better results. There are currently three levels:-O1β store only the changed portion of each image. This is the default.-O2β store only the changed portion of each image, and use transparency.-O3β try several optimization methods (usually slower, sometimes better results).
Other optimization flags give you finer-grained control π
-Okeep-emptyβ preserve empty transparent frames (they are dropped by default).
You may also be interested in other options for shrinking GIFs, such as -k, --lossy, and --no-extensions. Note that -O does not guarantee to shrink file size, and in rare cases, even -O3 may actually enlarge file size π
-U,--unoptimizeβ unoptimizes GIF animations into an easy-to-edit form.
GIF animations are often optimized (see --optimize) to make them smaller and faster to load, which unfortunately makes them a nightmare to edit π« . --unoptimize turns optimized input GIFs into unoptimized GIFs, where each frame is a faithful representation of what a user would actually see at that point in the animation. Slay β¨
π¦ Image Transformation Options π¦
Image transformation options apply to entire GIFs as they're read or written. They can be turned off with --no-option.
--resizewidthxheight β resizes the output GIF to the given width and height. If width or height is an underscore_, that dimension gets chosen so the aspect ratio stays unchanged π. Resizing happens after all input frames have been combined and before optimization. Resizing uses logical screen dimensions; if your input stream has an unusual logical screen (many GIF displayers ignore logical screens), you may want to provide--no-logical-screen(or+S) to reset it so gifsicle uses image dimensions instead. See also--resize-method.--resize-widthwidth,--resize-heightheight β resize to a given width or height, preserving aspect ratio. Equivalent to--resize widthx_or--resize _xheight.--resize-fitwidthxheight,--resize-touchwidthxheight β resize the output GIF to fit a rectangle with dimensions widthxheight. The aspect ratio remains unchanged. The--resize-fitoption only shrinks the image β no resize is performed if the GIF already fits inside the rectangle. The--resize-touchoption may shrink or grow the image; the output GIF will have width width, height height, or both. Either width or height may be an underscore_, which leaves that dimension unconstrained π«--resize-fit-widthwidth,--resize-fit-heightheight,--resize-touch-widthwidth,--resize-touch-heightheight β like--resize-fitand--resize-touch, but constrains only one dimension.--resize-geometrygeometry β resize to a geometry specification as used in ImageMagick and GraphicsMagick. Geometry should matchwidthxheight[%][!][^][<][>], where width and height are integers (or underscores,_, which leaves that dimension unconstrained). The suffixes mean:%β treat the dimensions as percentages of the current size.!β resize to given dimensions ignoring original aspect ratio.<β resize only if the image is smaller than the specified size.>β resize only if the image is larger than the specified size.^β dimensions are treated as minimum rather than maximum values.
--scaleXfactor[x*Yfactor*] β scales the output GIF's width and height by Xfactor and Yfactor. If Yfactor isn't given, it defaults to Xfactor. Scaling happens after all input frames have been combined and before optimization π§--resize-methodmethod β sets the method used to resize images π . Thesamplemethod runs very quickly, but when shrinking images it produces noisy results. Themixmethod is somewhat slower, but produces better-looking results. The default method is currentlymix.
The tea on how these differ: the resize methods differ most when shrinking images. sample is a point sampler β each pixel position in the output image maps to exactly one pixel position in the input. When shrinking, full rows and columns from the input are dropped. The other methods use all input pixels, which generally produces better-looking images.
The box method, a box sampler, is faster than the more complex filters and produces somewhat sharper results, but there will be anomalies when shrinking images by a small amount in one dimension. (Some output pixels will correspond to exactly 1 input row or column, while others will correspond to exactly 2 input rows or columns.) The mix method is a full bilinear interpolator. This is slower and produces somewhat blurrier results, but avoids anomalies.
Gifsicle also supports more complex resamplers, including Catmull-Rom cubic resampling (catrom), the Mitchell-Netravali filter (mitchell), a 2-lobed Lanczos filter (lanczos2), and a 3-lobed Lanczos filter (lanczos3). These filters are slower still, but can give sharper, better results. β¨
--resize-colorsn β lets Gifsicle add intermediate colors when resizing images π¨. Normally, Gifsicle's resize algorithms use input images' color palettes without changes. When shrinking images with very few colors (e.g., pure black-and-white images), adding intermediate colors can improve the results. Example:--resize-colors 64allows Gifsicle to add intermediate colors for images that have fewer than 64 input colors.
π¨ Color Options π¨
Color options apply to entire GIFs as they are read or written π. They can be turned off with --no-option.
-knum,--colorsnum β reduces the number of distinct colors in each output GIF to num or less. num must be between 2 and 256. This can be used to shrink output GIFs or eliminate any local color tables.
Normally, an adaptive group of colors is chosen from the existing color table. You can affect this process with the --color-method option or by giving your own colormap with --use-colormap. Gifsicle may need to add an additional color (making num+1 in all) if there is transparency in the image.
--color-methodmethod β determines how a smaller colormap is chosen.diversity, the default, isxv(1)'s diversity algorithm, which uses a strict subset of the existing colors and generally produces good results.blend-diversityis a modification of this: some color values are blended from groups of existing colors.median-cutis the median cut algorithm described by Heckbert.--methodis a synonym for--color-method.-f,--dither[=method]β when--ditheris on and the colormap is changed, combinations of colors are used to approximate missing colors. This looks better, but makes bigger files and can cause animation artifacts, so it is off by default π.
Specify a dithering method with the optional method argument. The default method, floyd-steinberg, uses Floyd-Steinberg error diffusion. This usually looks best, but can cause animation artifacts, because dithering choices will vary from frame to frame. The atkinson method uses Atkinson error diffusion, which is a variant of Floyd-Steinberg. It offers a more localized dithering pattern, which can be useful for images with large areas of solid color. Gifsicle also supports ordered dithering methods that avoid animation artifacts. The ro64 method uses a large, random-looking pattern and generally produces good results. The o3, o4, and o8 methods use smaller, more regular patterns. The ordered method chooses a good ordered dithering algorithm. For special effects, try the halftone methods halftone, squarehalftone, and diagonal.
Some methods take optional parameters using commas. The halftone methods take a cell size and a color limit: halftone,10,3 creates 10-pixel wide halftone cells where each cell uses up to 3 colors. π₯
--gammagamma β sets the color space/gamma correction to gamma, which can be a real number,srgb(the default), oroklab. Roughly speaking, higher numbers exaggerate shadows and lower numbers exaggerate highlights. The default color space is standard sRGB, which usually works well. (Its effects are similar to--gamma=2.2.) Gifsicle uses gamma correction when choosing a color palette (--colors), when dithering (--dither), and when computing color errors during lossy compression (--lossy).--lossy[=lossiness]β alters image colors to shrink output file size at the cost of artifacts and noise π. Lossiness determines how many artifacts are allowed; higher values can result in smaller file sizes, but cause more artifacts. The default lossiness is 20.
Gifsicle uses the color space set by --gamma to evaluate artifacts. If unsatisfied with the operation of --lossy, try another color space, such as --gamma=1.
--change-colorcolor1 color2 β changes color1 to color2 in the following input GIFs. (The color arguments have the same forms as in the-toption.) Change multiple colors by giving the option multiple times. Color changes don't interfere with one another, so you can safely swap two colors with--change-color color1 color2 --change-color color2 color1. They all take effect as an input GIF is read.--no-change-colorcancels all color changes.--transform-colormapcommand β command should be a shell command that reads from standard input and writes to standard output. Each colormap in the output GIF is translated into text colormap format (see--use-colormapbelow) and piped to the command. The output that command generates (which should also be in text colormap format) will replace the input colormap. The replacement doesn't consider color matching, so pixels that used color slot n in the input will still use color slot n in the output.--use-colormapcolormap β changes the image to use colormap. Each pixel in the image is changed to the closest match in colormap (or, if--ditheris on, to a dithered combination of colors in colormap). colormap can bewebfor the 216-color βWeb-safe paletteβ;grayfor grayscale;bwfor black-and-white; or the name of a file. That file should either be a text file (the format is described below) or a GIF file, whose global colormap will be used. If--colors=Nis also given, an N-sized subset of colormap will be used.
Text colormap files use this format:
; each non-comment line represents one color, "red green blue"
; each component should be between 0 and 255
0 0 0 ; like this
255 255 255
; or use web hex notation
#ffffff ; like this
--use-exact-colormapcolormap β same as--use-colormap, but the output GIF will use colormap as is, rather than reordering it and dropping unused colors.
β¨ EXAMPLES β¨
First, let's create an animation, anim.gif:
gifsicle a.gif b.gif c.gif d.gif > anim.gif
This animation will move very quickly: since we didn't specify a delay, a browser will cycle through the frames as fast as it can. Let's slow it down and pause .5 seconds between frames, using the --delay option.
gifsicle --delay 50 a.gif b.gif c.gif d.gif > anim.gif
If we also want the GIF to loop three times, we can use --loopcount:
gifsicle -d 50 --loop=3 a.gif b.gif c.gif d.gif > anim.gif
(Rather than type --delay again, we used its short form, -d. Many options have short forms; you can see them by running gifsicle --help. We also abbreviated --loopcount to --loop, which is OK since no other option starts with loop.)
To explode anim.gif into its component frames:
gifsicle --explode anim.gif
ls anim.gif*
anim.gif anim.gif.000 anim.gif.001 anim.gif.002 anim.gif.003
To optimize anim.gif:
gifsicle -b -O2 anim.gif
To change the second frame of anim.gif to x.gif:
gifsicle -b --unoptimize -O2 anim.gif --replace "#1" x.gif
--unoptimize is used since anim.gif was optimized in the last step.
β οΈ Editing individual frames in optimized GIFs is dangerous without --unoptimize; frames following the changed frame could be corrupted by the change. Of course, this might be what you want. π
Note that --unoptimize and --optimize can be on simultaneously. --unoptimize affects input GIF files, while --optimize affects output GIF files.
To print information about the first and fourth frames of anim.gif:
gifsicle -I "#0" "#3" < anim.gif
To make black the transparent color in all the GIFs in the current directory, and also print information about each:
gifsicle -bII --trans "#000000" *.gif
Giving -I twice forces normal output to occur. With only one -I, the GIFs would not be modified.
To change anim.gif to use a 64-color subset of the Web-safe palette:
gifsicle -b --colors=64 --use-col=web anim.gif
To make a dithered black-and-white version of anim.gif:
gifsicle --dither --use-col=bw anim.gif > anim-bw.gif
To overlay one GIF atop another -- producing a one-frame output GIF that looks like the superposition of the two inputs -- use gifsicle twice:
gifsicle bottom.gif top.gif | gifsicle -U "#1" > result.gif
π BUGS π
Some optimized output GIFs may appear incorrectly on some GIF implementations (for example, Java's); see the --careful option.
Please email suggestions, additions, patches and bugs to ekohler@gmail.com.
π SEE ALSO π
For a tutorial on GIF images and animations, you might try some of the resources listed on-line at webreference.com: http://www.webreference.com/authoring/graphics/animation.html
π AUTHORS π
okay so here's the credits, bestie β these are the absolute icons behind gifsicle, and we are giving them their flowers πΈπ
- Eddie Kohler β
ekohler@gmail.comΒ·http://www.read.seas.harvard.edu/~kohler/β he wrote it. like, literally wrote it, main character energy πβ¨ - Anne Dudfield β
annied@frii.comΒ·http://www.frii.com/~annied/β she named it. the naming icon herself ππ - Hans Dinsen-Hansen β
dino@danbbs.dkΒ·http://www.danbbs.dk/~dino/β adaptive tree method for GIF writing. lowkey genius behavior π§ββοΈπ₯ - Kornel Lesinski β the
--lossyoption. periodt π http://www.lcdf.org/gifsicle/β the gifsicle home page. go say hi π¦π
and that's the whole page, bestie π«Ά this was Version 1.98, dated 26 February 2025, for GIFSICLE(1) β mwah, go make something iconic ππβ¨
π¦ where this page comes from
- arch rolling: gifsicle 1.98-1 Β· GPL-2.0-only
- nixpkgs unstable: gifsicle 1.98
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms