Huffman.java
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:11k
源码类别:

OA系统

开发平台:

Java

  1. // Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2002-12-05 9:38:13
  2. // Home Page : http://members.fortunecity.com/neshkov/dj.html  - Check often for new version!
  3. // Decompiler options: packimports(3) 
  4. // Source File Name:   JpegEncoder.java
  5. package cn.com.fcsoft.chart.jpeg;
  6. import java.io.*;
  7. import java.util.Vector;
  8. class Huffman
  9. {
  10.     public Huffman(int i, int j)
  11.     {
  12.         bits = new Vector();
  13.         bits.addElement(bitsDCluminance);
  14.         bits.addElement(bitsACluminance);
  15.         bits.addElement(bitsDCchrominance);
  16.         bits.addElement(bitsACchrominance);
  17.         val = new Vector();
  18.         val.addElement(valDCluminance);
  19.         val.addElement(valACluminance);
  20.         val.addElement(valDCchrominance);
  21.         val.addElement(valACchrominance);
  22.         initHuf();
  23.         code = code;
  24.         ImageWidth = i;
  25.         ImageHeight = j;
  26.     }
  27.     public void HuffmanBlockEncoder(BufferedOutputStream bufferedoutputstream, int ai[], int i, int j, int k)
  28.     {
  29.         NumOfDCTables = 2;
  30.         NumOfACTables = 2;
  31.         int i1;
  32.         int l = i1 = ai[0] - i;
  33.         if(l < 0)
  34.         {
  35.             l = -l;
  36.             i1--;
  37.         }
  38.         int k1 = 0;
  39.         for(; l != 0; l >>= 1)
  40.             k1++;
  41.         bufferIt(bufferedoutputstream, ((int[][])DC_matrix[j])[k1][0], ((int[][])DC_matrix[j])[k1][1]);
  42.         if(k1 != 0)
  43.             bufferIt(bufferedoutputstream, i1, k1);
  44.         int j2 = 0;
  45.         int i2 = 1;
  46.         do
  47.             if((l = ai[jpegNaturalOrder[i2]]) == 0)
  48.             {
  49.                 j2++;
  50.             } else
  51.             {
  52.                 for(; j2 > 15; j2 -= 16)
  53.                     bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[240][0], ((int[][])AC_matrix[k])[240][1]);
  54.                 int j1 = l;
  55.                 if(l < 0)
  56.                 {
  57.                     l = -l;
  58.                     j1--;
  59.                 }
  60.                 int l1;
  61.                 for(l1 = 1; (l >>= 1) != 0; l1++);
  62.                 int k2 = (j2 << 4) + l1;
  63.                 bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[k2][0], ((int[][])AC_matrix[k])[k2][1]);
  64.                 bufferIt(bufferedoutputstream, j1, l1);
  65.                 j2 = 0;
  66.             }
  67.         while(++i2 < 64);
  68.         if(j2 > 0)
  69.             bufferIt(bufferedoutputstream, ((int[][])AC_matrix[k])[0][0], ((int[][])AC_matrix[k])[0][1]);
  70.     }
  71.     public void initHuf()
  72.     {
  73.         DC_matrix0 = new int[12][2];
  74.         DC_matrix1 = new int[12][2];
  75.         AC_matrix0 = new int[255][2];
  76.         AC_matrix1 = new int[255][2];
  77.         DC_matrix = new Object[2];
  78.         AC_matrix = new Object[2];
  79.         int ai[] = new int[257];
  80.         int ai1[] = new int[257];
  81.         int i = 0;
  82.         int k = 1;
  83.         do
  84.         {
  85.             for(int l = 1; l <= bitsDCchrominance[k]; l++)
  86.                 ai[i++] = k;
  87.         } while(++k <= 16);
  88.         ai[i] = 0;
  89.         int l1 = i;
  90.         int j2 = 0;
  91.         int i2 = ai[0];
  92.         for(i = 0; ai[i] != 0;)
  93.         {
  94.             while(ai[i] == i2) 
  95.             {
  96.                 ai1[i++] = j2;
  97.                 j2++;
  98.             }
  99.             j2 <<= 1;
  100.             i2++;
  101.         }
  102.         for(i = 0; i < l1; i++)
  103.         {
  104.             DC_matrix1[valDCchrominance[i]][0] = ai1[i];
  105.             DC_matrix1[valDCchrominance[i]][1] = ai[i];
  106.         }
  107.         i = 0;
  108.         k = 1;
  109.         do
  110.         {
  111.             for(int i1 = 1; i1 <= bitsACchrominance[k]; i1++)
  112.                 ai[i++] = k;
  113.         } while(++k <= 16);
  114.         ai[i] = 0;
  115.         l1 = i;
  116.         j2 = 0;
  117.         i2 = ai[0];
  118.         for(i = 0; ai[i] != 0;)
  119.         {
  120.             while(ai[i] == i2) 
  121.             {
  122.                 ai1[i++] = j2;
  123.                 j2++;
  124.             }
  125.             j2 <<= 1;
  126.             i2++;
  127.         }
  128.         for(i = 0; i < l1; i++)
  129.         {
  130.             AC_matrix1[valACchrominance[i]][0] = ai1[i];
  131.             AC_matrix1[valACchrominance[i]][1] = ai[i];
  132.         }
  133.         i = 0;
  134.         k = 1;
  135.         do
  136.         {
  137.             for(int j1 = 1; j1 <= bitsDCluminance[k]; j1++)
  138.                 ai[i++] = k;
  139.         } while(++k <= 16);
  140.         ai[i] = 0;
  141.         l1 = i;
  142.         j2 = 0;
  143.         i2 = ai[0];
  144.         for(i = 0; ai[i] != 0;)
  145.         {
  146.             while(ai[i] == i2) 
  147.             {
  148.                 ai1[i++] = j2;
  149.                 j2++;
  150.             }
  151.             j2 <<= 1;
  152.             i2++;
  153.         }
  154.         for(i = 0; i < l1; i++)
  155.         {
  156.             DC_matrix0[valDCluminance[i]][0] = ai1[i];
  157.             DC_matrix0[valDCluminance[i]][1] = ai[i];
  158.         }
  159.         i = 0;
  160.         k = 1;
  161.         do
  162.         {
  163.             for(int k1 = 1; k1 <= bitsACluminance[k]; k1++)
  164.                 ai[i++] = k;
  165.         } while(++k <= 16);
  166.         ai[i] = 0;
  167.         l1 = i;
  168.         j2 = 0;
  169.         i2 = ai[0];
  170.         for(int j = 0; ai[j] != 0;)
  171.         {
  172.             while(ai[j] == i2) 
  173.             {
  174.                 ai1[j++] = j2;
  175.                 j2++;
  176.             }
  177.             j2 <<= 1;
  178.             i2++;
  179.         }
  180.         for(int k2 = 0; k2 < l1; k2++)
  181.         {
  182.             AC_matrix0[valACluminance[k2]][0] = ai1[k2];
  183.             AC_matrix0[valACluminance[k2]][1] = ai[k2];
  184.         }
  185.         DC_matrix[0] = DC_matrix0;
  186.         DC_matrix[1] = DC_matrix1;
  187.         AC_matrix[0] = AC_matrix0;
  188.         AC_matrix[1] = AC_matrix1;
  189.     }
  190.     void bufferIt(BufferedOutputStream bufferedoutputstream, int i, int j)
  191.     {
  192.         int k = i;
  193.         int l = bufferPutBits;
  194.         k &= (1 << j) - 1;
  195.         l += j;
  196.         k <<= 24 - l;
  197.         k |= bufferPutBuffer;
  198.         for(; l >= 8; l -= 8)
  199.         {
  200.             int i1 = k >> 16 & 0xff;
  201.             try
  202.             {
  203.                 bufferedoutputstream.write(i1);
  204.             }
  205.             catch(IOException ioexception)
  206.             {
  207.                 System.out.println("IO Error: " + ioexception.getMessage());
  208.             }
  209.             if(i1 == 255)
  210.                 try
  211.                 {
  212.                     bufferedoutputstream.write(0);
  213.                 }
  214.                 catch(IOException ioexception1)
  215.                 {
  216.                     System.out.println("IO Error: " + ioexception1.getMessage());
  217.                 }
  218.             k <<= 8;
  219.         }
  220.         bufferPutBuffer = k;
  221.         bufferPutBits = l;
  222.     }
  223.     void flushBuffer(BufferedOutputStream bufferedoutputstream)
  224.     {
  225.         int i = bufferPutBuffer;
  226.         int j;
  227.         for(j = bufferPutBits; j >= 8; j -= 8)
  228.         {
  229.             int k = i >> 16 & 0xff;
  230.             try
  231.             {
  232.                 bufferedoutputstream.write(k);
  233.             }
  234.             catch(IOException ioexception)
  235.             {
  236.                 System.out.println("IO Error: " + ioexception.getMessage());
  237.             }
  238.             if(k == 255)
  239.                 try
  240.                 {
  241.                     bufferedoutputstream.write(0);
  242.                 }
  243.                 catch(IOException ioexception1)
  244.                 {
  245.                     System.out.println("IO Error: " + ioexception1.getMessage());
  246.                 }
  247.             i <<= 8;
  248.         }
  249.         if(j > 0)
  250.         {
  251.             int l = i >> 16 & 0xff;
  252.             try
  253.             {
  254.                 bufferedoutputstream.write(l);
  255.             }
  256.             catch(IOException ioexception2)
  257.             {
  258.                 System.out.println("IO Error: " + ioexception2.getMessage());
  259.             }
  260.         }
  261.     }
  262.     int bufferPutBits;
  263.     int bufferPutBuffer;
  264.     public int ImageHeight;
  265.     public int ImageWidth;
  266.     public int DC_matrix0[][];
  267.     public int AC_matrix0[][];
  268.     public int DC_matrix1[][];
  269.     public int AC_matrix1[][];
  270.     public Object DC_matrix[];
  271.     public Object AC_matrix[];
  272.     public int code;
  273.     public int NumOfDCTables;
  274.     public int NumOfACTables;
  275.     public int bitsDCluminance[] = {
  276.         0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 
  277.         0, 0, 0, 0, 0, 0, 0
  278.     };
  279.     public int valDCluminance[] = {
  280.         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
  281.         10, 11
  282.     };
  283.     public int bitsDCchrominance[] = {
  284.         1, 0, 3, 1, 1, 1, 1, 1, 1, 1, 
  285.         1, 1, 0, 0, 0, 0, 0
  286.     };
  287.     public int valDCchrominance[] = {
  288.         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
  289.         10, 11
  290.     };
  291.     public int bitsACluminance[] = {
  292.         16, 0, 2, 1, 3, 3, 2, 4, 3, 5, 
  293.         5, 4, 4, 0, 0, 1, 125
  294.     };
  295.     public int valACluminance[] = {
  296.         1, 2, 3, 0, 4, 17, 5, 18, 33, 49, 
  297.         65, 6, 19, 81, 97, 7, 34, 113, 20, 50, 
  298.         129, 145, 161, 8, 35, 66, 177, 193, 21, 82, 
  299.         209, 240, 36, 51, 98, 114, 130, 9, 10, 22, 
  300.         23, 24, 25, 26, 37, 38, 39, 40, 41, 42, 
  301.         52, 53, 54, 55, 56, 57, 58, 67, 68, 69, 
  302.         70, 71, 72, 73, 74, 83, 84, 85, 86, 87, 
  303.         88, 89, 90, 99, 100, 101, 102, 103, 104, 105, 
  304.         106, 115, 116, 117, 118, 119, 120, 121, 122, 131, 
  305.         132, 133, 134, 135, 136, 137, 138, 146, 147, 148, 
  306.         149, 150, 151, 152, 153, 154, 162, 163, 164, 165, 
  307.         166, 167, 168, 169, 170, 178, 179, 180, 181, 182, 
  308.         183, 184, 185, 186, 194, 195, 196, 197, 198, 199, 
  309.         200, 201, 202, 210, 211, 212, 213, 214, 215, 216, 
  310.         217, 218, 225, 226, 227, 228, 229, 230, 231, 232, 
  311.         233, 234, 241, 242, 243, 244, 245, 246, 247, 248, 
  312.         249, 250
  313.     };
  314.     public int bitsACchrominance[] = {
  315.         17, 0, 2, 1, 2, 4, 4, 3, 4, 7, 
  316.         5, 4, 4, 0, 1, 2, 119
  317.     };
  318.     public int valACchrominance[] = {
  319.         0, 1, 2, 3, 17, 4, 5, 33, 49, 6, 
  320.         18, 65, 81, 7, 97, 113, 19, 34, 50, 129, 
  321.         8, 20, 66, 145, 161, 177, 193, 9, 35, 51, 
  322.         82, 240, 21, 98, 114, 209, 10, 22, 36, 52, 
  323.         225, 37, 241, 23, 24, 25, 26, 38, 39, 40, 
  324.         41, 42, 53, 54, 55, 56, 57, 58, 67, 68, 
  325.         69, 70, 71, 72, 73, 74, 83, 84, 85, 86, 
  326.         87, 88, 89, 90, 99, 100, 101, 102, 103, 104, 
  327.         105, 106, 115, 116, 117, 118, 119, 120, 121, 122, 
  328.         130, 131, 132, 133, 134, 135, 136, 137, 138, 146, 
  329.         147, 148, 149, 150, 151, 152, 153, 154, 162, 163, 
  330.         164, 165, 166, 167, 168, 169, 170, 178, 179, 180, 
  331.         181, 182, 183, 184, 185, 186, 194, 195, 196, 197, 
  332.         198, 199, 200, 201, 202, 210, 211, 212, 213, 214, 
  333.         215, 216, 217, 218, 226, 227, 228, 229, 230, 231, 
  334.         232, 233, 234, 242, 243, 244, 245, 246, 247, 248, 
  335.         249, 250
  336.     };
  337.     public Vector bits;
  338.     public Vector val;
  339.     public static int jpegNaturalOrder[] = {
  340.         0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 
  341.         32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 
  342.         40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 
  343.         21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 
  344.         29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 
  345.         52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 
  346.         47, 55, 62, 63
  347.     };
  348. }