- 一首先看下效果
- 二工具類
- 三測試類
在系統的上傳圖片功能中,我們無法控制用戶上傳圖片的大小,用戶可能會上傳大到幾十M小到1k的的圖片,一方面圖片太大占據了太多的空間,另一方面,我們沒辦法在頁面上顯示統一大小的圖片。所以我們需要對用戶上傳的圖片進行縮放和裁剪,這里的縮放和平常的壓縮不是一個意思,因為要實現小的圖片會放大,大的圖片會縮小,而且是等比例變的,圖片不會顯示擠壓的效果。而這種操作Java完全可以實現。下面分享下java縮放、裁剪圖片的工具類。
一、首先看下效果:
1.jpg為原圖,yasuo.jpg是縮放后的,caijian.jpg是在yasuo.jpg基礎上裁掉兩邊各10像素得到的
比較1.jpg,是不是既圖片小了,又得到了想要的圖片大小,而且圖片沒有被擠壓? 下面來看代碼:
二、工具類:
import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; /** * 裁剪、縮放圖片工具類 * @author CSDN 沒有夢想-何必遠方 */ public class ImgUtils { /** * 縮放圖片方法 * @param srcImageFile 要縮放的圖片路徑 * @param result 縮放后的圖片路徑 * @param height 目標高度像素 * @param width 目標寬度像素 * @param bb 是否補白 */ public final static void scale(String srcImageFile, String result, int height, int width, boolean bb) { try { double ratio = 0.0; // 縮放比例 File f = new File(srcImageFile); BufferedImage bi = ImageIO.read(f); Image itemp = bi.getScaledInstance(width, height, bi.SCALE_SMOOTH);//bi.SCALE_SMOOTH 選擇圖像平滑度比縮放速度具有更高優先級的圖像縮放算法。 // 計算比例 if ((bi.getHeight() > height) || (bi.getWidth() > width)) { double ratioHeight = (new Integer(height)).doubleValue()/ bi.getHeight(); double ratioWhidth = (new Integer(width)).doubleValue()/ bi.getWidth(); if(ratioHeight>ratioWhidth){ ratio= ratioHeight; }else{ ratio= ratioWhidth; } AffineTransformOp op = new AffineTransformOp(AffineTransform//仿射轉換 .getScaleInstance(ratio, ratio), null);//返回表示剪切變換的變換 itemp = op.filter(bi, null);//轉換源 BufferedImage 並將結果存儲在目標 BufferedImage 中。 } if (bb) {//補白 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//構造一個類型為預定義圖像類型之一的 BufferedImage。 Graphics2D g = image.createGraphics();//創建一個 Graphics2D,可以將它繪制到此 BufferedImage 中。 g.setColor(Color.white);//控制顏色 g.fillRect(0, 0, width, height);// 使用 Graphics2D 上下文的設置,填充 Shape 的內部區域。 if (width == itemp.getWidth(null)) g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); else g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null); g.dispose(); itemp = image; } ImageIO.write((BufferedImage) itemp, "JPEG", new File(result)); //輸出壓縮圖片 } catch (IOException e) { e.printStackTrace(); } } /** * 裁剪圖片方法 * @param bufferedImage 圖像源 * @param startX 裁剪開始x坐標 * @param startY 裁剪開始y坐標 * @param endX 裁剪結束x坐標 * @param endY 裁剪結束y坐標 * @return */ public static BufferedImage cropImage(BufferedImage bufferedImage, int startX, int startY, int endX, int endY) { int width = bufferedImage.getWidth(); int height = bufferedImage.getHeight(); if (startX == -1) { startX = 0; } if (startY == -1) { startY = 0; } if (endX == -1) { endX = width - 1; } if (endY == -1) { endY = height - 1; } BufferedImage result = new BufferedImage(endX - startX, endY - startY, 4); for (int x = startX; x < endX; ++x) { for (int y = startY; y < endY; ++y) { int rgb = bufferedImage.getRGB(x, y); result.setRGB(x - startX, y - startY, rgb); } } return result; } }
三、測試類:
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import com.etoak.util.ImgUtils; public class Test { public static void main(String[] args) throws IOException { String path="C:/1.jpg"; //輸入圖片 測試要在C盤放一張圖片1.jpg ImgUtils.scale("C:/1.jpg","C:/yasuo.jpg", 180, 240, true);//等比例縮放 輸出縮放圖片 File newfile=new File("C:/yasuo.jpg"); BufferedImage bufferedimage=ImageIO.read(newfile); int width = bufferedimage.getWidth(); int height = bufferedimage.getHeight(); //目標將圖片裁剪成 寬240,高160 if (width > 240) { /*開始x坐標 開始y坐標 結束x坐標 結束y坐標*/ bufferedimage=ImgUtils.cropImage(bufferedimage,(int) ((width - 240) / 2),0,(int) (width - (width-240) / 2),(int) (height) ); if (height > 160) { bufferedimage=ImgUtils.cropImage(bufferedimage,0,(int) ((height - 160) / 2),240,(int) (height - (height - 160) / 2) ); } }else{ if (height > 160) { bufferedimage=ImgUtils.cropImage(bufferedimage,0,(int) ((height - 160) / 2),(int) (width),(int) (height - (height - 160) / 2) ); } } ImageIO.write(bufferedimage, "jpg", new File("C:/caijian.jpg")); //輸出裁剪圖片 } }
原文鏈接:http://blog.csdn.net/frightingforambition/article/details/49929201