.FLIFファイルとは何ですか?
FLIF (Free Lossless Image Format) は、ファイルに .flif 拡張子を使用するロスレス イメージ フォーマットです。 FLIF は、圧縮率に関して、PNG、ロスレス WebP、ロスレス BPG、およびロスレス JPEG 2000 よりも優れていると主張しています。 FLIF はプログレッシブ インターレースを使用するため、画像の部分的なダウンロードを画像全体の非可逆エンコーディングとして使用できます。
簡単な歴史
FLIF は 2015 年 9 月に発表され、2015 年 10 月にアルファ版がリリースされました。2016 年 9 月には、FLIF の最初の安定版がリリースされました。
FLIFデザイン##
FLIF は、CABAC (Context-adaptive Binary Arithmetic Coding) の変形である MANIAC (Meta-Adaptive Near-zero Integer Arithmetic Coding) を圧縮に使用します。 MANIAC は、Jon Sneyers と Pieter Wuille によって開発されたエントロピー コーディング アルゴリズムです。 MANIAC では、コンテキストは、エンコーディング時に動的に学習される決定木のノードです。これにより、コンテキスト モデルがより画像固有になり、圧縮が向上します。 FLIF には次の機能があります。
- 可逆圧縮をサポート
- エンコーダの前処理による非可逆圧縮をサポート
- グレースケール、RGB、RGBA をサポート
- チャンネルあたり 1 ~ 16 ビットの色深度をサポート
- インターレース ファイルと非インターレース ファイルをサポート
- 部分的にダウンロードされたファイルのプログレッシブ デコードをサポート
- アニメーションをサポート
- 埋め込み ICC カラー プロファイル、Exif および XMP メタデータをサポート
- Camera Raw ファイル (RGGB) の圧縮を限定的にサポート
FLIF ファイル形式
FLIF ファイルには、次の 4 つの部分があります。
メインヘッダー
メイン ヘッダーには、幅、高さ、色深度、フレーム数などのメイン メタデータが含まれます。
タイプ | 値 | 説明 |
---|---|---|
4バイト | “FLIF” | マジック |
4 ビット | 3 = ni まだ; 4 = 私はまだです。 5 = アニメ; 6 = i anim | インターレース、アニメーション |
4 ビット | 1 = グレースケール。 3 = RGB; 4 = RGBA | チャンネル数 (nb_channels) |
1 バイト | ‘0’,‘1’,‘2’ (‘0’=カスタム) | チャネルあたりのバイト数 (Bpc) |
varint | 幅-1 | 幅 |
varint | height-1 | 高さ |
varint | nb_frames-2 (アニメーションの場合のみ) | フレーム数 (nb_frames) |
メタデータ チャンク
この部分には、DEFLATE 圧縮を使用してエンコードされた Exif/XMP メタデータ、ICC カラー プロファイルなどの非ピクセルが含まれます。これらのチャンクは PNG チャンクと同様に定義されますが、チャック サイズが可変バイト数でエンコードされる点が異なります。チャンクの名前は、4 文字 (4 バイト) またはオプションではないチャンクを示す 32 未満の値にすることができます。
以下は、オプションのチャックの例です。
チャンク名 | 説明 | 内容(DEFLATE解凍後) |
---|---|---|
iCCP | ICC カラー プロファイル | 生の ICC カラー プロファイル データ |
eXif | Exif メタデータ | “Exif\0\0” ヘッダーの後に TIFF ヘッダーと EXIF データが続きます |
eXmp | XMP メタデータ | パディングなしの読み取り専用 xpacket 内に含まれる XMP |
### 命名規則 ###
- 最初の文字: 重要なチャンクには大文字が使用され、重要でないチャンクには小文字が使用されます。
- 2 番目の文字: パブリック チャンクには大文字が使用され、プライベート チャンクには小文字が使用されます
- 3 番目の文字: 画像を正しく表示するために必要なチャックには大文字が使用され、画像を表示するために小文字は重要ではありません。
- 4 番目の文字: 盲目的に安全にコピーできるチャックには大文字が使用されます。小文字のチャックは画像データに依存します。
2 番目のヘッダー
これには、ピクセルの実際のエンコードに関する情報が含まれています。
タイプ | 説明 | 条件 | デフォルト値 |
---|---|---|---|
1 バイト | NUL バイト (0x00)、FLIF16 ビットストリームのチャンク名 | ||
uni_int(1,16) | チャネルのピクセルあたりのビット数 | Bpc == ‘0’: repeat(nb_channels) | Bpc == ‘1’ の場合は 8、Bpc == ‘2’ の場合は 16 |
uni_int(0,1) | フラグ: alpha_zero | nb_channels > 3 | 0 |
uni_int(0,100) | ループ数 | nb_frames > 1 | |
uni_int(0,60_000) | ミリ秒単位のフレーム遅延 | nb_frames > 1: repeat(nb_frames) | |
uni_int(0,1) | フラグ: has_custom_cutoff_and_alpha | ||
uni_int(1,128) | カットオフ | has_custom_cutoff_and_alpha | 2 |
uni_int(2,128) | アルファ除数 | has_custom_cutoff_and_alpha | 19 |
uni_int(0,1) | フラグ: has_custom_bitchance | has_custom_cutoff_and_alpha | 0 |
? | ビッチンス | has_custom_bitchance | |
変数 | 変換 (下記参照) | ||
uni_int(1) = 0 | インジケータ ビット: 変換完了 | ||
uni_int(0,2) | 不可視ピクセル予測子 | alpha_zero && インターレース && ゼロを含むアルファ範囲 |
チャンネル
チャンネル番号 | 説明 |
---|---|
0 | 赤または灰色 |
1 | 緑 |
2 | 青 |
3 | アルファ |
変換
タイプ | 説明 |
---|---|
uni_int(1) = 1 | インジケータ ビット: まだ完了していません |
uni_int(0,13) | 変換識別子 |
変数 | 変換データ (変換に依存) |
変換は、より良い圧縮のためにピクセル データを変更し、実際に発生するピクセル値を追跡するために使用されます。
ピクセル データ
この部分には、MANIAC エントロピー コーディングを使用してエンコードされた実際のピクセル データが含まれます。ピクセルは、インターレースまたは非インターレース符号化を使用して符号化することができます。
インターレース方式
このメソッドでは、ズームレベルが定義されています。ズームレベル 0 はイメージ全体に使用され、ズームレベル 1 はすべての偶数行に使用され、ズームレベル 2 はズームレベル 1 のすべての偶数列に使用されます。つまり、すべての偶数ズームレベル 2k は、縮尺 1:2^k の画像。ズームレベルは、最高から最低の順にエンコードされます。
ノンインターレース方式
この方法では、MANIAC ツリーのエンコードがすぐに開始され、続いてピクセルのエンコードが行われます。