http://giflib.sourceforge.net/whatsinagif/lzw_image_data.htmlGiff LZW-Kompression
Ich lese diese Seite Giff der LZW-Komprimierung zu verstehen. Es zeigt codierten Codes von seiner Probenbild:
# 4 # 1 # 6 # 6 # 2 # 9 # 9 ..
Nach variabler Länge in Bytes komprimiert, es wird:
8C 2D 99
..was bedeutet:
# 4 - 3 Bits
# 1 - 3 Bits
# 6 - 3 Bits
# 6 - 3 Bits
# 2 - 4 Bits
# 9 - 4 Bits
Diese Daten komprimierte Bild korrekt ist, wie ich die GIFF Probe erzeugten Bild mit Photoshop und verifizierten binären Inhalten.
Es zeigt deutlich die Zunahme Bitgröße passiert, wenn Ausgangscode # 2
Dies ist jedoch, wie die Seite spricht über die Bitgröße Erhöhung: When you are encoding the data, you increase your code size as soon as your write out the code equal to 2^(current code size)-1
Jumping back to our sample image, we see that we have a minimum code size value of 2 which means out first code size will be 3 bits long. Out first three codes, #1 #6 and #6, would be coded as 001 110 and 110. If you see at Step 6 of the encoding, we added a code of #7 to our code table. This is our clue to increase our code size because 7 is equal to 2^3-1 (where 3 is our current code size). Thus, the next code we write out, #2, will use the new code size of 4 and therefore look like 0010.
Aber in seiner Codierung Tabelle, Schritt 6 ist, wo Eintrag Nr. 7 zum LZW-Wörterbuch hinzugefügt wird, aber der für die Ausgabe hinzugefügte Code ist der erste # 6. Gemäß dem Algorithmus sollten die zwei # 6 jeweils 4 Bits sein, aber wie kommt es, dass sie tatsächlich 3 Bits sind?
nach dieser Seite https://www.eecis.udel.edu/~amer/CISC651/lzw.and.gif.explained.html
sagt es die gleiche Sache über Bitgröße If you're encoding, you start with a compression size of (N+1) bits, and, whenever you output the code (2**(compression size)-1), you bump the compression size up one bit
so was falsch ist ??
Es ist schwer, dem Beispiel zu folgen, ohne die eigentliche Code-Tabelle zu sehen, aber es ist klar, dass die Code-Breite zunehmen muss, sobald der nächste Code die aktuelle Breite überschreiten würde, aber nicht früher.Also, wenn die Breite nicht zunimmt, wo die Beschreibung sagt, würde es brauchen, aber wenn die Dekomprimierung immer noch funktioniert, muss es sein, weil der Algorithmus Logik hat, um zu erkennen, dass der neue Code tatsächlich hinzugefügt werden konnte (was die aktuelle Breite überlaufen würde) im Ausgabestream noch nicht auftreten. –