java压缩图片

java压缩图片(转自http://zhuhichn.iteye.com/blog/509343)

 

在我们浏览网页的时候,我们呢时常见到这样的效果,点击小图见大图,这里用到的技术便是图片压缩技术,是两张图片,不过是名字一样,在java中,同样可以实现图片的压缩处理,在网上好像找不到拿来就能用的,下面的这个可以用,但是有一些限制,只能压缩一些特定的图片文件,jpg,png,gif(非动画),大家可以研究下代码,根据代码自己去扩展合适的压缩类型,实际中,这些已经差不多可以运用了,下面是代码和在junit单元测试实例

 

Java代码 
  1. package com.sport.utils;  
  2.   
  3. import java.awt.Color;  
  4. import java.awt.Component;  
  5. import java.awt.Graphics;  
  6. import java.awt.Graphics2D;  
  7. import java.awt.Image;  
  8. import java.awt.MediaTracker;  
  9. import java.awt.Toolkit;  
  10. import java.awt.image.BufferedImage;  
  11. import java.awt.image.ConvolveOp;  
  12. import java.awt.image.Kernel;  
  13. import java.io.ByteArrayOutputStream;  
  14. import java.io.File;  
  15. import java.io.FileInputStream;  
  16. import java.io.FileOutputStream;  
  17. import java.io.IOException;  
  18. import java.io.OutputStream;  
  19.   
  20. import javax.imageio.ImageIO;  
  21. import javax.swing.ImageIcon;  
  22.   
  23. import com.sun.image.codec.jpeg.JPEGCodec;  
  24. import com.sun.image.codec.jpeg.JPEGEncodeParam;  
  25. import com.sun.image.codec.jpeg.JPEGImageEncoder;  
  26.   
  27. /** 
  28.  * 图像压缩工具 
  29.  * @author  
  30.  * 
  31.  */  
  32. public class ImageSizer {  
  33.     public static final MediaTracker tracker = new MediaTracker(new Component() {  
  34.         private static final long serialVersionUID = 1234162663955668507L;}   
  35.     );  
  36.     /** 
  37.      * @param originalFile 原图像 
  38.      * @param resizedFile 压缩后的图像 
  39.      * @param width 图像宽 
  40.      * @param format 图片格式 jpg, png, gif(非动画) 
  41.      * @throws IOException 
  42.      */  
  43.     public static void resize(File originalFile, File resizedFile, int width, String format) throws IOException {  
  44.         if(format!=null && "gif".equals(format.toLowerCase())){  
  45.             resize(originalFile, resizedFile, width, 1);  
  46.             return;  
  47.         }  
  48.         FileInputStream fis = new FileInputStream(originalFile);  
  49.         ByteArrayOutputStream byteStream = new ByteArrayOutputStream();  
  50.         int readLength = -1;  
  51.         int bufferSize = 1024;  
  52.         byte bytes[] = new byte[bufferSize];  
  53.         while ((readLength = fis.read(bytes, 0, bufferSize)) != -1) {  
  54.             byteStream.write(bytes, 0, readLength);  
  55.         }  
  56.         byte[] in = byteStream.toByteArray();  
  57.         fis.close();  
  58.         byteStream.close();  
  59.           
  60.         Image inputImage = Toolkit.getDefaultToolkit().createImage( in );  
  61.         waitForImage( inputImage );  
  62.         int imageWidth = inputImage.getWidth( null );  
  63.         if ( imageWidth < 1 )   
  64.            throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );  
  65.         int imageHeight = inputImage.getHeight( null );  
  66.         if ( imageHeight < 1 )   
  67.            throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );  
  68.           
  69.         // Create output image.  
  70.         int height = -1;  
  71.         double scaleW = (double) imageWidth / (double) width;  
  72.         double scaleY = (double) imageHeight / (double) height;  
  73.         if (scaleW >= 0 && scaleY >=0) {  
  74.             if (scaleW > scaleY) {  
  75.                 height = -1;  
  76.             } else {  
  77.                 width = -1;  
  78.             }  
  79.         }  
  80.         Image outputImage = inputImage.getScaledInstance( width, height, java.awt.Image.SCALE_DEFAULT);  
  81.         checkImage( outputImage );          
  82.         encode(new FileOutputStream(resizedFile), outputImage, format);          
  83.     }      
  84.   
  85.     /** Checks the given image for valid width and height. */  
  86.     private static void checkImage( Image image ) {  
  87.        waitForImage( image );  
  88.        int imageWidth = image.getWidth( null );  
  89.        if ( imageWidth < 1 )   
  90.           throw new IllegalArgumentException( "image width " + imageWidth + " is out of range" );  
  91.        int imageHeight = image.getHeight( null );  
  92.        if ( imageHeight < 1 )   
  93.           throw new IllegalArgumentException( "image height " + imageHeight + " is out of range" );  
  94.     }  
  95.   
  96.     /** Waits for given image to load. Use before querying image height/width/colors. */  
  97.     private static void waitForImage( Image image ) {  
  98.        try {  
  99.           tracker.addImage( image, 0 );  
  100.           tracker.waitForID( 0 );  
  101.           tracker.removeImage(image, 0);  
  102.        } catch( InterruptedException e ) { e.printStackTrace(); }  
  103.     }   
  104.   
  105.     /** Encodes the given image at the given quality to the output stream. */  
  106.     private static void encode( OutputStream outputStream, Image outputImage, String format )   
  107.        throws java.io.IOException {  
  108.        int outputWidth  = outputImage.getWidth( null );  
  109.        if ( outputWidth < 1 )   
  110.           throw new IllegalArgumentException( "output image width " + outputWidth + " is out of range" );  
  111.        int outputHeight = outputImage.getHeight( null );  
  112.        if ( outputHeight < 1 )   
  113.           throw new IllegalArgumentException( "output image height " + outputHeight + " is out of range" );  
  114.   
  115.        // Get a buffered image from the image.  
  116.        BufferedImage bi = new BufferedImage( outputWidth, outputHeight,  
  117.           BufferedImage.TYPE_INT_RGB );                                                     
  118.        Graphics2D biContext = bi.createGraphics();  
  119.        biContext.drawImage( outputImage, 00null );  
  120.        ImageIO.write(bi, format, outputStream);  
  121. font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc
分享到:
评论

你可能感兴趣的:(java,swing,JUnit,单元测试,sun)