1. 程式人生 > >java實現圖片裁剪、縮放功能

java實現圖片裁剪、縮放功能

import java.awt.Image;
import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

/**
 * 影象裁剪工具類
 * @author Administrator
 *
 */
public class ImageUtil {

    /**
     * 根據尺寸將影象居中裁剪
     * @param src  源影象的儲存路徑
     * @param desc 處理後的影象準備儲存的路徑
     * @param w    裁剪要求的寬
     * @param h    裁剪要求的高
     * @throws FileNotFoundException
     */
    public static void cutImageByCenter(String src, String desc, int w, int h) throws Exception{
        
        //獲得一個迭代器
        Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");
        
        //使用迭代器將圖片讀取到一個圖片字元流物件中
        ImageReader reader = (ImageReader) iterator.next();
        
        //獲取圖片的輸入位元組流
        InputStream in = new FileInputStream(src);
        
        //ImageInputStream是供 ImageReader 使用的可查詢輸入流介面。
        ImageInputStream iis = ImageIO.createImageInputStream(in);
        
        //設定用於給定的ImageInputStream 或其他Object的輸入源
        reader.setInput(iis,true);
        
        //返回一個可以使用一組預設設定控制解碼過程的 ImageReadParam 物件
        ImageReadParam param = reader.getDefaultReadParam();
        
        //影象索引
        int imageIndex = 0;
        
        //設定一個矩形區域。
        Rectangle rect = new Rectangle((reader.getWidth(imageIndex)-w)/2,(reader.getHeight(imageIndex)-w)/2,w,h);
        
        /*
         * 設定感興趣的源區域。感興趣的區域杯描述成一個矩形。
         * 源影象左上角為畫素(0,0),該值向下向右遞增。
         */
        param.setSourceRegion(rect);
        
        //將字元流圖片加一個緩衝了流。
        BufferedImage bi = reader.read(0, param);
        
        //寫進新檔案中
        ImageIO.write(bi, "jpg", new File(desc));
    }
    
    
    /**
     * 將圖片裁剪至二分之一
     * @param src    源影象路徑
     * @param dest   裁剪後圖像路徑
     * @throws IOException
     */
     public static void cutHalfImage(String src,String dest) throws IOException{   
         Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");   
         ImageReader reader = (ImageReader)iterator.next();   
         InputStream in=new FileInputStream(src);  
         ImageInputStream iis = ImageIO.createImageInputStream(in);   
         reader.setInput(iis, true);   
         ImageReadParam param = reader.getDefaultReadParam();   
         int imageIndex = 0;   
         int width = reader.getWidth(imageIndex)/2;   
         int height = reader.getHeight(imageIndex)/2;   
         Rectangle rect = new Rectangle(width/2, height/2, width, height);   
         param.setSourceRegion(rect);   
         BufferedImage bi = reader.read(0,param);     
         ImageIO.write(bi, "jpg", new File(dest));     
     }
     
     /**
      * 圖片裁剪通用介面
      * @param src    源影象路徑
      * @param dest   裁剪後圖像路徑
      * @param x      裁剪的影象左上角橫座標
      * @param y        裁剪的影象左上角縱座標    
      * @param w        裁剪的影象的寬
      * @param h        裁剪的影象的高    
      * @throws IOException
      **/  
     public static void cutImage(String src,String dest,int x,int y,int w,int h) throws IOException{   
            Iterator iterator = ImageIO.getImageReadersByFormatName("jpg");   
            ImageReader reader = (ImageReader)iterator.next();   
            InputStream in=new FileInputStream(src);  
            ImageInputStream iis = ImageIO.createImageInputStream(in);   
            reader.setInput(iis, true);   
            ImageReadParam param = reader.getDefaultReadParam();   
            Rectangle rect = new Rectangle(x, y, w,h);    
            param.setSourceRegion(rect);   
            BufferedImage bi = reader.read(0,param);     
            ImageIO.write(bi, "jpg", new File(dest));             
     }
     
     /**
      * 將影象縮放
      * @param src    源影象路徑
      * @param dest   縮放後圖像路徑
      * @param w        縮放的影象的寬
      * @param h        縮放的影象的高    
      * @throws Exception
      */
     public static void zoomImage(String src,String dest,int w,int h) throws Exception {  
         double wr=0,hr=0;  
         File srcFile = new File(src);  
         File destFile = new File(dest);  
         BufferedImage bufImg = ImageIO.read(srcFile);
         
         /*
          * w - 將影象縮放到的寬度。
          *    h - 將影象縮放到的高度。
          *    bufImg.SCALE_SMOOTH - 指示用於影象重新取樣的演算法型別的標誌。選擇影象平滑度比縮放速度具有更高優先順序的影象縮放演算法
          */
         Image Itemp = bufImg.getScaledInstance(w, h, bufImg.SCALE_SMOOTH);  
         
         //獲得縮放比例值
         wr=w*1.0/bufImg.getWidth();  
         hr=h*1.0 / bufImg.getHeight();  
         
         /*
          * 此類使用仿射轉換來執行從源影象或 Raster 中 2D 座標到目標影象或 Raster 中 2D 座標的線性對映。
          * 引數:AffineTransform.getScaleInstance(wr, hr)表示縮放變換的變換矩陣,矩陣為:
          *         -----   [   sx   0    0   ]   -----
          *          -----    [   0    sy   0   ]   -----
          *          -----    [   0    0    1   ]   -----
          */
         AffineTransformOp ato = new AffineTransformOp(AffineTransform.getScaleInstance(wr, hr), null);  
         
         /*
          * 轉換源 BufferedImage 並將結果儲存在目標 BufferedImage 中。
          * 引數一:要轉換的BufferedImage
          * 引數二:要在其中儲存轉換結果的BufferedImage。
          * 返回值:過濾後的BuffereedImage
          */
         Itemp = ato.filter(bufImg, null);
         
         try {  
             //寫入圖片。
             ImageIO.write((BufferedImage) Itemp,dest.substring(dest.lastIndexOf(".")+1), destFile);  
         } catch (Exception ex) {  
             ex.printStackTrace();  
         }  
           
     }

}