图片压缩java工具类

时间:2022-01-30 12:29:39
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;
}
}