JPEGHuffmanTablepublic class JPEGHuffmanTable extends Object A class to encapsulate a JPEG Huffman table.
Note that the classes in the com.sun.image.codec.jpeg package are not
part of the core Java APIs. They are a part of Sun's JDK and JRE
distributions. Although other licensees may choose to distribute these
classes, developers cannot depend on their availability in non-Sun
implementations. We expect that equivalent functionality will eventually
be available in a core API or standard extension.
|
Fields Summary |
---|
private static final int | HUFF_MAX_LENThe maximum number of symbol lengths
(max symbol length in bits = 16) | private static final int | HUFF_MAX_SYMthe maximum number of symbols | private short[] | lengthsbits[k] = number of symbols with length k bits | private short[] | symbolsSymbols in order of increasing length | public static final JPEGHuffmanTable | StdDCLuminanceStandard Huffman table ( JPEG standard section K.3 ) | public static final JPEGHuffmanTable | StdDCChrominanceStandard Huffman table ( JPEG standard section K.3 ) | public static final JPEGHuffmanTable | StdACLuminanceStandard Huffman table ( JPEG standard section K.3 ) | public static final JPEGHuffmanTable | StdACChrominanceStandard Huffman table ( JPEG standard section K.3 ) |
Constructors Summary |
---|
private JPEGHuffmanTable()Private constructor used to construct the Standard Huffman tables
short lengths[] = { // 0-base
0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
short symbols[] = {
0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
0xf9, 0xfa };
StdACChrominance.lengths = lengths;
StdACChrominance.symbols = symbols;
StdACChrominance.checkTable();
lengths = null;
symbols = null;
| public JPEGHuffmanTable(short[] lengths, short[] symbols)Creates a Huffman Table and initializes it.
if ( lengths.length > HUFF_MAX_LEN )
throw new IllegalArgumentException( "lengths array is too long" );
for (int i=1; i < lengths.length; i++)
if (lengths[i] < 0)
throw new IllegalArgumentException
( "Values in lengths array must be non-negative." );
if ( symbols.length > HUFF_MAX_SYM )
throw new IllegalArgumentException( "symbols array is too long" );
for (int i=0; i < symbols.length; i++)
if (symbols[i] < 0)
throw new IllegalArgumentException
( "Values in symbols array must be non-negative." );
this.lengths = new short[lengths.length];
this.symbols = new short[symbols.length];
System.arraycopy( lengths, 0, this.lengths, 0, lengths.length );
System.arraycopy( symbols, 0, this.symbols, 0, symbols.length );
checkTable();
|
Methods Summary |
---|
private void | checkTable()This checks that the table they gave us isn't 'illegal' It
checks that the symbol length counts are possible, and that
they gave us at least enough symbols for the symbol length
counts. Eventually this might check that there aren't duplicate
symbols.
int numVals=2;
int sum=0;
for (int i=1; i<lengths.length; i++) {
sum += lengths[i];
numVals -= lengths[i];
numVals *= 2;
}
//System.out.println("NumVals: " + numVals);
//System.out.println("Sum: " + sum + " Symbols: " + symbols.length);
if (numVals < 0)
throw new IllegalArgumentException
("Invalid Huffman Table provided, lengths are incorrect.");
// I'll let them go if they gave us 'extra' symbols...
if (sum > symbols.length)
throw new IllegalArgumentException
("Invalid Huffman Table provided, not enough symbols.");
| public short[] | getLengths()Return a copy of the array containing the number of symbols
for each length in the Huffman table.
short[] ret = new short[ lengths.length];
System.arraycopy( lengths, 0, ret, 0, lengths.length);
return ret;
| public short[] | getSymbols()Return an array containing the Huffman symbols arranged by
increasing length. To make use of this array you must refer
the the lengths array.
short[] ret = new short[symbols.length];
System.arraycopy( symbols, 0, ret, 0, symbols.length);
return ret;
|
|