压缩图片

import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

/**
 * 图像压缩工具
 * 
 * @author KevinKuang
 * 
 */
public class ImageSizer 
{
	public static final MediaTracker tracker = new MediaTracker(
			new Component()
			{
				private static final long serialVersionUID = 1234162663955668507L;
			});

	/**
	 * 
	 * 
	 * @param imageData
	 *            原图像数据
	 * @param resizedFile
	 *            压缩后的图像文件
	 * @param format
	 *            图片格式 jpg, png, gif(非动画)
	 * @throws IOException
	 */
	public void resize(byte [] imageData, File resizedFile,
			String format) throws Exception
	{
		if (format != null && "gif".equals(format.toLowerCase())) 
		{
			return;
		}
//		ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
//		int readLength = -1;
//		int bufferSize = 1024;
//		byte bytes[] = new byte[bufferSize];
//		while ((readLength = fis.read(bytes, 0, bufferSize)) != -1) 
//		{
//			byteStream.write(bytes, 0, readLength);
//		}
//		byte[] ins = byteStream.toByteArray();
//		fis.close();
//		byteStream.close();
		
		Image inputImage = Toolkit.getDefaultToolkit().createImage(imageData);
		waitForImage(inputImage);
		int imageWidth = inputImage.getWidth(null);
		
		/* 图片宽  最大值 */
		if(imageWidth > 675)
		{
			imageWidth = 675;
		}
		if (imageWidth < 1)
			throw new IllegalArgumentException("image width " + imageWidth
					+ " is out of range");
		int imageHeight = inputImage.getHeight(null);
		if (imageHeight < 1)
			throw new IllegalArgumentException("image height " + imageHeight
					+ " is out of range");

		// Create output image.
		int height = -1;
		double scaleW = (double) imageWidth / (double) imageWidth;
		double scaleY = (double) imageHeight / (double) height;
		if (scaleW >= 0 && scaleY >= 0) {
			if (scaleW > scaleY) {
				height = -1;
			} else {
				imageWidth = -1;
			}
		}
		Image outputImage = inputImage.getScaledInstance(imageWidth, height,
				java.awt.Image.SCALE_DEFAULT);
		checkImage(outputImage);
		encode(new FileOutputStream(resizedFile), outputImage, format);
	}

	/** Checks the given image for valid width and height. */
	private static void checkImage(Image image) throws Exception
	{
		waitForImage(image);
		int imageWidth = image.getWidth(null);
		if (imageWidth < 1)
			throw new IllegalArgumentException("image width " + imageWidth
					+ " is out of range");
		int imageHeight = image.getHeight(null);
		if (imageHeight < 1)
			throw new IllegalArgumentException("image height " + imageHeight
					+ " is out of range");
	}

	/**
	 * Waits for given image to load. Use before querying image
	 * height/width/colors.
	 */
	private static void waitForImage(Image image) throws Exception
	{
		tracker.addImage(image, 0);
		tracker.waitForID(0);
		tracker.removeImage(image, 0);	
	}

	/** Encodes the given image at the given quality to the output stream. */
	private void encode(OutputStream outputStream, Image outputImage,
			String format) throws java.io.IOException 
	{
		int outputWidth = outputImage.getWidth(null);
		
		if (outputWidth < 1)
			throw new IllegalArgumentException("output image width "
					+ outputWidth + " is out of range");
		int outputHeight = outputImage.getHeight(null);
		if (outputHeight < 1)
			throw new IllegalArgumentException("output image height "
					+ outputHeight + " is out of range");
		
		BufferedImage bi = new BufferedImage(outputWidth, outputHeight,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D biContext = bi.createGraphics();
		biContext.drawImage(outputImage, 0, 0, null);
		ImageIO.write(bi, format, outputStream);
//		System.out.println("----the end ------");
		outputStream.flush();
		outputStream.close();
	}
	
	/**
	 * 压缩图片
	 * 
	 * @param ipuntFile
	 * 
	 * @param outFile
	 * 
	 * @param postfix
	 * 
	 * @throws Exception
	 */
	public void imageCompress(byte[] imageData,File outFile,String postfix) throws Exception
	{
		resize(imageData,outFile,postfix);
	}
}

 

你可能感兴趣的:(java图片压缩,压缩质量棒棒的)