package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.web.multipart.MultipartFile; import com.net.entity.ImgzipResult; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; /************************************** * Description:圖片上傳壓縮工具類 * @author zhangdi * @version 1.0 */ public class ImageProcess { private Logger log = Logger.getLogger(ImageProcess.class); /** * 上傳並壓縮圖片 * @param myFile 上傳的文件 * @param width 設置寬度 * @param height 設置高度 * @param request 網絡請求 * @return 結果集合(是否成功,新路徑) */ public ImgzipResult UploadFile(MultipartFile myFile, int width, int height, HttpServletRequest request) { Boolean sta = false; ImgzipResult imResult = new ImgzipResult(); InputStream is = null; FileOutputStream fs = null; //獲得物理路徑webapp所在路徑 String pathRoot = request.getSession().getServletContext().getRealPath(""); /** 臨時文件夾*/ String imgPath = File.separator +"img"+File.separator+ "imgTemp" + File.separator; // String tempPath = ServletConstants.WEB_ROOT_OS_PATH + imgPath; String tempPath = pathRoot+imgPath; System.out.println("old-path-" + tempPath); // String name = myFile.getOriginalFilename(); File oldFile = new File(tempPath); if (!oldFile.exists()) { oldFile.mkdirs(); } /** 處理后文件夾*/ String newImaPath = File.separator +"img"+File.separator+"imgZip" + File.separator; // String newPath = ServletConstants.WEB_ROOT_OS_PATH + newImaPath; String newPath = pathRoot+newImaPath; System.out.println("new-path-" + newPath); File newFile = new File(newPath); if (!newFile.exists()) { newFile.mkdirs(); } try { /** 先存取源文件*/ is = myFile.getInputStream(); fs = new FileOutputStream(tempPath + myFile.getOriginalFilename()); //... if (myFile.getSize() > 0) { byte[] buffer = new byte[1024 * 1024]; int bytesum = 0; int byteread = 0; while ((byteread = is.read(buffer)) != -1) { bytesum += byteread; fs.write(buffer, 0, byteread); fs.flush(); } fs.close(); is.close(); } //生成24位隨機數作為壓縮后的圖片名 String randomName = UtilNet.getRandomNumberString(24); /** 處理源文件 ,進行壓縮再放置到新的文件夾*/ String oldPath = tempPath + myFile.getOriginalFilename(); String copyPath = newPath + randomName; // 圖片壓縮 Boolean ys = zipWidthHeightImageFile(oldPath, copyPath, width,height, 1f); if (ys){ imResult.setNewPath("/img/imgZip/"+randomName); System.out.println("/img/imgZip/"+randomName); log.info("img path====================>"+copyPath); sta = true; } else{ sta = false; } } catch (Exception ex) { ex.printStackTrace(); sta = false; } imResult.setResult(sta); return imResult; } /*** * 壓縮制定大小圖片 * * @param oldPath 臨時圖片路徑 * @param copyPath 壓縮圖片保存路徑 * @param width 寬度 * @param height 高度 * @param quality 高清度 * @return * @throws Exception */ private Boolean zipWidthHeightImageFile(String oldPath, String copyPath, int width, int height, float quality) { Boolean sta = false; File oldFile = new File(oldPath); File newFile = new File(copyPath); if (oldFile == null) { return null; } String newImage = null; try { /** 對服務器上的臨時文件進行處理 */ Image srcFile = ImageIO.read(oldFile); // int w = srcFile.getWidth(null); // System.out.println(w); // int h = srcFile.getHeight(null); // System.out.println(h); int w = srcFile.getWidth(null); // System.out.println(w); int h = srcFile.getHeight(null); // System.out.println(h); double bili; if(width>0){ bili=width/(double)w; height = (int) (h*bili); }else{ if(height>0){ bili=height/(double)h; width = (int) (w*bili); } } /** 寬,高設定 */ BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(srcFile, 0, 0, width, height, null); //String filePrex = oldFile.substring(0, oldFile.indexOf(‘.‘)); /** 壓縮后的文件名 */ //newImage = filePrex + smallIcon+ oldFile.substring(filePrex.length()); /** 壓縮之后臨時存放位置 */ FileOutputStream out = new FileOutputStream(newFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag); /** 壓縮質量 */ jep.setQuality(quality, true); encoder.encode(tag, jep); out.close(); sta = true; } catch (Exception e) { e.printStackTrace(); sta = false; } return sta; } }
其中需要的實體類為:
package com.net.entity; /** * 壓縮圖片返回的集合 * @author zhangdi * */ public class ImgzipResult { private boolean result; private String newPath; public boolean isResult() { return result; } public void setResult(boolean result) { this.result = result; } public String getNewPath() { return newPath; } public void setNewPath(String newPath) { this.newPath = newPath; } }
工具類二:
這個工具類中用到的實體類同上,如果上一個工具類不好用,可以試一試這個:
package com.net.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import com.net.entity.ImgzipResult; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * 圖片壓縮工具類 */ public class ImageZipUtil { /** * 等比例壓縮圖片文件<br> 先保存原文件,再壓縮、上傳 * @param oldFile 要進行壓縮的文件 * @param newFile 新文件 * @param width 寬度 //設置寬度時(高度傳入0,等比例縮放) * @param height 高度 //設置高度時(寬度傳入0,等比例縮放) * @param quality 質量 * @return 返回壓縮后的文件的全路徑 */ public static ImgzipResult zipImageFile(File oldFile,File newFile, int width, int height, float quality) { ImgzipResult imgzipResult = new ImgzipResult(); boolean bool = true; if (oldFile == null) { imgzipResult.setNewPath(null); bool = false; imgzipResult.setResult(bool); return imgzipResult; } try { /** 對服務器上的臨時文件進行處理 */ Image srcFile = ImageIO.read(oldFile); int w = srcFile.getWidth(null); // System.out.println(w); int h = srcFile.getHeight(null); // System.out.println(h); double bili; if(width>0){ bili=width/(double)w; height = (int) (h*bili); }else{ if(height>0){ bili=height/(double)h; width = (int) (w*bili); } } /** 寬,高設定 */ BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(srcFile, 0, 0, width, height, null); //String filePrex = oldFile.getName().substring(0, oldFile.getName().indexOf('.')); /** 壓縮后的文件名 */ //newImage = filePrex + smallIcon+ oldFile.getName().substring(filePrex.length()); /** 壓縮之后臨時存放位置 */ FileOutputStream out = new FileOutputStream(newFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag); /** 壓縮質量 */ jep.setQuality(quality, true); encoder.encode(tag, jep); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } imgzipResult.setNewPath(newFile.getAbsolutePath()); imgzipResult.setResult(bool); return imgzipResult; } /** * 按寬度高度壓縮圖片文件<br> 先保存原文件,再壓縮、上傳 * @param oldFile 要進行壓縮的文件全路徑 * @param newFile 新文件 * @param width 寬度 * @param height 高度 * @param quality 質量 * @return 返回壓縮后的文件的全路徑 */ public static String zipWidthHeightImageFile(File oldFile,File newFile, int width, int height, float quality) { if (oldFile == null) { return null; } String newImage = null; try { System.out.println(oldFile); /** 對服務器上的臨時文件進行處理 */ Image srcFile = ImageIO.read(oldFile); int w = srcFile.getWidth(null); // System.out.println(w); int h = srcFile.getHeight(null); // System.out.println(h); /** 寬,高設定 */ BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); tag.getGraphics().drawImage(srcFile, 0, 0, width, height, null); //String filePrex = oldFile.substring(0, oldFile.indexOf('.')); /** 壓縮后的文件名 */ //newImage = filePrex + smallIcon+ oldFile.substring(filePrex.length()); /** 壓縮之后臨時存放位置 */ FileOutputStream out = new FileOutputStream(newFile); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam jep = JPEGCodec.getDefaultJPEGEncodeParam(tag); /** 壓縮質量 */ jep.setQuality(quality, true); encoder.encode(tag, jep); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return newImage; } }