PNG ファイルとは何ですか?
PNG (Portable Network Graphics) ファイルは、可逆圧縮を使用するラスター イメージ ファイル形式です。このファイル形式は、Graphics Interchange Format (GIF) の代替として作成されたもので、著作権の制限はありません。ただし、PNG ファイル形式はアニメーションをサポートしていません。 PNG ファイル形式はロスレス画像圧縮をサポートしているため、ユーザーの間で人気があります。時間の経過とともに、PNG は広く使用されている画像ファイル形式の 1 つとして進化してきました。
PNG ファイル形式の歴史
PNG ファイル形式が作成された主な理由は、GIF ファイル形式で使用される特許取得済みの圧縮アルゴリズム、Lempel-Ziv-Welch でした。これと他の GIF の制限により、GIF ファイル形式を置き換える必要が生じました。 PNG ファイル形式の最初の提案と名前は、1995 年 1 月に発表されました。PNG ファイル形式に関する主な出来事を以下に示します。
- 1996 年 10 月: PNG 仕様バージョン 1.0 がリリースされ、後に RFC 2083 として登場しました。これは 1996 年 10 月に W3C 勧告になりました。
- 1998 年 12 月: いくつかの小さな変更と 3 つの新しいチャンクの追加を加えたバージョン 1.1 がリリースされました。
- 1999 年 8 月: チャンクを 1 つ追加したバージョン 1.2 がリリースされました。
- 2003 年 11 月: PNG は国際標準 (ISO/IEC 15948:2003) になりました。このバージョンの PNG は、バージョン 1.2 とわずかに異なるだけで、新しいチャンクは追加されていません。
- 2004 年 3 月: ISO/IEC 15948:2004
GIFとPNGの機能比較
PNG ファイル形式は、シンプルで移植性があり、法的に妨げられず、互換性があり、柔軟で堅牢であるように設計されています。次の表に、新しい機能に加えて、PNG ファイル形式に継承される GIF 機能を示します。
特集 | GIF | PNG |
---|---|---|
最大 256 色のインデックス カラー イメージ | はい | はい |
ストリーミングのサポート | はい | はい |
透明度 | はい | はい |
補足情報 | はい | はい |
ハードウェアとプラットフォームの独立性 | はい | はい |
有効 | はい | はい |
最大 48 ビット/ピクセルのトゥルーカラー イメージ | いいえ | はい |
ピクセルあたり最大 16 ビットのグレースケール イメージ | いいえ | はい |
フル アルファ チャネル (一般的な透明マスク) | いいえ | はい |
画像ガンマ情報 | いいえ | はい |
信頼性 | いいえ | はい |
初期プレゼンテーションの高速化 | いいえ | はい |
PNG ファイル構造
ほぼすべてのオペレーティング システムで、PNG ファイルを開くことがサポートされています。たとえば、Microsoft Windows ビューアーには PNG ファイルを開く機能があります。これは、OS がインストールの一部としてデフォルトでサポートを利用できるためです。 PNG ファイルは、PNG の「署名」とそれに続く一連の //chunks// で構成されます。
PNG ファイルのヘッダー
PNG ファイルの最初の 8 バイトには、常に次の (10 進数) 値が含まれます。
{{{137 80 78 71 13 10 26 10 }}}
この署名は、ファイルの残りの部分に、IHDR チャンクで始まり IEND チャンクで終わる一連のチャンクで構成される単一の PNG 画像が含まれていることを示します。
チャンク
各チャンクは次の 4 つの部分で構成されます。
長さ: チャンクのデータ フィールドのバイト数を示す 4 バイトの符号なし整数。長さはデータ フィールドのみをカウントし、それ自体、チャンク タイプ コード、または CRC はカウントしません。ゼロは有効な長さです。エンコーダーとデコーダーは長さを符号なしとして扱う必要がありますが、その値は 231 バイトを超えてはなりません。
Chunk Type: 4 バイトのチャンク タイプ コード。説明と PNG ファイルの検査の便宜上、タイプ コードは大文字と小文字の ASCII 文字 (AZ と az、または 10 進数の 65-90 と 97-122) で構成されるように制限されています。ただし、エンコーダーとデコーダーは、コードを文字列ではなく、固定のバイナリ値として扱う必要があります。たとえば、型コード IDAT をこれらの文字に相当する EBCDIC で表すのは正しくありません。チャンク タイプの追加の命名規則については、次のセクションで説明します。
チャンク データ: チャンク タイプに適したデータ バイト (存在する場合)。このフィールドの長さはゼロにすることができます。
CRC: チャンク内の前のバイトに対して計算された 4 バイトの CRC (Cyclic Redundancy Check)。チャンク タイプ コードとチャンク データ フィールドは含まれますが、長さフィールドは含まれません。データを含まないチャンクの場合でも、CRC は常に存在します。
チャンク データの長さは、最大バイト数までの任意のバイト数にすることができます。したがって、実装者は、チャンクがバイトより大きい境界で整列されていると想定することはできません。
チャンクは、各チャンク タイプに課せられた制限に従って、任意の順序で表示できます。 (注目すべき制限の 1 つは、IHDR が最初に表示され、IEND が最後に表示されなければならないことです。したがって、IEND チャンクはファイルの終わりマーカーとして機能します。) 同じタイプの複数のチャンクが表示される可能性がありますが、そのタイプに対して特に許可されている場合に限ります。
チャンクの種類
チャンク タイプは、チャンク タイプに割り当てられた 4 バイトの大文字と小文字を区別する ASCII 値に基づいて、クリティカル チャンクと 補助 チャンクに分類されます。すべての実装は、標準のクリティカル チャンクを理解し、正常にレンダリングする必要があります。有効な PNG イメージには、IHDR チャンク、1 つ以上の IDAT チャンク、および IEND チャンクが含まれている必要があります。
圧縮
PNG 圧縮方法 0 (PNG に対して現在定義されている唯一の圧縮方法) は、最大 32768 バイトのスライディング ウィンドウで deflate/inflate 圧縮を指定します。 Deflate 圧縮は、zip、gzip、pkzip、および関連プログラムで使用される LZ77 の派生物です。その特許フリーのステータスを裏付ける広範な研究が行われています。 zlib データストリーム内の圧縮データは、一連のブロックとして格納されます。各ブロックは、生の (圧縮されていない) データ、固定ハフマン コードでエンコードされた LZ77 圧縮データ、またはカスタム ハフマン コードでエンコードされた LZ77 圧縮データを表すことができます。最後のブロックのマーカー ビットは、それが最後のブロックであることを識別し、デコーダが圧縮されたデータ ストリームの最後を認識できるようにします。
事前圧縮フィルタリング
最適な圧縮のために画像データを準備するために、事前圧縮フィルタが適用されます。 PNG フィルター メソッドは、次の 5 つの基本的なフィルター タイプを定義します。
フィルタの種類 | 名前 | 予測値 |
---|---|---|
0 | なし | スキャンラインは変更されずに送信されます |
1 | Sub | 各バイトと前のピクセルの対応するバイトの値との差を送信します。 |
2 | Up | Up() フィルタは Sub() フィルタと同じですが、現在のピクセルのすぐ左ではなく、すぐ上のピクセルが予測値として使用される点が異なります。 |
3 | Average | Average() フィルターは、隣接する 2 つのピクセル (左と上) の平均を使用して、ピクセルの値を予測します。 |
4 | Paeth | Paeth() フィルターは、隣接する 3 つのピクセル (左、上、左上) の単純な線形関数を計算し、計算値に最も近い隣接ピクセルを予測値として選択します。 |
フィルタリング アルゴリズムは、画像のビット深度や色の種類に関係なく、ピクセルではなく「バイト」に適用されます。フィルタリング アルゴリズムは、スキャンラインによって形成されたバイト シーケンスに対して機能します。イメージにアルファ チャネルが含まれている場合、アルファ データはイメージ データと同じ方法でフィルタリングされます。
イメージがインターレースされている場合、インターレース パターンの各パスは、フィルタリングの目的で独立したイメージとして扱われます。フィルターは、パス中に実際に送信されたピクセルによって形成されたバイト シーケンスで機能します。「前のスキャンライン」は、完全なイメージで隣接するものではなく、同じパスで以前に送信されたものです。いずれかのパスで送信されるサブイメージは常に長方形ですが、完全なイメージよりも幅や高さが小さいことに注意してください。このサブイメージが空の場合、フィルタリングは適用されません。