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); } }