Dateiformat: jpg ed
JPEG ist eigentlich nur das Komprimier-Verfahren, das Dateiformat heißt JFIF
Die Bilddaten werden in 8x8-Pixel Blöcke zerlegt, die jeweils per diskreter Cosinus-Transformation umgerechnet und dann umsortiert ("Zick-Zack") und "quantisiert" werden. Durch Sub-Sampling können für die Farbwerte größere Bereiche (mit trotzdem der selben Pixelzahl) gewählt werden. Anschließend wird der Datenstrom noch durch das Huffman-Verfahren komprimiert.
Segmente ed
Die Datei ist eine reine Aneinanderreihung von Segmenten, die jeweils mit einer 2byte langen ID beginnen.
Wenn eine Segment-Länge in der Datei gespeichert ist, wird die ID (2byte) nicht mitgerechnet, dafür aber die Längenangabe selbst (2byte)!
Der Typ inv_short stellt eine 2byte große Ganzzahl dar, aber in umgekehrter Byte-Reihenfolge:
n = byte[0] * 256 + byte[1];
Start Of Image ed
ID = ff.d8
Markiert den Dateianfang (hat selbst keinen Inhalt)
End Of Image ed
ID = ff.d9
Enthält Bildinformationen (Größe,...)
Offset Typ Länge Bedeutung 0 inv_short 2 Segment-Länge ID = ff.c0
5 inv_short 2 Bild-Breite (Pixel)
7 byte 1 Anzahl der Farbkanäle
{
7+i*3 byte 1 Farbkanal ( 1=Y=Helligkeit, 2=Cb, 3=Cr )
8+i*3 byte 1 Sub-Sampling ( hohe 4 bits: horizontal, niedere 4 bits: vertikal )
9+i*3 byte 1 Quantisierungstabelle (Index)
} [Farbkanäle]Markiert das Dateiende (ohne Inhalt)
Baseline DCT ed
ff.c0
Quantisierungstabelle ed
ID = ff.db
Die Tabelle, die von Ganzzahlen (aus der Datei) in Fließkomma-Zahlen (Koeffizienten für die Cosinus-Transformation) umrechnet.
Offset Typ Länge Bedeutung
0 inv_short 2 Segment-Länge
{Huffman ed
Cosinus-Transformation ed
Blöcke kombinieren ed
2 byte 1 Tabellenindex (niedere 4 bit)
{
3+i byte 1 float q[zick_zack[i]]
} [64]
} [kann mehrere enthalten...!]Huffmantabelle ed
ID = ff.c4
Start Of Scan ed
ID = ff.da