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

📄 tile.java

📁 AjaxVNC 一个简单的远程控制服务器
💻 JAVA
字号:
/*
 * Tile.java
 *
 * Created on May 2, 2007, 2:46 AM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package hk.haha.onet.ajaxvnc;


import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.ImageObserver;
import java.awt.image.PixelGrabber;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.zip.Adler32;
import java.util.zip.CheckedOutputStream;
import javax.imageio.ImageIO;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.util.Iterator;
import javax.imageio.metadata.*;


/**
 *
 * @author heic
 */
public class Tile {
    
    private boolean DEBUG = false;
    
    private ByteArrayOutputStream stream;
    private Adler32 checksum;
    private long version;
    private boolean dirty;
    private int width;
    private int height;
    private static ImageWriter imgwriter;
    private static ImageWriteParam iwp;
    
    /** Creates a new instance of Tile */
    public Tile() {
        stream = new ByteArrayOutputStream();
        checksum = new Adler32();
        version = 0;
        dirty = true;
        width = 0;
        height = 0;
	// create image writer
	Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
	imgwriter = (ImageWriter)iter.next();
	iwp = imgwriter.getDefaultWriteParam();
	iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
	iwp.setCompressionQuality(Config.jpeg_quality);   // an integer between 0 and 1
	
	
    }
    private IIOMetadata getIIOMetadata(BufferedImage image, ImageWriter imageWriter, ImageWriteParam param) {
        ImageTypeSpecifier spec = ImageTypeSpecifier.createFromRenderedImage(image);
        IIOMetadata metadata = imageWriter.getDefaultImageMetadata(spec,param);
        return metadata;
    }
    
    private void writeImage(BufferedImage image, OutputStream outs)
    {
        try {
/*            ImageIO.write(image, "JPG", outs);*/
            width = image.getWidth();
            height = image.getHeight();
	    ImageOutputStream ios  = ImageIO.createImageOutputStream(outs);

		imgwriter.setOutput(ios);
		IIOMetadata meta = getIIOMetadata(image, imgwriter, iwp);
		imgwriter.write(meta, new IIOImage(image, null, meta), iwp);
		ios.flush();
	
	    
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public boolean updateImage(BufferedImage image)
    {
        long oldsum;
        CheckedOutputStream checkedstream;
        oldsum = checksum.getValue();
        checksum.reset();
        stream.reset();
        checkedstream = new CheckedOutputStream(stream, checksum);
        writeImage(image, checkedstream);
        if (oldsum != checksum.getValue()) {
            if (DEBUG) System.out.println(getClass().getName() + ": Version changed [" + stream.size() +"]");
            version++;
            dirty = true;
            return true;
        }
        else {
            if (DEBUG) System.out.println(getClass().getName() + ": Version unchange");
            return false;
        }
    }
    
    public int fileSize()
    {
	    return stream.size();
    }
    
    public boolean updateImage2(BufferedImage image)
    {
        long oldsum;
        oldsum = checksum.getValue();
        //calcChecksum(image);
        calcChecksum2(image);
        if (oldsum != checksum.getValue()) {
            if (DEBUG) System.out.println(getClass().getName() + ": Version changed [" + stream.size() +"]");
            stream.reset();
            writeImage(image, stream);
            version++;
            dirty = true;
            return true;
        }
        else {
            if (DEBUG) System.out.println(getClass().getName() + ": Version unchange");
            return false;
        }
    }
    
    public boolean isSameVersion(long ver)
    {
        if (ver != version) {
            return false;
        }
        else {
            return true;
        }
    }
    
    public boolean isDirty()
    {
        return dirty;
    }
    
    public void clearDirty()
    {
        dirty = false;
    }
    
    private void calcChecksum(BufferedImage image)
    {
        int w,h,p;
        DataBuffer db;
        db = image.getData().getDataBuffer();
        
        checksum.reset();
        w = db.getNumBanks();
        h = db.getSize() / w;
        
        for (int i=0; i<h; i+=15)
        {
            p = db.getElem(i);
            checksum.update(p);
        }
        
        //checksum.update(p);
    }
    
    private void calcChecksum2(BufferedImage image)
    {
        int w = image.getWidth();
        int h = image.getHeight();
        int pixels[] = new int[w*h];
        PixelGrabber pg = new PixelGrabber(image, 0, 0, w, h, pixels, 0, w);
        checksum.reset();
	try {
	    pg.grabPixels(1);
	} catch (InterruptedException e) {
	    System.err.println("interrupted waiting for pixels!");
	    return;
	}
	if ((pg.getStatus() & ImageObserver.ABORT) != 0) {
	    System.err.println("image fetch aborted or errored");
	    return;
	}
    
	for (int j = 0; j < h; j++) {
	    for (int i = 0; i < w; i++) {
                if ((j*w+i)%13==0)
                    checksum.update(pixels[j * w + i]);
	    }
	}
        
    }
    
    public byte[] getData()
    {
        return stream.toByteArray();
    }
    
    public int getWidth()
    {
        return width;
    }
    
    public int getHeight()
    {
        return height;
    }
}

⌨️ 快捷键说明

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