跳到主要内容
PulsarKit

图片转GIF

把一张图片转成静态GIF,或把一组图片做成GIF动画,帧率、顺序和循环都由你决定。

把文件拖到这里

.jpg, .jpeg, .png, .webp, .bmp · 最大20 MB

如何生成GIF

  1. 1

    按顺序拖入图片帧

    添加的每个文件就是一帧,最多300帧。JPEG、PNG、WebP和BMP都可以,也可以混在一起用。

  2. 2

    设置帧率和循环

    按每秒帧数选择速度,决定动画无限循环还是重复固定次数。如果导出的是编了号的序列,可以按文件名重新排序。

  3. 3

    下载GIF

    结果只有一个文件,不会是ZIP。这个工具的意义就在于把许多张图片变成一个动画。

GIF能做什么,不能做什么

GIF是1989年的格式,这一点看得出来。每一帧最多只有256种颜色的调色板;透明度是每个像素上的一个开关,而不是平滑的透明通道。由此带来两个结果,都不是这个工具的问题。第一,有柔和渐变的照片会出现明显的色彩噪点,因为要用256种颜色代替几百万种,差异以抖动的方式分散开。第二,柔和阴影渐渐过渡到透明的图片会出现硬边,因为每个像素要么完整画出,要么完全没有。如果这些对你很重要,动态WebP或AVIF能保留多得多的原图细节,结果卡片上的处理链有这两个工具的链接。

整个动画共用一个调色板

颜色是从所有帧里同时均匀采样的,再用全部样本一起生成一个调色板。如果每帧单独生成,单张画面会略微准确一点,但看起来要糟糕得多:调色板会逐帧变化,平坦的区域会明显闪动。画布尺寸也是同样的道理:最终顺序里的第一帧决定尺寸,其他每一帧都按原比例缩放到画布里面,空出的地方填白色;如果那一帧本身有透明通道,就填透明。任何内容都不会被裁掉。

帧率没有你想的那么精细

GIF以百分之一秒为单位记录每帧的延迟,所以不是每个帧率都能精确实现。每秒10帧正好是10个单位;12帧变成8个单位,实际是每秒12.5帧;30帧变成3个单位,实际约为33帧。工具会取最接近的可用值,不会假装做到了精确。实际使用中,照片序列用8到15帧就显得流畅;每张图都需要看清的幻灯片式动画,用2到5帧效果更好。

文件留在你的设备上

解码、生成调色板和GIF编码都在这个浏览器标签页里完成,用的是WebAssembly解码器和JavaScript编码器。不会上传任何内容,帧不会存储在任何地方,关闭标签页就会把所有内容从内存中清除。这一点在这里比平时更重要,因为一组帧往往是一整次拍摄的照片。

常见问题

为什么我的GIF看起来有颗粒感?

因为要用256种颜色代替原图里的几百万种。你看到的斑点纹理就是抖动:故意撒下的细小颜色误差,从远处看平均颜色是对的。你可以关掉抖动,代价是斑点换成明显的色带;也可以减少调色板颜色数,主动接受更强的色调分离效果。

最多能添加多少帧?

最多300个文件,每个20 MB,总计150 MB,每帧上限1600万像素。300帧加上最大的画布尺寸时,生成GIF大约需要25秒;画布小一些会快得多。

怎么控制帧的顺序?

默认按文件列表里的顺序排列,可以在列表里拖动调整。如果拖入的是导出的序列,切换到“按文件名”。它按自然顺序排序,所以frame2排在frame10前面,而不是后面。“倒序”会把添加时的顺序整个反过来。

文件里的无限循环是什么意思?

它会写入一个重复次数为零的NETSCAPE2.0应用扩展块,所有查看器都会把它读成“无限重复”。次数为3表示动画播放一遍后再重复三次,最后停在最后一帧。单张图片不会写入循环块,因为只有一帧的GIF就是一张静态图。

为什么透明部分的边缘参差不齐?

GIF的透明度只有一位:一个像素要么画出来,要么不画。原图里半透明的部分,比如圆形抗锯齿的边缘或柔和的投影,都必须被强制归到其中一边,平滑的过渡就变成了硬边界。转换前给图片帧加上纯色背景,效果通常比让边缘碎掉要好。

能用一张照片做GIF吗?

能。只有一个文件时,结果是单帧的静态GIF,帧率和循环选项不再起作用,文件名沿用原文件。这是正当的用法:有些论坛和聊天软件接受GIF,却不接受其他格式。

这和视频转GIF有什么不同?

这个工具处理的是你手上已经分成单独文件的静态图片,每张一帧。视频转GIF工具要先解码视频流,再决定抽取哪些帧。如果你手上是MP4或MOV,从那个工具开始;如果是导出的图片序列或几张照片,这里就对了。

文件会上传到服务器吗?

不会。每一帧的解码、量化和编码都在你的浏览器里完成。任何环节都没有上传,服务器上也没有副本。

相关工具