在不少項目中咱們會把上傳的圖片作處理,比較圖片上傳過多對服務器的容量和帶寬有不少的浪費,若是不是必須的高清圖片,咱們能夠經過代碼來作壓縮。在個人項目中咱們壓縮圖片的目的是讓web頁面打開的速度很快,而且節省空間。php
下面先分享一下代碼:java
package org.util; 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:\\a\\a.jpg"); FileOutputStream fos = new FileOutputStream("e:\\a\\b.jpg"); // ImgTools.thumbnail(img, 100, 100, fos); // ImgTools.cut_w_h(img, 230, 200, fos); ImgTools.thumbnail_w_h(img, 100, 0, fos); } }
其實咱們不少人喜歡在上傳的時候就作了限制了,這樣在上傳時就節省了帶寬,但是不少客戶是不會作圖片處理的,5M的大圖直接就給你上傳,限制了說咱們作的不人性化。無奈之下只能在後臺進行轉換。web