java實現圖片裁剪、縮放功能
阿新 • • 發佈:2019-02-04
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();
}
}
}
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();
}
}
}