圖片壓縮java工具類


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;  
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM