# ericthered2007/java_jpg_decoder architecture

> Architecture diagram of the GitHub repository ericthered2007/java_jpg_decoder, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-10). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/ericthered2007/java_jpg_decoder
- Repository: https://github.com/ericthered2007/java_jpg_decoder

## Overview

This is a command-line JPEG image viewer backed by a Java decoder. The user supplies a JPEG path; the viewer invokes decoding, which parses markers and scans, reconstructs coefficients, transforms blocks into samples, converts them into a BufferedImage, and schedules Swing display. The README documents baseline and progressive Huffman JPEG support, grayscale/RGB/YCbCr conversion, and restart intervals. The decoder excerpt and README establish the principal calls; decoder internals are grouped where the excerpt does not expose distinct calls.

Main entry points: [`JpegDecoder.java`](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java) (JPEG decoder), [`JpegViewer.java`](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegViewer.java) (Viewer entry), [`HuffmanTable.java`](https://github.com/ericthered2007/java_jpg_decoder/blob/main/HuffmanTable.java) (Huffman tables), [`JpegIdct.java`](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegIdct.java) (Inverse DCT)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_decode["JPEG decoding"]
  node_decoder["JPEG decoder<br/>[JpegDecoder.java]"]
  node_markers["Marker and scan parsing<br/>[JpegDecoder.java]"]
  node_entropy["Entropy bit reader"]
  node_huffman["Huffman tables<br/>[HuffmanTable.java]"]
  node_components["Component coefficients<br/>[JpegComponent.java]"]
end

subgraph group_render["Image rendering"]
  node_idct["Inverse DCT<br/>[JpegIdct.java]"]
  node_pixels["Pixel conversion<br/>[JpegDecoder.java]"]
  node_image["Buffered image<br/>[JpegDecoder.java]"]
end

subgraph group_ui["Desktop display"]
  node_viewer["Viewer entry<br/>[JpegViewer.java]"]
  node_swing["Swing window<br/>[JpegViewer.java]"]
end

node_user(("User"))

node_user -->|"launches with path"| node_viewer
node_viewer -->|"calls decode"| node_decoder
node_decoder -->|"parses markers"| node_markers
node_markers -->|"creates reader"| node_entropy
node_decoder -->|"decodes codes"| node_huffman
node_huffman -->|"reads bits"| node_entropy
node_decoder -->|"stores coefficients"| node_components
node_decoder -->|"transforms blocks"| node_idct
node_idct -->|"writes samples"| node_components
node_decoder -->|"converts samples"| node_pixels
node_pixels -->|"builds pixels"| node_image
node_decoder -->|"returns image"| node_viewer
node_viewer -->|"schedules display"| node_swing
node_swing -.->|"displays image"| node_user

click node_viewer "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegViewer.java"
click node_decoder "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java"
click node_markers "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java"
click node_entropy "https://github.com/ericthered2007/java_jpg_decoder/blob/main/EntropyBitReader.java"
click node_huffman "https://github.com/ericthered2007/java_jpg_decoder/blob/main/HuffmanTable.java"
click node_components "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegComponent.java"
click node_idct "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegIdct.java"
click node_pixels "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java"
click node_image "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java"
click node_swing "https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegViewer.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_decoder,node_markers,node_entropy,node_huffman,node_components,node_user toneBlue
class node_idct,node_pixels,node_image toneAmber
class node_viewer,node_swing toneMint
```

## Components

### JPEG decoding

- [JPEG decoder](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java): `JpegDecoder.java`
- [Marker and scan parsing](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java): `JpegDecoder.java`
- [Entropy bit reader](https://github.com/ericthered2007/java_jpg_decoder/blob/main/EntropyBitReader.java): `EntropyBitReader.java`
- [Huffman tables](https://github.com/ericthered2007/java_jpg_decoder/blob/main/HuffmanTable.java): `HuffmanTable.java`
- [Component coefficients](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegComponent.java): `JpegComponent.java`

### Image rendering

- [Inverse DCT](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegIdct.java): `JpegIdct.java`
- [Pixel conversion](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java): `JpegDecoder.java`
- [Buffered image](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegDecoder.java): `JpegDecoder.java`

### Desktop display

- [Viewer entry](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegViewer.java): `JpegViewer.java`
- [Swing window](https://github.com/ericthered2007/java_jpg_decoder/blob/main/JpegViewer.java): `JpegViewer.java`

### Other components

- **User**

## Connections

- User → Viewer entry: launches with path (evidence: `README.md`)
- Viewer entry → JPEG decoder: calls decode (evidence: `JpegViewer.java`)
- JPEG decoder → Marker and scan parsing: parses markers (evidence: `JpegDecoder.java`)
- Marker and scan parsing → Entropy bit reader: creates reader (evidence: `README.md`)
- JPEG decoder → Huffman tables: decodes codes (evidence: `README.md`)
- Huffman tables → Entropy bit reader: reads bits (evidence: `HuffmanTable.java`)
- JPEG decoder → Component coefficients: stores coefficients (evidence: `JpegDecoder.java`)
- JPEG decoder → Inverse DCT: transforms blocks (evidence: `README.md`)
- Inverse DCT → Component coefficients: writes samples (evidence: `README.md`)
- JPEG decoder → Pixel conversion: converts samples (evidence: `README.md`)
- Pixel conversion → Buffered image: builds pixels (evidence: `JpegDecoder.java`)
- JPEG decoder → Viewer entry: returns image (evidence: `README.md`)
- Viewer entry → Swing window: schedules display (evidence: `JpegViewer.java`)
- Swing window → User: displays image (evidence: `README.md`)
