Java 圖片壓縮

package com.cn.lr.util;

import java.awt.Container;
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 org.apache.log4j.Logger;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;


public class FileCompress { 
 
 Logger logger=Logger.getLogger(FileCompress.class);
 
  
   /** 
 * 
 * @param f 圖片輸出路徑 
* @param filelist 圖片路徑 
* @param ext 縮略圖擴展名 
* @param n 圖片名 
* @param w 目標寬 
* @param h 目標高 
* @param per 百分比 
*/ 
    public void  Tosmallerpic(File oldFile,File newFile,int width,int height,float quality){
         if(!newFile.getParentFile().exists()){
         newFile.getParentFile().mkdirs();
         }
            Image src=null; 
            BufferedImage tag=null;
            FileOutputStream newimage=null;
            try { 
             try{
              src = javax.imageio.ImageIO.read(oldFile); //構造Image對象 
            }catch(Exception e){ 
              e.printStackTrace();
                 logger.info(oldFile.getName()+"圖片的ICC信息可能已經被破壞開始轉換:");
                    try { 
//                      ThumbnailConvert convert=new ThumbnailConvert();
                      //convert.setCMYK_COMMAND(oldFile.getPath()); 
                      String CMYK_COMMAND = "mogrify -colorspace RGB -quality 100 file1";//轉換cmyk格式
//                     convert.exeCommand(CMYK_COMMAND.replace("file1",oldFile.getPath()));
                      src = Toolkit.getDefaultToolkit().getImage(oldFile.getPath());
                      MediaTracker mediaTracker = new MediaTracker(new Container());
                      mediaTracker.addImage(src, 0); 
                      mediaTracker.waitForID(0); 
                      src.getWidth(null); 
                      src.getHeight(null); 
                    }catch (Exception e1){ 
                        e1.printStackTrace(); 
                    } 
               } 
               //,String ext 保留字段 縮略圖拼接字段
              //String img_midname=newFile; 
               int old_w=src.getWidth(null)==-1?width:src.getWidth(null); //得到源圖寬
              int old_h=src.getHeight(null)==-1?height:src.getHeight(null); 
               int new_w=0; 
               int new_h=0; //得到源圖長 

              double w2=(old_w*1.00)/(width*1.00); 
               double h2=(old_h*1.00)/(height*1.00); 

               //圖片調整爲方形結束 
              if(old_w>width) 
               new_w=(int)Math.round(old_w/w2); 
               else 
                   new_w=old_w; 
               if(old_h>height) 
               new_h=(int)Math.round(old_h/h2);//計算新圖長寬 
              else 
                   new_h=old_h; 
               tag = new BufferedImage(new_w,new_h,BufferedImage.TYPE_INT_RGB);      
               //tag.getGraphics().drawImage(src,0,0,new_w,new_h,null); //繪製縮小後的圖
              tag.getGraphics().drawImage(src.getScaledInstance(new_w, new_h,  Image.SCALE_SMOOTH), 0,0,null);
               newimage=new FileOutputStream(newFile); //輸出到文件流 
              JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(newimage);
               JPEGEncodeParam jep=JPEGCodec.getDefaultJPEGEncodeParam(tag); 
                /* 壓縮質量 */ 
               jep.setQuality(quality, true); 
               encoder.encode(tag, jep); 
               //encoder.encode(tag); //近JPEG編碼 
              newimage.close(); 
            } catch (IOException ex) { 
             ex.printStackTrace();
             logger.info(oldFile.getName()+"圖片壓縮問題;"+ex);
                //Logger.getLogger(File:mpress.class.getName()).log(Level.SEVERE, null, ex);
            }finally{
             if(newimage!=null){
              try {
      newimage.close();
     } catch (IOException e) {
      e.printStackTrace();
     }
             }
             if(tag!=null){
              tag.flush();
             }
            }
    } }
調用方法:
FileCompress ddd=new FileCompress();
ddd.Tosmallerpic(new File(oldpath),new File(newpath), 300, 200, 1f);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章