欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图片压缩

程序员文章站 2022-05-15 17:49:25
...

在网上看了一些图片压缩的方法,稍作记录,可能有重复的
方法一:

package cn.lsh.test;


import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageOutputStream;

import org.w3c.dom.Element;


public class ImgCompressUtil { 

    /**
   * 图片压缩测试
   * @param args
   */
  public static void main(String args[]){ 
      //读文件夹所有文件进行压缩处理
//      String f = "/var/upload_bak/"; 
//      File file = new File(f); 
//      
//      if(file.exists()) 
//      { 
//          File[] filelist = file.listFiles(); 
//          for(int i = 0;i<filelist.length;i++) 
//          { 
//              String n = filelist[i].getName(); 
//              Tosmallerpic(f,filelist[i],"_middle",n,185,160,(float)0.7); 
//              Tosmallerpic(f,filelist[i],"_small",n,45,45,(float)0.7); 
//              Tosmallerpic(f,filelist[i],"_smaller",n,116,100,(float)0.7); 
//          } 
//      } 

      //对一个文件进行压缩处理
    String url = "E:\\FMS_REPLAY_MEDIA\\image\\";
    String name  =  "03m.jpg";
   // name = "9d8608c7ea288a691b03ae5e0604de06.jpg";
    Tosmallerpic(url,url,name,800,600,(float)0.98);
  }


  /** 
  * 
  * @param srcFilePath 图片所在的文件夹路径 
  * @param destFilePath 存放路径 
  * @param name 图片名 
  * @param w 目标宽 
  * @param h 目标高 
  * @param per 百分比 
  */ 
  private static void  Tosmallerpic(String srcFilePath,String destFilePath,String name,int w,int h,float per){ 
          Image src; 
          try { 
              src  =  javax.imageio.ImageIO.read(new File(srcFilePath+File.separator+name)); //构造Image对象 

             String img_midname  =  destFilePath + File.separator + "S_"+name; 
             int old_w = src.getWidth(null); //得到源图宽 
             int old_h = src.getHeight(null); 
             int new_w = 0; 
             int new_h = 0; //得到源图长 

             double w2 = (old_w*1.00)/(w*1.00); 
             double h2 = (old_h*1.00)/(h*1.00); 

             //图片跟据长宽留白,成一个正方形图。 
             BufferedImage oldpic; 
             if(old_w>old_h) 
             { 
                 oldpic = new BufferedImage(old_w,old_w,BufferedImage.TYPE_INT_RGB); 
             }else{
                 if(old_w<old_h){ 
                     oldpic = new BufferedImage(old_h,old_h,BufferedImage.TYPE_INT_RGB); 
                 }else{ 
                     oldpic = new BufferedImage(old_w,old_h,BufferedImage.TYPE_INT_RGB); 
                 } 
             } 
              Graphics2D g  =  oldpic.createGraphics(); 
              g.setColor(Color.white); 
              if(old_w>old_h) 
              { 
                  g.fillRect(0, 0, old_w, old_w); 
                  g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h, Color.white, null); 
              }else{ 
                  if(old_w<old_h){ 
                  g.fillRect(0,0,old_h,old_h); 
                  g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h, Color.white, null); 
                  }else{ 
                      //g.fillRect(0,0,old_h,old_h); 
                      g.drawImage(src.getScaledInstance(old_w, old_h,  Image.SCALE_SMOOTH), 0,0,null); 
                  } 
              }              
              g.dispose(); 
              src  =  oldpic; 
              //图片调整为方形结束 
             if(old_w>w) 
             new_w = (int)Math.round(old_w/w2); 
             else 
                 new_w = old_w; 
             if(old_h>h) 
             new_h = (int)Math.round(old_h/h2);//计算新图长宽 
             else 
                 new_h = old_h; 
             BufferedImage image_to_save  =  new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);        
             image_to_save.getGraphics().drawImage(src.getScaledInstance(new_w, new_h,  Image.SCALE_SMOOTH), 0,0,null); 
             FileOutputStream fos = new FileOutputStream(img_midname); //输出到文件流 

             //旧的使用 jpeg classes进行处理的方法
//             JPEGImageEncoder encoder  =  JPEGCodec.createJPEGEncoder(fos); 
//             JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(image_to_save); 
              /* 压缩质量 */ 
//             jep.setQuality(per, true); 
//             encoder.encode(image_to_save, jep); 

             //新的方法
             saveAsJPEG(100, image_to_save, per, fos);

             fos.close(); 
             } catch (IOException ex) { 
//              Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE, null, ex); 
          } 
  } 

    /**
       * 以JPEG编码保存图片
       * @param dpi  分辨率
       * @param image_to_save  要处理的图像图片
       * @param JPEGcompression  压缩比
       * @param fos 文件输出流
       * @throws IOException
       */
      public static void saveAsJPEG(Integer dpi ,BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {

          //useful documentation at http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
          //useful example program at http://johnbokma.com/java/obtaining-image-metadata.html to output JPEG data

          //old jpeg class
          //com.sun.image.codec.jpeg.JPEGImageEncoder jpegEncoder  =  com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(fos);
          //com.sun.image.codec.jpeg.JPEGEncodeParam jpegEncodeParam  =  jpegEncoder.getDefaultJPEGEncodeParam(image_to_save);

          // Image writer
//        JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next();
          ImageWriter imageWriter  =   ImageIO.getImageWritersBySuffix("jpg").next();
          ImageOutputStream ios  =  ImageIO.createImageOutputStream(fos);
          imageWriter.setOutput(ios);
          //and metadata
          IIOMetadata imageMetaData  =  imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);


          if(dpi !=  null && !dpi.equals("")){

               //old metadata
              //jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
              //jpegEncodeParam.setXDensity(dpi);
              //jpegEncodeParam.setYDensity(dpi);

              //new metadata
              Element tree  =  (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
              Element jfif  =  (Element)tree.getElementsByTagName("app0JFIF").item(0);
              jfif.setAttribute("Xdensity", Integer.toString(dpi) );
              jfif.setAttribute("Ydensity", Integer.toString(dpi));

          }


          if(JPEGcompression >= 0 && JPEGcompression <= 1f){

              //old compression
              //jpegEncodeParam.setQuality(JPEGcompression,false);

              // new Compression
              JPEGImageWriteParam jpegParams  =  (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
              jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
              jpegParams.setCompressionQuality(JPEGcompression);

          }

          //old write and clean
          //jpegEncoder.encode(image_to_save, jpegEncodeParam);

          //new Write and clean up
          imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
          ios.close();
          imageWriter.dispose();

      }

}

方法二

package cn.lsh.test;


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.awt.image.ImageFilter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class ImgTools {

    /**
     * 按照 宽高 比例压缩
     * 
     * @param img
     * @param width
     * @param height
     * @param out
     * @throws IOException
     */public static void thumbnail_w_h(File img, int width, int height,OutputStream out) throws IOException {
        BufferedImage bi = ImageIO.read(img);
        double srcWidth = bi.getWidth(); // 源图宽度
        double srcHeight = bi.getHeight(); // 源图高度
        double scale = 1;

        if (width > 0) {
            scale = width / srcWidth;
        }
        if (height > 0) {
            scale = height / srcHeight;
        }
        if (width > 0 && height > 0) {
            scale = height / srcHeight < width / srcWidth ? height / srcHeight
                    : width / srcWidth;
        }

        thumbnail(img, (int) (srcWidth * scale), (int) (srcHeight * scale), out);

    }

    /**
     * 按照固定宽高原图压缩
     * 
     * @param img
     * @param width
     * @param height
     * @param out
     * @throws IOException
     * 
     */
      public static void thumbnail(File img, int width, int height,
            OutputStream out) throws IOException {
        BufferedImage BI = ImageIO.read(img);
        Image image = BI.getScaledInstance(width, height, Image.SCALE_SMOOTH);

        BufferedImage tag = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);
        Graphics g = tag.getGraphics();
        g.setColor(Color.RED);
        g.drawImage(image, 0, 0, null); // 绘制处理后的图        g.dispose();
        ImageIO.write(tag, "JPEG", out);
    }

    /**
     * 按照宽高裁剪
     * 
     * @param srcImageFile
     * @param destWidth
     * @param destHeight
     * @param out
     */public static void cut_w_h(File srcImageFile, int destWidth,
            int destHeight, OutputStream out) {
        cut_w_h(srcImageFile, 0, 0, destWidth, destHeight, out);
    }

    public static void cut_w_h(File srcImageFile, int x, int y, int destWidth,
            int destHeight, OutputStream out) {
        try {
            Image img;
            ImageFilter cropFilter;
            // 读取源图像
            BufferedImage bi = ImageIO.read(srcImageFile);
            int srcWidth = bi.getWidth(); // 源图宽度
            int srcHeight = bi.getHeight(); // 源图高度
            if (srcWidth >= destWidth && srcHeight >= destHeight) {
                Image image = bi.getScaledInstance(srcWidth, srcHeight,
                        Image.SCALE_DEFAULT);

                cropFilter = new CropImageFilter(x, y, destWidth, destHeight);
                img = Toolkit.getDefaultToolkit().createImage(
                        new FilteredImageSource(image.getSource(), cropFilter));
                BufferedImage tag = new BufferedImage(destWidth, destHeight,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, null); // 绘制截取后的图                g.dispose();
                // 输出为文件
                ImageIO.write(tag, "JPEG", out);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }// #cut_w_h
public static void main(String[] args) throws IOException {
        File img = new File("E:\\FMS_REPLAY_MEDIA\\image\\03m.jpg");
        FileOutputStream fos = new FileOutputStream("E:\\FMS_REPLAY_MEDIA\\image\\03ms.jpg");
         ImgTools.thumbnail(img, 100, 100, fos);
         //ImgTools.cut_w_h(img, 230, 200, fos);
        //ImgTools.thumbnail_w_h(img, 100, 50, fos);
    }

}

方法三:

package cn.lsh.test;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.ImageTypeSpecifier;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
import javax.imageio.stream.ImageInputStream;
import javax.imageio.stream.ImageOutputStream;

import org.w3c.dom.Element;

//import com.sun.imageio.plugins.jpeg.JPEGImageWriter;


/** 此方法压缩不失真很好用
* @author zhouqz 
*/ 
public class ImgUtil { 

      /**
     * 图片压缩测试
     * @param args
     */
    public static void main(String args[]){ 
        //读文件夹所有文件进行压缩处理
//        String f = "/var/upload_bak/"; 
//        File file = new File(f); 
//        
//        if(file.exists()) 
//        { 
//            File[] filelist = file.listFiles(); 
//            for(int i = 0;i<filelist.length;i++) 
//            { 
//                String n = filelist[i].getName(); 
//                Tosmallerpic(f,filelist[i],"_middle",n,185,160,(float)0.7); 
//                Tosmallerpic(f,filelist[i],"_small",n,45,45,(float)0.7); 
//                Tosmallerpic(f,filelist[i],"_smaller",n,116,100,(float)0.7); 
//            } 
//        } 

        //对一个文件进行压缩处理

     /* 
    String url = "E:/cims/cimsdata/afr/20160922/"; 
      String name  =  "query_image.jpg";
      img_change(url,name);
     */    
        ImgCompress("E:\\FMS_REPLAY_MEDIA\\image\\02m.jpg");
    }


    /**********************************好用的压缩方法开始*******************************************/
    /**
     * 图片压缩 
     * @param pathName  图片的路径 压缩图片直接替换当前图片
     */
    public static void    ImgCompress(String pathName){
        int n=pathName.lastIndexOf("/");
        String url=pathName.substring(0,n+1);
        String name=pathName.substring(n+1);
        String desturl =pathName+ File.separator + "s_" + name;

      //  Tosmallerpic(url,new File(url+name),"",name,188,165,(float)0.7); 
        Tosmallerpic(url,new File(url+name),"",name,1080,768,(float)0.7); 
    }



    /**
     * 此方法压缩不失真很好用 举例用法
     * @param url    E:/cims/cimsdata/afr/20160922/
     * @param name    1111111.jpg
     */
    public static void img_change(String url,String name) 
    { 
            Tosmallerpic(url,new File(url+name),"_middle",name,188,165,(float)0.7); 
            Tosmallerpic(url,new File(url+name),"_small",name,45,45,(float)0.7); 
            Tosmallerpic(url,new File(url+name),"_smaller",name,116,100,(float)0.7); 
    } 

    /** 
    * 
    * @param f 图片所在的文件夹路径 
    * @param file 图片路径 
    * @param ext 扩展名 
    * @param n 图片名 
    * @param w 目标宽 
    * @param h 目标高 
    * @param per 百分比 
    */ 
    private static void  Tosmallerpic(String f,File file,String ext,String n,int w,int h,float per){ 
            Image src; 
            try { 
                src  =  javax.imageio.ImageIO.read(file); //构造Image对象 

               String img_midname  =  f+n.substring(0,n.indexOf("."))+ext+n.substring(n.indexOf(".")); 
               int old_w = src.getWidth(null); //得到源图宽 
               int old_h = src.getHeight(null); 
               int new_w = 0; 
               int new_h = 0; //得到源图长 

               double w2 = (old_w*1.00)/(w*1.00); 
               double h2 = (old_h*1.00)/(h*1.00); 

               //图片跟据长宽留白,成一个正方形图。 
               BufferedImage oldpic; 
               if(old_w>old_h) 
               { 
                   oldpic = new BufferedImage(old_w,old_w,BufferedImage.TYPE_INT_RGB); 
               }else{if(old_w<old_h){ 
                   oldpic = new BufferedImage(old_h,old_h,BufferedImage.TYPE_INT_RGB); 
               }else{ 
                    oldpic = new BufferedImage(old_w,old_h,BufferedImage.TYPE_INT_RGB); 
               } 
               } 
                Graphics2D g  =  oldpic.createGraphics(); 
                g.setColor(Color.white); 
                if(old_w>old_h) 
                { 
                    g.fillRect(0, 0, old_w, old_w); 
                    g.drawImage(src, 0, (old_w - old_h) / 2, old_w, old_h, Color.white, null); 
                }else{ 
                    if(old_w<old_h){ 
                    g.fillRect(0,0,old_h,old_h); 
                    g.drawImage(src, (old_h - old_w) / 2, 0, old_w, old_h, Color.white, null); 
                    }else{ 
                        //g.fillRect(0,0,old_h,old_h); 
                        g.drawImage(src.getScaledInstance(old_w, old_h,  Image.SCALE_SMOOTH), 0,0,null); 
                    } 
                }              
                g.dispose(); 
                src  =  oldpic; 
                //图片调整为方形结束 
               if(old_w>w) 
               new_w = (int)Math.round(old_w/w2); 
               else 
                   new_w = old_w; 
               if(old_h>h) 
               new_h = (int)Math.round(old_h/h2);//计算新图长宽 
               else 
                   new_h = old_h; 
               BufferedImage image_to_save  =  new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);        
               image_to_save.getGraphics().drawImage(src.getScaledInstance(new_w, new_h,  Image.SCALE_SMOOTH), 0,0,null); 
               FileOutputStream fos = new FileOutputStream(img_midname); //输出到文件流 

               //旧的使用 jpeg classes进行处理的方法
//               JPEGImageEncoder encoder  =  JPEGCodec.createJPEGEncoder(fos); 
//               JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(image_to_save); 
                /* 压缩质量 */ 
//               jep.setQuality(per, true); 
//               encoder.encode(image_to_save, jep); 

               //新的方法
               saveAsJPEG(100, image_to_save, per, fos);

               fos.close(); 
               } catch (IOException ex) { 
                //Logger.getLogger(Img_Middle.class.getName()).log(Level.SEVERE, null, ex); 
            } 
    } 


    /**
     * 以JPEG编码保存图片
     * @param dpi  分辨率
     * @param image_to_save  要处理的图像图片
     * @param JPEGcompression  压缩比
     * @param fos 文件输出流
     * @throws IOException
     */
    public static void saveAsJPEG(Integer dpi ,BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {

        //useful documentation at http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
        //useful example program at http://johnbokma.com/java/obtaining-image-metadata.html to output JPEG data

        //old jpeg class
        //com.sun.image.codec.jpeg.JPEGImageEncoder jpegEncoder  =  com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(fos);
        //com.sun.image.codec.jpeg.JPEGEncodeParam jpegEncodeParam  =  jpegEncoder.getDefaultJPEGEncodeParam(image_to_save);

        // Image writer
        ImageWriter imageWriter  =  (ImageWriter) ImageIO.getImageWritersBySuffix("jpg").next();
        ImageOutputStream ios  =  ImageIO.createImageOutputStream(fos);
        imageWriter.setOutput(ios);
        //and metadata
        IIOMetadata imageMetaData  =  imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);


        if(dpi !=  null && !dpi.equals("")){

             //old metadata
            //jpegEncodeParam.setDensityUnit(com.sun.image.codec.jpeg.JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
            //jpegEncodeParam.setXDensity(dpi);
            //jpegEncodeParam.setYDensity(dpi);

            //new metadata
            Element tree  =  (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
            Element jfif  =  (Element)tree.getElementsByTagName("app0JFIF").item(0);
            jfif.setAttribute("Xdensity", Integer.toString(dpi) );
            jfif.setAttribute("Ydensity", Integer.toString(dpi));

        }

        if(JPEGcompression >= 0 && JPEGcompression <= 1f){

            //old compression
            //jpegEncodeParam.setQuality(JPEGcompression,false);

            // new Compression
            JPEGImageWriteParam jpegParams  =  (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
            jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
            jpegParams.setCompressionQuality(JPEGcompression);

        }

        //old write and clean
        //jpegEncoder.encode(image_to_save, jpegEncodeParam);

        //new Write and clean up
        imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
        ios.close();
        imageWriter.dispose();

    }
    /**********************************好用的压缩方法结束*******************************************/

    /**
     * 压缩图片文件 测试发现图片压缩小了会失真 不如上面的方法好用
     * @param srcFilePath    当前图片地址
     * @param descFilePath    压缩后的地址
     * @return
     */
     public static boolean compressPic(String srcFilePath, String descFilePath)  
        {  
            File file = null;  
            BufferedImage src = null;  
            FileOutputStream out = null;  
            ImageWriter imgWrier;  
            ImageWriteParam imgWriteParams;  

            // 指定写图片的方式为 jpg  
            imgWrier = ImageIO.getImageWritersByFormatName("jpg").next();  
            imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam(null);  
            // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT  
            imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT);  
            // 这里指定压缩的程度,参数qality是取值0~1范围内,  
            imgWriteParams.setCompressionQuality((float)0.1);  
            imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED);  
            ColorModel colorModel = ColorModel.getRGBdefault();  
            // 指定压缩时使用的色彩模式  
            imgWriteParams.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel, colorModel  
                    .createCompatibleSampleModel(16, 16)));  

            try  
            {  
                if(null==srcFilePath||"".equals(srcFilePath))  
                {  
                    return false;  
                }  
                else  
                {  
                    file = new File(srcFilePath);  
                    src = ImageIO.read(file);  
                    out = new FileOutputStream(descFilePath);  

                    imgWrier.reset();  
                    // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 OutputStream构造  
                    imgWrier.setOutput(ImageIO.createImageOutputStream(out));  
                    // 调用write方法,就可以向输入流写图片  
                    imgWrier.write(null, new IIOImage(src, null, null), imgWriteParams);  
                    out.flush();  
                    out.close();  
                }  
            }  
            catch(Exception e)  
            {  
                e.printStackTrace();  
                return false;  
            }  
            return true;  
        }  

     /**
      * 切图 
      * @param fileName
      * @param x
      * @param y
      * @param width
      * @param height
      * @throws IOException
      */
     public static void cutHead(String fileName,int x,int y,int width,int height) throws IOException {

            FileInputStream is = null;
            ImageInputStream iis = null;
            try {
                is = new FileInputStream(fileName+".jpg");
                Iterator<ImageReader> it = ImageIO
                        .getImageReadersByFormatName("jpg");
                ImageReader reader = it.next();
                iis = ImageIO.createImageInputStream(is);
                reader.setInput(iis, true);
                ImageReadParam param = reader.getDefaultReadParam();
                Rectangle rect = new Rectangle(x, y, width, height);
                param.setSourceRegion(rect);
                BufferedImage bi = reader.read(0, param);

                ImageIO.write(bi, "jpg", new File(fileName+"-1"+".jpg"));

            } finally {
                if (is != null)
                    is.close();
                if (iis != null)
                    iis.close();
            }

        }


     /**缩率图
         * Title: thumbnailImage 测试发现压缩到了大部分图片2K
         * Description: 根据图片路径生成缩略图 
         * @param imagePath    原图片路径
         * @param w            缩略图宽
         * @param h            缩略图高
         * @param prevfix    生成缩略图的前缀
         * @param force        是否强制按照宽高生成缩略图(如果为false,则生成最佳比例缩略图)
         */
        public static void thumbnailImage(File imgFile, int w, int h, String prevfix, boolean force){
            byte[] data=null;
            if(imgFile.exists()){
                try {
                    // ImageIO 支持的图片类型 : [BMP, bmp, jpg, JPG, wbmp, jpeg, png, PNG, JPEG, WBMP, GIF, gif]
                    String types = Arrays.toString(ImageIO.getReaderFormatNames());
                    String suffix = null;
                    // 获取图片后缀
                    if(imgFile.getName().indexOf(".") > -1) {
                        suffix = imgFile.getName().substring(imgFile.getName().lastIndexOf(".") + 1);
                    }// 类型和图片后缀全部小写,然后判断后缀是否合法
                    if(suffix == null || types.toLowerCase().indexOf(suffix.toLowerCase()) < 0){
                        //logger.error("Sorry, the image suffix is illegal. the standard image suffix is {}." + types);
                        //return null;
                    }
                    //logger.debug("target image's size, width:{}, height:{}.");
                    Image img = ImageIO.read(imgFile);
                    if(!force){
                        // 根据原图与要求的缩略图比例,找到最合适的缩略图比例
                        int width = img.getWidth(null);
                        int height = img.getHeight(null);
                        if((width*1.0)/w < (height*1.0)/h){
                            if(width > w){
                                h = Integer.parseInt(new java.text.DecimalFormat("0").format(height * w/(width*1.0)));
                                //logger.debug("change image's height, width:{}, height:{}.");
                            }
                        } else {
                            if(height > h){
                                w = Integer.parseInt(new java.text.DecimalFormat("0").format(width * h/(height*1.0)));
                                //logger.debug("change image's width, width:{}, height:{}.");
                            }
                        }
                    }
                    BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);

                    Graphics g = bi.getGraphics();
                    g.drawImage(img, 0, 0, w, h, Color.LIGHT_GRAY, null);
                    g.dispose();
                    String p = imgFile.getPath();
                    // 将图片保存在原目录并加上前缀
                    String str=p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName();
                    ByteArrayOutputStream out = new ByteArrayOutputStream();  
                    //boolean flag = ImageIO.write(bi, "gif", out);  
                    boolean flag = ImageIO.write(bi, suffix, out);  
                    //如果返回数据的话就把下面的注释打开
                    // data = out.toByteArray();
                    //return data;
                    //些图片到某个路径
                    ImageIO.write(bi, suffix, new File(p.substring(0,p.lastIndexOf(File.separator)) + File.separator + prevfix +imgFile.getName()));
                } catch (IOException e) {
                    //logger.error("generate thumbnail image failed.",e);
                }
            }else{
                //logger.warn("the image is not exist.");
            }
            //return data;
        }

}