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

📄 grayjpeg.java

📁 java高级使用教程 全书一共分六章
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

        // append bits
        code = EHUFCO[RS];
        size = EHUFSI[RS];
        writeData(code, size);

        // Mask off upper bits of ZZ
        ZZ &= ((1<<SSSS)-1);
       
        // append SSS low order bits of ZZ(K)
        writeData(ZZ, SSSS);
    }

    private void Generate_size_table() {
	// Generate HUFFSIZE table Flow Chart C.1
	K=0; I=1; J=1;
	while(true) {
	   if(J>BITS[I]) {
	      J=1; I++;
	      if(I > 16) break;
	   } else {
              HUFFSIZE[K++]=I;
              J++;
           }
	}
	HUFFSIZE[K] = 0;
	LASTK = K;
    }

    private void Generate_code_table() {
	// Generate Code table Flow Chart C.2
    	K = 0; CODE = 0; SI = HUFFSIZE[0];
    	while(true) {
    	    HUFFCODE[K++] = CODE++;
	    if(HUFFSIZE[K] == SI) continue;
	    if(HUFFSIZE[K] == 0)  break;
	    while(true){
		CODE<<=1; SI++;
		if(HUFFSIZE[K] == SI)
		    break;
	    }
	}
    }

    private void Order_codes() {
	// Order Codes Flow Chart C.3
    	K=0;
	while(true) {
	    I = HUFFVAL[K];
	    EHUFCO[I] = HUFFCODE[K];
	    EHUFSI[I] = HUFFSIZE[K++];
	    if(K >= LASTK) break;
	}
    }

    private int MagCat(int dat) {
        int ln;
        for(;;) {
           if(dat==0) { ln = 0; break; }
           if(dat==1) { ln = 1; break; }
           if(dat<=3) { ln = 2; break; }
           if(dat<=7) { ln = 3; break; }
           if(dat<=15) { ln = 4; break; }
           if(dat<=31) { ln = 5; break; }
           if(dat<=63) { ln = 6; break; }
           if(dat<=127) { ln = 7; break; }
           if(dat<=255) { ln = 8; break; }
           if(dat<=511) { ln = 9; break; }
           if(dat<=1023) { ln = 10; break; }
           if(dat<=2047) { ln = 11; break; }
        }
        return ln;
    }

    private void writeHeaders() {
	    try {
      	    fos.write(SOI);          // Start of Image marker
            fos.write(APP0);         // Application header
            fos.write(BE);           // JFIF BE jpg compression
       	    fos.write(QNT);          // Quantization table
            fos.write(SOF);          // Start of Frame marker
            fos.write(HuffDC);       // DC Huffman Table
            fos.write(HuffACHeader); // AC Huffman Table Header
            fos.write(Bits);         // AC Huffman Table
            fos.write(Huffval);      // AC Huffman Table
            fos.write(SOS);          // Start of Scan header
        } catch(IOException ioe) { System.err.println("IOException: " + ioe); }
    }

    private void writeEnd() {
	    try {
            fos.write(EOI);  // End of Image/File
   	        fos.close();
        } catch(IOException ioe) { System.err.println("IOException: " + ioe); }
    }

    private void getPixels(int[] data) {
	    PixelGrabber pg = new PixelGrabber(image.getSource(), 0, 0, X, Y, data, 0, X);
	    try { if(pg.grabPixels() != true) {
    		try {
    		    throw new AWTException("Grabber returned false: " + pg.status());
    		} catch (Exception ex) {
    		    System.err.println("System Failed to get Pixels! - " + ex);
    		    System.exit(0);
		};
    	    }
    	} catch (InterruptedException ent) {};
    }

    private void writeData(long dat, int bits) {
        int tmp;
        byte[] stuff = {0};
        byte[] d = new byte[1];

        if(bits>0) {
            DATA<<=bits;
            DATA+=dat;
            BitCnt+=bits;
        }else 
            return;
        
        // output bytes untill cnt is less then 8
        while(BitCnt>7) {
            BitCnt-=8;
            tmp=(int)(DATA>>BitCnt);
            d[0] = (byte)tmp;

            // mask off 8 msb of DATA
            DATA &= ((1<<BitCnt)-1);

            // write out data
	    try {
                fos.write(d);  // End of Image/File
                if(d[0]==-1)
                // if 0xFF data stuff 0x00 byte
                fos.write(stuff);
            } catch(IOException ioe) { System.err.println("IOException: " + ioe); }
        }
    }

    private void writeEndData() {
	byte[] d = new byte[1];
	// finish off scan data to byte boundry
	if(BitCnt>0) {
	    DATA<<=(8-BitCnt);
	    DATA+=((1<<(8-BitCnt))-1);
	    d[0] = (byte)DATA;
	    try {
		fos.write(d);
	    } catch(IOException ioe) { System.err.println("IOException: " + ioe); }
	}
    }

    private int[] FDCT(int[][] block) {
        int    j1, i, j;
        int[] blk = new int[64];
        float[] b = new float[8];
        float temp;
        float[] b1 = new float[8];
        float[][] d = new float[8][8];
        float f0=(float)0.7071068,f1=(float)0.4903926;
        float f2=(float)0.4619398,f3=(float)0.4157348;
        float f4=(float)0.3535534,f5=(float)0.2777851;
        float f6=(float)0.1913417,f7=(float)0.0975452;

        float df7f1=(float)-0.3928475,  sf7f1=(float)0.5879378 ;
        float df3f5=(float)0.1379497,   sf3f5=(float)0.6935199 ;
        float df6f2=(float)-0.27059805, sf6f2=(float).6532815 ;

        for(i = 0; i < 8; i++) {
           for(j = 0; j < 8; j++) {
              b[j] = block[i][j];
           }
           // Horizontal transform
           for(j = 0; j < 4; j++) {
              j1 = 7 - j;
              b1[j] = b[j] + b[j1];
              b1[j1] = b[j] - b[j1];
           }
           b[0] = b1[0] + b1[3];
           b[1] = b1[1] + b1[2];
           b[2] = b1[1] - b1[2];
           b[3] = b1[0] - b1[3];
           b[4] = b1[4];
           b[5] = (b1[6] - b1[5]) * f0;
           b[6] = (b1[6] + b1[5]) * f0;
           b[7] = b1[7];
           d[i][0] = (b[0] + b[1]) * f4;
           d[i][4] = (b[0] - b[1]) * f4;

           temp = (b[3]+b[2])*f6 ;
           d[i][2] = temp - b[3]*df6f2 ;
           d[i][6] = temp - b[2]*sf6f2 ;

           b1[4] = b[4] + b[5];
           b1[7] = b[7] + b[6];
           b1[5] = b[4] - b[5];
           b1[6] = b[7] - b[6];

           temp = (b1[7]+b1[4])*f7;
           d[i][1] = temp - b1[7]*df7f1 ;
           d[i][7] = temp - b1[4]*sf7f1 ;

           temp = (b1[6]+b1[5])*f3;
           d[i][5] = temp - b1[6]*df3f5 ;
           d[i][3] = temp - b1[5]*sf3f5 ;
        }

        // Vertical transform
        for(i = 0; i < 8; i++) {
           for(j = 0; j < 4; j++) {
              j1 = 7 - j;
              b1[j] = d[j][i] + d[j1][i];
              b1[j1] = d[j][i] - d[j1][i];
           }
           b[0] = b1[0] + b1[3];
           b[1] = b1[1] + b1[2];
           b[2] = b1[1] - b1[2];
           b[3] = b1[0] - b1[3];
           b[4] = b1[4];
           b[5] = (b1[6] - b1[5]) * f0;
           b[6] = (b1[6] + b1[5]) * f0;
           b[7] = b1[7];
           d[0][i] = (b[0] + b[1]) * f4;
           d[4][i] = (b[0] - b[1]) * f4;

           temp = (b[3]+b[2])*f6 ;
           d[2][i] = temp - b[3]*df6f2 ;
           d[6][i] = temp - b[2]*sf6f2 ;

           b1[4] = b[4] + b[5];
           b1[7] = b[7] + b[6];
           b1[5] = b[4] - b[5];
           b1[6] = b[7] - b[6];

           temp = (b1[7]+b1[4])*f7;
           d[1][i] = temp - b1[7]*df7f1 ;
           d[7][i] = temp - b1[4]*sf7f1 ;

           temp = (b1[6]+b1[5])*f3;
           d[5][i] = temp - b1[6]*df3f5 ;
           d[3][i] = temp - b1[5]*sf3f5 ;

        }
        for(i = 0; i < 8; i++) {
           for(j = 0; j < 8; j++) {
              // Quantize and ZigZag data block
              blk[ZZ[i][j]] = (int)(d[i][j]/QT[i][j]);
              
            }
         }
         return blk;
    }

    public static void main(String[] args) {
	try {
	    URL url = new URL(args[0]);
	    URLConnection uc = url.openConnection();
	    uc.connect();

	    // Got to open a stream to get around Java NullPointerException bug.
	    InputStream f = uc.getInputStream();

	    String mimeType = uc.getContentType();

	    // Java prints (not throws!) a ClassNotFoundException if you try
	    // a getContent on text.html or audio/basic (or no doubt many
	    // other types).
	    if ( ! mimeType.startsWith( "image/" ) )
		System.err.println( args[0] + " is not an image" );
	    else {
		Object content = uc.getContent();
		if ( ! ( content instanceof ImageProducer ) )
		    System.err.println( args[0] + " is not a known image type" );
		else {
		    ImageProducer prod = (ImageProducer) content;
		    Toolkit tk = new Acme.JPM.StubToolkit();
		    Image img = tk.createImage(prod);
		    GrayJPEG jpg = new GrayJPEG();
		    jpg.compress(img, System.out);
		}
	    }

	    // Done with unnecessary stream.
	    f.close();
	}
	catch ( Exception e ) {
	    System.err.println( e );
	}
    }
}

⌨️ 快捷键说明

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