PNG(2022)のデコード処理における各ステップ

2026/10/15 3:53

PNG(2022)のデコード処理における各ステップ

RSS: https://news.ycombinator.com/rss

要約▶

日本語翻訳:

PNG ファイルは、4 バイトの長さフィールド、4 バイトの名前、データ内容、および誤り検出用の CRC から構成されるチャンクのシーケンスとしてデータを格納します。チャンク名の大小文字でその役割が決定され、大文字の場合には重要または公開済み(予約済み)なチャンクを示し、小文字の場合には補助的・私用・非安全なチャンクを示します。ファイルは 13 バイトのメタデータを含む IHDR チャンクで始まり、幅 (256)、高さ (256)、ビット深度 (8)、カラー空間 (Truecolor RGB)、圧縮方式 (0)、フィルタリング方式 (0)、インターレース(無効)、に続き、圧縮・フィルタリングされた画素データを保持する 1 つ以上の IDAT チャンクが続きます。例示の画像では、単一の IDAT チャンクが 62,801 バイトあります。ファイルは長さがゼロの IEND チャンクで終わり、CRC AE 42 60 82 で PNG の終了を示します。

画像を再構築するには、すべての IDAT チャンクをつなぎ合わせ、zlib で圧縮された生データとして扱い、標準的な zlib での展開を実行します。展開された各行は、zlib の圧縮性を高めるために画素値を補正するフィルタバイトで始まり、展開後は、5 つの方法(なし (0)、引き算 (23)、上方向 (77)、平均 (134)、Paeth (22))の一つを使用してこのフィルタを除去(デフィルタリング)する必要があります。例示では、最も頻繁に使用されたフィルタは Average (134) で、次に Paeth (22) でした。画像がインターレース形式の場合、Adam7 シーケンスに従って 7 パスに分けて読み込まれ、詳細が徐々に明らかになります。インターレース画像では水平方向の詳細が強調されており、これは人間の視覚知覚が長方形構造について水平方向の詳細を垂直方向よりも優先するためです。

本文

PNG ファイルのデコードプロセス解説

PNG ファイルはチャンクの系列として構成されています。各チャンクには以下の 4 つの要素が含まれます。

  • 長さ情報: 4 バイト
  • 名前: 4 バイト
  • 実際のデータ: バイナリデータ
  • CRC 値: チェックサム

チャンクの分類と重要性

チャンク名の文字ケース(大文字・小文字)によって、その役割が定義されます。

カテゴリー大文字 (UPPERCASE)小文字 (lowercase)
Critical(必須)画像表示に必須プライベート、アプリケーション固有
Public(公開)公的標準仕様リザーブ済み
Reserved(予約)プログラムが理解する必要ありセーフなコピーが可能

使用されているチャンク一覧

1. チャンク表示 (Signature & Metadata)

ファイルが PNG 形式であることを示すヘッダーです。改行文字を含む特定のバイト列(

89 50 4E 47 0D 0A 1A 0A
)が含まれており、バイナリデータの破損を防止するための意図的な設計です。

以下のメタデータチャンクが存在します:

  • 長さ:
    00 00 00 0D
    (13 バイト)
  • タイプ:
    49 44 48 52
    (IHDR)
  • データ内容:
    • 幅:256
    • 高さ:256
    • ビット深度:8
    • 色空間:Truecolor RGB
    • 圧縮方式:0 (Deflate)
    • フィルター方式:0 (None)
    • インタレース:無効
  • CRC:
    D3 10 3F 31

2. IDAT チャンク (Compressed Image Data)

圧縮された実際の画像データを保持します。今回のサンプルでは単一の IDAT チャンクのみが含まれていますが、一般的な PNG では複数のチャンクが連結されることもあります。

  • 長さ:
    00 00 F5 51
    (62,801 バイト)
  • タイプ:
    49 44 41 54
    (IDAT)
  • データ内容: 圧縮およびフィルタリング済みの画像データ(ここでは省略)
  • CRC:
    BF EB 1B 15

3. IEND チャンク (End of File)

PNG ファイルの終了を示す空のチャンクです。

  • 長さ:
    00 00 00 00
    (0 バイト)
  • タイプ:
    49 45 4E 44
    (IEND)
  • CRC:
    AE 42 60 82

画像データの抽出

デコードプロセスの最初のステップです。

  1. 全 IDAT チャンクのデータを順次連結します。
    • ※今回のサンプルは 1 つのみですが、複数の場合も存在します。
  2. ストリーミング対応: チャング先頭の長さ情報があるため、総データ長を事前に把握せずに処理できます。
  3. サイズ制限: 画像データが最大チャンクサイズ(65,535 バイト)を超える場合、自動的に複数の IDAT チャンクに分割されます。

圧縮データの特性確認 IDAT の生データを直接表示すると「ランダムノイズ」のように見えます。これは以下の理由によるものです:

  • 高エントロピー: 圧縮アルゴリズムが正しく動作しており、元の低エントロピーデータからエンタープライジが高くなっているためです。
  • 高効率な圧縮: データ量が画像の 3 分の 1 以下 にまで圧縮されているため、優れた圧縮効果が得られています。

非圧縮化(デコンプレッション)

IDAT チャンクのデータを zlib アルゴリズムを使用して解压処理します。

  • アルゴリズム: 通常の zlib 圧縮のみ使用(画像固有の特殊メカニズムは関与しません)。
  • フィルターの役割: フィルターは画像サイズを直接削減するものではなく、zlib においてより効率的な形式に変換するためのものです(詳細は PNG フィルタ関連記事 を参照)。

※圧縮解除後の状態 この段階では以下の異常現象が観察されます:

  • 色調が全体的に不自然に見える。
  • 画像全体が水平方向に歪んで見える。
    • 原因: 各スキャンラインの先頭には、フィルタ値(1 バイト)が含まれているためです。

デフィルタリング

非圧縮化されたデータに対し、各行ごとのフィルタを逆処理して復元します。これにより元の画像が得られます。

フィルタータイプの使用頻度統計

  • None (無効):
    0
  • Subtract (引き算):
    23
  • Up (上方向):
    77
  • Average (平均):
    134
  • Paeth:
    22

インタレース処理(Adam7)

PNG はオプションでインタレース方式を採用し、画像を 7 つの部分画像に分割して表示します。これにより、低解像度の状態から徐々に詳細な情報が増えるように表示されます。

  • 呼称: この部分画像の系列は 「Adam7」 と呼ばれます。
  • データ格納: 各部分画像のデータはファイル内で連続して格納されます。
  • パス構造: 抽出可能な 7 つの走査順(パス)は以下の順序です:
    1. パス 1
    2. パス 2
    3. パス 3
    4. パス 4
    5. パス 5
    6. パス 6
    7. パス 7

表示上の特性

  • サブ画像の一部は長方形の形状をとりますが、最終的な画像は四角形になります。
  • 水平方向の優先: 読み込み時に水平方向の詳細情報が垂直方向よりも多く認識されます。これは人間の視覚感知において水平方向の詳細の方が重要であるためです。

付録:バグについて

平均フィルタ(Average filter)の実装において、整数オーバーフローを不適切に処理する場合があります。

  • 仕様: 整数オーバーフローの扱いは、他の計算ルールとは異なる仕様が適用されます。
  • 挙動: オーバーフローが発生した場合、予期しない結果(バグ)が生じます。

同じ日のほかのニュース

一覧に戻る →

2026/10/17 17:21

DeepSeek-v4.1-Flash-1017

## Japanese Translation: DeepSeek-V4.1-Flash-1017 は、DeepSeek-V4.1-Flash のパフォーマンス向上型の後継モデルであり、推論、コーディング、エージェントタスクおよび画像ベンチマークにおいて顕著な性能向上を実現すると同時に、実行時間と出力長を削減しています。ベンチマーク結果によると、同モデルはオリジナルの V4.1-Flash を大幅に凌駕しており、HLE で 42.6(対 36.8)、Terminal-Bench 4.0 で 42.3(対 31.2)、DeepSWE v1.1 で 77.0(対 74.2)、Apex Bench v1.1 で 72.1(対 64.6)のスコアを記録しています。業界トップクラスの GPT-5.6 Sol や Opus 5 より劣るものの、前世代モデルに対しては確かな位置づけを確立しています。同モデルは、2026 年に発表された高度な KV キャッシュ圧縮技術による効率化を目的として設計されており、MIT ライセンスの下で公開されています。本番環境での統合においては、Rust ベースの `deepseek-recipe` ツールキット(Python バインディング付き)を利用することをお勧めします。この toolkit は、ツール呼び出しや画像生成といった複雑なタスクを処理する際に外部チャットテンプレートを使用する必要がありません。最適なパフォーマンスを発揮するためには、1M トークンの大きなコンテキストウィンドウ、少なくとも 256K トークンの最大出力容量、および サンプリングパラメータとして temperature=1.0 および top_p=1.0 を設定する必要があります。

2026/10/15 16:18

Commodore 64 ハードウェアシミュレーター:チップとピンを壊して結果を確認しよう

## Japanese Translation: 本ソフトウェアは、Andre Weissflog のコアモデルを zlib ライセンスの下で構築し、Commodore 64 のマザーボード(ASSY 250407)に対してサイクル正確なピン毎のシミュレーションを提供します。事前に定義された障害パターンに依存するツールとは異なり、明確な回路動作モデルおよびボードのネットリストを使用して、RAM のエイリアシングや電源投入前に特定のピンをリフトする際などに自然に発生するグリッチを導出します。ユーザーはチップをリフトする、ピンをショートさせる、ソケットを取り外す、抵抗器を開くなどしてボードと相互作用し、C64 の動作を安全に学習したり、壊れたハードウェアのトラブルシューティングを行ったりすることができます。パワーモデリングは厳格であり、死んだチップ、浮遊する CMOS 構成要素、および幻のパワー効果を区別します。シミュレーションにはオシロスコープ表示や .prg の読み込みによるデバッグ機能などの機能が含まれていますが、現在のハードウェア上のパフォーマンス制限のためゲームエミュレーターではありません(31–48% の速度でシミュレート)。既知のギャップとしては、SID フィルターやビデオ出力のようなアナログ部品がシミュレーションされていないことなどがあり、将来的なアップデートでは内部チップの障害およびネットブリッジの対応を計画しています。

2026/10/18 0:55

ペレ - テーマ化可能な SVG としてマーメイド図

## 日本語訳: # ルール - 元の意味を正確に保持する(追加も省略もない)。 - ドキュメントの構造(見出し、箇条書きなど)を維持する。 - 技術用語を正確に扱う(API、LLM、zero-trust は自然な日本語の対訳がある場合を除きそのまま残す)。 - トーンと確信度を保つ。 - まとめ、説明、改変を行わず、翻訳のみを行う。 # 出力形式 ## 日本語訳: (ここに日本語訳を書く) ## 訳すべきテキスト: (必要であれば;なければ元の文章を繰り返す): 正確性や明瞭さのためには改善は不要だが、 desired な場合は名前の由来に簡潔に触れることで若干の文脈を追加できる。