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

OA系统

开发平台:

Java

  1. // Decompiled by DJ v2.9.9.60 Copyright 2000 Atanas Neshkov  Date: 2002-12-05 9:38:29
  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.awt.Image;
  7. import java.io.*;
  8. import java.util.Vector;
  9. // Referenced classes of package com.objectplanet.chart.jpeg:
  10. //            JpegInfo, DCT, Huffman
  11. public class JpegEncoder
  12. {
  13.     public JpegEncoder(Image image1, int i, OutputStream outputstream)
  14.     {
  15.         Quality = i;
  16.         JpegObj = new JpegInfo(image1);
  17.         imageHeight = JpegObj.imageHeight;
  18.         imageWidth = JpegObj.imageWidth;
  19.         outStream = new BufferedOutputStream(outputstream);
  20.         dct = new DCT(Quality);
  21.         Huf = new Huffman(imageWidth, imageHeight);
  22.     }
  23.     public void Compress()
  24.     {
  25.         WriteHeaders(outStream);
  26.         WriteCompressedData(outStream);
  27.         WriteEOI(outStream);
  28.         try
  29.         {
  30.             outStream.flush();
  31.         }
  32.         catch(IOException ioexception)
  33.         {
  34.             System.out.println("IO Error: " + ioexception.getMessage());
  35.         }
  36.     }
  37.     public void WriteCompressedData(BufferedOutputStream bufferedoutputstream)
  38.     {
  39.         float af1[][] = new float[8][8];
  40.         double ad[][] = new double[8][8];
  41.         int ai[] = new int[64];
  42.         int ai2[] = new int[JpegObj.NumberOfComponents];
  43.         int[] _tmp = new int[64];
  44.         boolean flag1 = false;
  45.         boolean flag2 = false;
  46.         int k3 = imageWidth % 8 == 0 ? imageWidth : (int)(Math.floor((double)imageWidth / 8D) + 1.0D) * 8;
  47.         int l3 = imageHeight % 8 == 0 ? imageHeight : (int)(Math.floor((double)imageHeight / 8D) + 1.0D) * 8;
  48.         for(int k1 = 0; k1 < JpegObj.NumberOfComponents; k1++)
  49.         {
  50.             k3 = Math.min(k3, JpegObj.BlockWidth[k1]);
  51.             l3 = Math.min(l3, JpegObj.BlockHeight[k1]);
  52.         }
  53.         boolean flag = false;
  54.         for(int k = 0; k < l3; k++)
  55.         {
  56.             for(int l = 0; l < k3; l++)
  57.             {
  58.                 int i2 = l * 8;
  59.                 int j2 = k * 8;
  60.                 for(int l1 = 0; l1 < JpegObj.NumberOfComponents; l1++)
  61.                 {
  62.                     int i3 = JpegObj.BlockWidth[l1];
  63.                     int j3 = JpegObj.BlockHeight[l1];
  64.                     float af[][] = (float[][])JpegObj.Components[l1];
  65.                     for(int i = 0; i < JpegObj.VsampFactor[l1]; i++)
  66.                     {
  67.                         for(int j = 0; j < JpegObj.HsampFactor[l1]; j++)
  68.                         {
  69.                             int k2 = j * 8;
  70.                             int l2 = i * 8;
  71.                             int i1 = 0;
  72.                             do
  73.                             {
  74.                                 int j1 = 0;
  75.                                 do
  76.                                     af1[i1][j1] = af[j2 + l2 + i1][i2 + k2 + j1];
  77.                                 while(++j1 < 8);
  78.                             } while(++i1 < 8);
  79.                             double ad1[][] = dct.forwardDCT(af1);
  80.                             int ai1[] = dct.quantizeBlock(ad1, JpegObj.QtableNumber[l1]);
  81.                             Huf.HuffmanBlockEncoder(bufferedoutputstream, ai1, ai2[l1], JpegObj.DCtableNumber[l1], JpegObj.ACtableNumber[l1]);
  82.                             ai2[l1] = ai1[0];
  83.                         }
  84.                     }
  85.                 }
  86.             }
  87.         }
  88.         Huf.flushBuffer(bufferedoutputstream);
  89.     }
  90.     public void WriteHeaders(BufferedOutputStream bufferedoutputstream)
  91.     {
  92.         byte abyte0[] = {
  93.             -1, -40
  94.         };
  95.         WriteMarker(abyte0, bufferedoutputstream);
  96.         byte abyte1[] = new byte[18];
  97.         abyte1[0] = -1;
  98.         abyte1[1] = -32;
  99.         abyte1[2] = 0;
  100.         abyte1[3] = 16;
  101.         abyte1[4] = 74;
  102.         abyte1[5] = 70;
  103.         abyte1[6] = 73;
  104.         abyte1[7] = 70;
  105.         abyte1[8] = 0;
  106.         abyte1[9] = 1;
  107.         abyte1[10] = 0;
  108.         abyte1[11] = 0;
  109.         abyte1[12] = 0;
  110.         abyte1[13] = 1;
  111.         abyte1[14] = 0;
  112.         abyte1[15] = 1;
  113.         abyte1[16] = 0;
  114.         abyte1[17] = 0;
  115.         WriteArray(abyte1, bufferedoutputstream);
  116.         String s = new String();
  117.         s = JpegObj.getComment();
  118.         int l1 = s.length();
  119.         byte abyte2[] = new byte[l1 + 4];
  120.         abyte2[0] = -1;
  121.         abyte2[1] = -2;
  122.         abyte2[2] = (byte)(l1 >> 8 & 0xff);
  123.         abyte2[3] = (byte)(l1 & 0xff);
  124.         System.arraycopy(JpegObj.Comment.getBytes(), 0, abyte2, 4, JpegObj.Comment.length());
  125.         WriteArray(abyte2, bufferedoutputstream);
  126.         byte abyte3[] = new byte[134];
  127.         abyte3[0] = -1;
  128.         abyte3[1] = -37;
  129.         abyte3[2] = 0;
  130.         abyte3[3] = -124;
  131.         int k1 = 4;
  132.         int i = 0;
  133.         do
  134.         {
  135.             abyte3[k1++] = (byte)i;
  136.             int ai[] = (int[])dct.quantum[i];
  137.             int k = 0;
  138.             do
  139.                 abyte3[k1++] = (byte)ai[jpegNaturalOrder[k]];
  140.             while(++k < 64);
  141.         } while(++i < 2);
  142.         WriteArray(abyte3, bufferedoutputstream);
  143.         byte abyte4[] = new byte[19];
  144.         abyte4[0] = -1;
  145.         abyte4[1] = -64;
  146.         abyte4[2] = 0;
  147.         abyte4[3] = 17;
  148.         abyte4[4] = (byte)JpegObj.Precision;
  149.         abyte4[5] = (byte)(JpegObj.imageHeight >> 8 & 0xff);
  150.         abyte4[6] = (byte)(JpegObj.imageHeight & 0xff);
  151.         abyte4[7] = (byte)(JpegObj.imageWidth >> 8 & 0xff);
  152.         abyte4[8] = (byte)(JpegObj.imageWidth & 0xff);
  153.         abyte4[9] = (byte)JpegObj.NumberOfComponents;
  154.         int j1 = 10;
  155.         for(i = 0; i < abyte4[9]; i++)
  156.         {
  157.             abyte4[j1++] = (byte)JpegObj.CompID[i];
  158.             abyte4[j1++] = (byte)((JpegObj.HsampFactor[i] << 4) + JpegObj.VsampFactor[i]);
  159.             abyte4[j1++] = (byte)JpegObj.QtableNumber[i];
  160.         }
  161.         WriteArray(abyte4, bufferedoutputstream);
  162.         l1 = 2;
  163.         j1 = 4;
  164.         int k2 = 4;
  165.         byte abyte5[] = new byte[17];
  166.         byte abyte8[] = new byte[4];
  167.         abyte8[0] = -1;
  168.         abyte8[1] = -60;
  169.         i = 0;
  170.         do
  171.         {
  172.             int i2 = 0;
  173.             abyte5[j1++ - k2] = (byte)((int[])Huf.bits.elementAt(i))[0];
  174.             int l = 1;
  175.             do
  176.             {
  177.                 int j2 = ((int[])Huf.bits.elementAt(i))[l];
  178.                 abyte5[j1++ - k2] = (byte)j2;
  179.                 i2 += j2;
  180.             } while(++l < 17);
  181.             int l2 = j1;
  182.             byte abyte6[] = new byte[i2];
  183.             for(int i1 = 0; i1 < i2; i1++)
  184.                 abyte6[j1++ - l2] = (byte)((int[])Huf.val.elementAt(i))[i1];
  185.             byte abyte7[] = new byte[j1];
  186.             System.arraycopy(abyte8, 0, abyte7, 0, k2);
  187.             System.arraycopy(abyte5, 0, abyte7, k2, 17);
  188.             System.arraycopy(abyte6, 0, abyte7, k2 + 17, i2);
  189.             abyte8 = abyte7;
  190.             k2 = j1;
  191.         } while(++i < 4);
  192.         abyte8[2] = (byte)(j1 - 2 >> 8 & 0xff);
  193.         abyte8[3] = (byte)(j1 - 2 & 0xff);
  194.         WriteArray(abyte8, bufferedoutputstream);
  195.         byte abyte9[] = new byte[14];
  196.         abyte9[0] = -1;
  197.         abyte9[1] = -38;
  198.         abyte9[2] = 0;
  199.         abyte9[3] = 12;
  200.         abyte9[4] = (byte)JpegObj.NumberOfComponents;
  201.         j1 = 5;
  202.         for(int j = 0; j < abyte9[4]; j++)
  203.         {
  204.             abyte9[j1++] = (byte)JpegObj.CompID[j];
  205.             abyte9[j1++] = (byte)((JpegObj.DCtableNumber[j] << 4) + JpegObj.ACtableNumber[j]);
  206.         }
  207.         abyte9[j1++] = (byte)JpegObj.Ss;
  208.         abyte9[j1++] = (byte)JpegObj.Se;
  209.         abyte9[j1++] = (byte)((JpegObj.Ah << 4) + JpegObj.Al);
  210.         WriteArray(abyte9, bufferedoutputstream);
  211.     }
  212.     void WriteMarker(byte abyte0[], BufferedOutputStream bufferedoutputstream)
  213.     {
  214.         try
  215.         {
  216.             bufferedoutputstream.write(abyte0, 0, 2);
  217.         }
  218.         catch(IOException ioexception)
  219.         {
  220.             System.out.println("IO Error: " + ioexception.getMessage());
  221.         }
  222.     }
  223.     public void setQuality(int i)
  224.     {
  225.         dct = new DCT(i);
  226.     }
  227.     public int getQuality()
  228.     {
  229.         return Quality;
  230.     }
  231.     void WriteArray(byte abyte0[], BufferedOutputStream bufferedoutputstream)
  232.     {
  233.         try
  234.         {
  235.             int i = ((abyte0[2] & 0xff) << 8) + (abyte0[3] & 0xff) + 2;
  236.             bufferedoutputstream.write(abyte0, 0, i);
  237.         }
  238.         catch(IOException ioexception)
  239.         {
  240.             System.out.println("IO Error: " + ioexception.getMessage());
  241.         }
  242.     }
  243.     public void WriteEOI(BufferedOutputStream bufferedoutputstream)
  244.     {
  245.         byte abyte0[] = {
  246.             -1, -39
  247.         };
  248.         WriteMarker(abyte0, bufferedoutputstream);
  249.     }
  250.     Thread runner;
  251.     BufferedOutputStream outStream;
  252.     Image image;
  253.     JpegInfo JpegObj;
  254.     Huffman Huf;
  255.     DCT dct;
  256.     int imageHeight;
  257.     int imageWidth;
  258.     int Quality;
  259.     int code;
  260.     public static int jpegNaturalOrder[] = {
  261.         0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 
  262.         32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 
  263.         40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 
  264.         21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 
  265.         29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 
  266.         52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 
  267.         47, 55, 62, 63
  268.     };
  269. }