⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman.java

📁 一个完整的
💻 JAVA
字号:
// Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2002-12-05 9:38:13
// Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
// Decompiler options: packimports(3) 
// Source File Name:   JpegEncoder.java

package cn.com.fcsoft.chart.jpeg;

import java.io.*;
import java.util.Vector;

class Huffman
{

    public Huffman(int i, int j)
    {
        bits = new Vector();
        bits.addElement(bitsDCluminance);
        bits.addElement(bitsACluminance);
        bits.addElement(bitsDCchrominance);
        bits.addElement(bitsACchrominance);
        val = new Vector();
        val.addElement(valDCluminance);
        val.addElement(valACluminance);
        val.addElement(valDCchrominance);
        val.addElement(valACchrominance);
        initHuf();
        code = code;
        ImageWidth = i;
        ImageHeight = j;
    }

    public void HuffmanBlockEncoder(BufferedOutputStream bufferedoutputstream, int ai[], int i, int j, int k)
    {
        NumOfDCTables = 2;
        NumOfACTables = 2;
        int i1;
        int l = i1 = ai[0] - i;
        if(l < 0)
        {
            l = -l;
            i1--;
        }
        int k1 = 0;
        for(; l != 0; l >>= 1)
            k1++;

        bufferIt(bufferedoutputstream, ((int[][])DC_matrix[j])[k1][0], ((int[][])DC_matrix[j])[k1][1]);
        if(k1 != 0)
            bufferIt(bufferedoutputstream, i1, k1);
        int j2 = 0;
        int i2 = 1;
        do
            if((l = ai[jpegNaturalOrder[i2]]) == 0)
            {
                j2++;
            } else
            {
                for(; j2 > 15; j2 -= 16)
                    bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[240][0], ((int[][])AC_matrix[k])[240][1]);

                int j1 = l;
                if(l < 0)
                {
                    l = -l;
                    j1--;
                }
                int l1;
                for(l1 = 1; (l >>= 1) != 0; l1++);
                int k2 = (j2 << 4) + l1;
                bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[k2][0], ((int[][])AC_matrix[k])[k2][1]);
                bufferIt(bufferedoutputstream, j1, l1);
                j2 = 0;
            }
        while(++i2 < 64);
        if(j2 > 0)
            bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[0][0], ((int[][])AC_matrix[k])[0][1]);
    }

    public void initHuf()
    {
        DC_matrix0 = new int[12][2];
        DC_matrix1 = new int[12][2];
        AC_matrix0 = new int[255][2];
        AC_matrix1 = new int[255][2];
        DC_matrix = new Object[2];
        AC_matrix = new Object[2];
        int ai[] = new int[257];
        int ai1[] = new int[257];
        int i = 0;
        int k = 1;
        do
        {
            for(int l = 1; l <= bitsDCchrominance[k]; l++)
                ai[i++] = k;

        } while(++k <= 16);
        ai[i] = 0;
        int l1 = i;
        int j2 = 0;
        int i2 = ai[0];
        for(i = 0; ai[i] != 0;)
        {
            while(ai[i] == i2) 
            {
                ai1[i++] = j2;
                j2++;
            }
            j2 <<= 1;
            i2++;
        }

        for(i = 0; i < l1; i++)
        {
            DC_matrix1[valDCchrominance[i]][0] = ai1[i];
            DC_matrix1[valDCchrominance[i]][1] = ai[i];
        }

        i = 0;
        k = 1;
        do
        {
            for(int i1 = 1; i1 <= bitsACchrominance[k]; i1++)
                ai[i++] = k;

        } while(++k <= 16);
        ai[i] = 0;
        l1 = i;
        j2 = 0;
        i2 = ai[0];
        for(i = 0; ai[i] != 0;)
        {
            while(ai[i] == i2) 
            {
                ai1[i++] = j2;
                j2++;
            }
            j2 <<= 1;
            i2++;
        }

        for(i = 0; i < l1; i++)
        {
            AC_matrix1[valACchrominance[i]][0] = ai1[i];
            AC_matrix1[valACchrominance[i]][1] = ai[i];
        }

        i = 0;
        k = 1;
        do
        {
            for(int j1 = 1; j1 <= bitsDCluminance[k]; j1++)
                ai[i++] = k;

        } while(++k <= 16);
        ai[i] = 0;
        l1 = i;
        j2 = 0;
        i2 = ai[0];
        for(i = 0; ai[i] != 0;)
        {
            while(ai[i] == i2) 
            {
                ai1[i++] = j2;
                j2++;
            }
            j2 <<= 1;
            i2++;
        }

        for(i = 0; i < l1; i++)
        {
            DC_matrix0[valDCluminance[i]][0] = ai1[i];
            DC_matrix0[valDCluminance[i]][1] = ai[i];
        }

        i = 0;
        k = 1;
        do
        {
            for(int k1 = 1; k1 <= bitsACluminance[k]; k1++)
                ai[i++] = k;

        } while(++k <= 16);
        ai[i] = 0;
        l1 = i;
        j2 = 0;
        i2 = ai[0];
        for(int j = 0; ai[j] != 0;)
        {
            while(ai[j] == i2) 
            {
                ai1[j++] = j2;
                j2++;
            }
            j2 <<= 1;
            i2++;
        }

        for(int k2 = 0; k2 < l1; k2++)
        {
            AC_matrix0[valACluminance[k2]][0] = ai1[k2];
            AC_matrix0[valACluminance[k2]][1] = ai[k2];
        }

        DC_matrix[0] = DC_matrix0;
        DC_matrix[1] = DC_matrix1;
        AC_matrix[0] = AC_matrix0;
        AC_matrix[1] = AC_matrix1;
    }

    void bufferIt(BufferedOutputStream bufferedoutputstream, int i, int j)
    {
        int k = i;
        int l = bufferPutBits;
        k &= (1 << j) - 1;
        l += j;
        k <<= 24 - l;
        k |= bufferPutBuffer;
        for(; l >= 8; l -= 8)
        {
            int i1 = k >> 16 & 0xff;
            try
            {
                bufferedoutputstream.write(i1);
            }
            catch(IOException ioexception)
            {
                System.out.println("IO Error: " + ioexception.getMessage());
            }
            if(i1 == 255)
                try
                {
                    bufferedoutputstream.write(0);
                }
                catch(IOException ioexception1)
                {
                    System.out.println("IO Error: " + ioexception1.getMessage());
                }
            k <<= 8;
        }

        bufferPutBuffer = k;
        bufferPutBits = l;
    }

    void flushBuffer(BufferedOutputStream bufferedoutputstream)
    {
        int i = bufferPutBuffer;
        int j;
        for(j = bufferPutBits; j >= 8; j -= 8)
        {
            int k = i >> 16 & 0xff;
            try
            {
                bufferedoutputstream.write(k);
            }
            catch(IOException ioexception)
            {
                System.out.println("IO Error: " + ioexception.getMessage());
            }
            if(k == 255)
                try
                {
                    bufferedoutputstream.write(0);
                }
                catch(IOException ioexception1)
                {
                    System.out.println("IO Error: " + ioexception1.getMessage());
                }
            i <<= 8;
        }

        if(j > 0)
        {
            int l = i >> 16 & 0xff;
            try
            {
                bufferedoutputstream.write(l);
            }
            catch(IOException ioexception2)
            {
                System.out.println("IO Error: " + ioexception2.getMessage());
            }
        }
    }

    int bufferPutBits;
    int bufferPutBuffer;
    public int ImageHeight;
    public int ImageWidth;
    public int DC_matrix0[][];
    public int AC_matrix0[][];
    public int DC_matrix1[][];
    public int AC_matrix1[][];
    public Object DC_matrix[];
    public Object AC_matrix[];
    public int code;
    public int NumOfDCTables;
    public int NumOfACTables;
    public int bitsDCluminance[] = {
        0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 
        0, 0, 0, 0, 0, 0, 0
    };
    public int valDCluminance[] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
        10, 11
    };
    public int bitsDCchrominance[] = {
        1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 
        1, 1, 0, 0, 0, 0, 0
    };
    public int valDCchrominance[] = {
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
        10, 11
    };
    public int bitsACluminance[] = {
        16, 0, 2, 1, 3, 3, 2, 4, 3, 5, 
        5, 4, 4, 0, 0, 1, 125
    };
    public int valACluminance[] = {
        1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 
        65, 6, 19, 81, 97, 7, 34, 113, 20, 50, 
        129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 
        209, 240, 36, 51, 98, 114, 130, 9, 10, 22, 
        23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 
        52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 
        70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 
        88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 
        106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 
        132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 
        149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 
        166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 
        183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 
        200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 
        217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 
        233, 234, 241, 242, 243, 244, 245, 246, 247, 248, 
        249, 250
    };
    public int bitsACchrominance[] = {
        17, 0, 2, 1, 2, 4, 4, 3, 4, 7, 
        5, 4, 4, 0, 1, 2, 119
    };
    public int valACchrominance[] = {
        0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 
        18, 65, 81, 7, 97, 113, 19, 34, 50, 129, 
        8, 20, 66, 145, 161, 177, 193, 9, 35, 51, 
        82, 240, 21, 98, 114, 209, 10, 22, 36, 52, 
        225, 37, 241, 23, 24, 25, 26, 38, 39, 40, 
        41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 
        69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 
        87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 
        105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 
        130, 131, 132, 133, 134, 135, 136, 137, 138, 146, 
        147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 
        164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 
        181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 
        198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 
        215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 
        232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 
        249, 250
    };
    public Vector bits;
    public Vector val;
    public static int jpegNaturalOrder[] = {
        0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 
        32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 
        40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 
        21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 
        29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 
        52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 
        47, 55, 62, 63
    };

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -