aspose.info
ZH

FLIF 文件格式

更新于

什么是一 .flif 文件?

FLIF(免费无损图像格式)是一种无损图像格式,其文件使用 .flif 扩展名。 FLIF 声称在压缩率方面优于 PNG、无损 WebP、无损 BPG 和无损 JPEG 2000。 FLIF 使用渐进式隔行扫描,因此图像的任何部分下载都可以用作整个图像的有损编码。

历史简介 ##

FLIF 于 2015 年 9 月公布,2015 年 10 月发布 alpha 版本。2016 年 9 月,发布了 FLIF 的第一个稳定版本。

FLIF 设计##

FLIF 使用 CABAC(上下文自适应二进制算术编码)、MANIAC(元自适应近零整数算术编码)的变体进行压缩。 MANIAC 是由 Jon Sneyers 和 Pieter Wuille 开发的熵编码算法。在 MANIAC 中,上下文是在编码时动态学习的决策树节点。这使得上下文模型更加特定于图像并产生更好的压缩。 FLIF 具有以下特点:

  • 支持无损压缩
  • 通过编码器预处理支持有损压缩
  • 支持灰度、RGB 和 RGBA
  • 支持每通道 1 到 16 位的颜色深度
  • 支持隔行和非隔行文件
  • 支持部分下载文件的渐进式解码
  • 支持动画
  • 支持嵌入式 ICC 颜色配置文件、Exif 和 XMP 元数据
  • 对压缩相机原始文件 (RGGB) 的支持有限

FLIF 文件格式

一个 FLIF 文件有以下四个部分:

主标题##

主标题包含主要元数据,包括宽度、高度、颜色深度、帧数。

类型数值描述
4 字节“FLIF”魔术
4 位3 = 仍然; 4 = 我仍然; 5 = 动画; 6 = i 动画隔行扫描、动画
4 位1 = 灰度; 3 = RGB; 4 = RGBA通道数 (nb_channels)
1 字节‘0’,‘1’,‘2’ (‘0’=custom)每通道字节数 (Bpc)
varintwidth-1宽度
varintheight-1高度
varintnb_frames-2 (仅当动画)帧数 (nb_frames)

元数据块##

这部分包含使用 DEFLATE 压缩编码的非像素,如 Exif/XMP 元数据、ICC 颜色配置文件等。这些块的定义类似于 PNG 块,不同之处在于卡盘大小是用可变数量的字节编码的。块的名称可以是 4 个字母(4 个字节)或低于 32 的值,表示非可选块。

以下是可选夹头的示例:

块名称描述内容(DEFLATE-解压后)
iCCPICC 颜色配置文件原始 ICC 颜色配置文件数据
eXifExif 元数据“Exif\0\0"标头后跟 TIFF 标头和 EXIF 数据
eXmpXMP 元数据包含在没有填充的只读 xpacket 中的 XMP

命名约定###

  • 第一个字母:大写用于关键块,小写用于非关键块。
  • 第二个字母:大写用于公共块,小写用于私有块
  • 第三个字母:大写用于正确显示图像所需的卡盘,而小写对于显示图像并不重要。
  • 第四个字母:大写用于可以安全盲复制的夹头。小写卡盘取决于图像数据。

第二个标题##

这包含有关像素实际编码的信息。

类型描述条件默认值
1 字节NUL 字节 (0x00),FLIF16 比特流的块名称
uni_int(1,16)通道每个像素的位数Bpc == ‘0’:如果 Bpc == ‘1’,则重复 (nb_channels)8,如果 Bpc == ‘2’,则为 16
uni_int(0,1)标志:alpha_zeronb_channels > 30
uni_int(0,100)循环数nb_frames > 1
uni_int(0,60_000)以毫秒为单位的帧延迟nb_frames > 1: 重复(nb_frames)
uni_int(0,1)标志:has_custom_cutoff_and_alpha
uni_int(1,128)截止has_custom_cutoff_and_alpha2
uni_int(2,128)alpha 除数has_custom_cutoff_and_alpha19
uni_int(0,1)标志:has_custom_bitchancehas_custom_cutoff_and_alpha0
?Bitchancehas_custom_bitchance
变量变换(见下文)
uni_int(1) = 0指标位:完成变换
uni_int(0,2)不可见像素预测器alpha_zero && 隔行扫描 && alpha 范围包括零

频道

频道号说明
0红色或灰色
1绿色
2蓝色
3阿尔法

转换

类型描述
uni_int(1) = 1指示位:尚未完成
uni_int(0,13)转换标识符
变量变换数据(取决于变换)

转换用于修改像素数据以实现更好的压缩并跟踪实际出现的像素值。

像素数据##

这部分包含使用 MANIAC 熵编码编码的实际像素数据。可以使用隔行或非隔行编码对像素进行编码。

###隔行扫描方法###

在此方法中,定义了缩放级别。缩放级别 0 用于完整图像,缩放级别 1 用于所有偶数行,缩放级别 2 用于缩放级别 1 的所有偶数列。换句话说,每个偶数缩放级别 2k 是下采样版本图像,比例为 1:2^k。缩放级别从最高到最低进行编码。

非隔行扫描方法###

在这种方法中,MANIAC 树的编码立即开始,然后是像素的编码。

参考 ##

另请参阅