自用图片压缩工具类
package tupianyasuo; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGEncodeParam; import javax.swing.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.Kernel; import java.awt.image.ConvolveOp; public class ImageUtil { public static void resize(File originalFile, File resizedFile, int newWidth, float quality) throws IOException { if (quality > 1) { throw new IllegalArgumentException( "Quality has to be between 0 and 1"); } ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath()); Image i = ii.getImage(); Image resizedImage = null; int iWidth = i.getWidth(null); int iHeight = i.getHeight(null); if (iWidth > iHeight) { resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH); } else { resizedImage = i.getScaledInstance((newWidth * iWidth) / iHeight, newWidth, Image.SCALE_SMOOTH); } // This code ensures that all the pixels in the image are loaded. Image temp = new ImageIcon(resizedImage).getImage(); // Create the buffered image. BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null), temp.getHeight(null), BufferedImage.TYPE_INT_RGB); // Copy image to buffered image. Graphics g = bufferedImage.createGraphics(); // Clear background and paint the image. g.setColor(Color.white); g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null)); g.drawImage(temp, 0, 0, null); g.dispose(); // Soften. float softenFactor = 0.05f; float[] softenArray = { 0, softenFactor, 0, softenFactor, 1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 }; Kernel kernel = new Kernel(3, 3, softenArray); ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); bufferedImage = cOp.filter(bufferedImage, null); // Write the jpeg to a file. FileOutputStream out = new FileOutputStream(resizedFile); // Encodes image as a JPEG data stream JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); JPEGEncodeParam param = encoder .getDefaultJPEGEncodeParam(bufferedImage); param.setQuality(quality, true); encoder.setJPEGEncodeParam(param); encoder.encode(bufferedImage); } // Example usage public static void main(String[] args) throws IOException { File originalImage = new File("E:\\ceshitu\\one\\20160803_130742.jpg"); //resize(originalImage, new File("E:\\ceshitu\\one\\11.jpg"),500, 0.7f); //宽200 resize(originalImage, new File("E:\\ceshitu\\one\\20160803_130742.jpg"),200, 1f); } }
下面为再项目中的引用工具类:
只需要两行代码!传入图片路径即可:
package com.chengyi.transfer.user.action; import IceInternal.Ex; import com.chengyi.admin.service.IAnnounceService; import com.chengyi.common.action.BaseAction; import com.chengyi.common.config.BGConfig; import com.chengyi.common.helper.Cp2yHelper; import com.chengyi.common.utils.FileUtil; import com.chengyi.model.domain.User; import com.chengyi.transfer.frame.constants.SystemConstants; import com.chengyi.transfer.util.ImageUtil; import com.chengyi.user.service.IActivityService; import com.chengyi.user.service.ICapitalService; import com.chengyi.user.service.IUserService; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; import org.apache.commons.collections.Buffer; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.commons.CommonsMultipartFile; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * */ @Controller public class UploadAction extends BaseAction { public static final Logger logger = Logger.getLogger(UserAction.class); @Resource private IUserService userService; @Resource private IAnnounceService announceService; @Resource private IActivityService activityService; @Resource private ICapitalService capitalService; public File getAvatar() { return avatar; } public void setAvatar(File avatar) { this.avatar = avatar; } private File avatar; @RequestMapping(value = "uploadImg") public void uploadImg() { } /** * 上传跳转 */ @RequestMapping(value = "/uploadfile/uploadtiao/succes", method = {RequestMethod.POST, RequestMethod.GET}) public String uploadAvatar(HttpServletRequest request, HttpServletResponse response, ModelMap map) throws Exception { Integer userId = Cp2yHelper.getCurrentUserId(request); User user = userService.findUserById(userId); String fileurl=user.getAvatar(); map.put(SystemConstants.FLAG, SystemConstants.FLAG_SUCCESS); map.addAttribute("fileurl",fileurl); return "user/uploadfile"; } /** * 上传 */ @RequestMapping(value = "/uploadfile/upload/file", method = {RequestMethod.POST, RequestMethod.GET}) public String fileUpload(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception { Map<String, Object> resMap = new HashMap<String, Object>(); Integer userId = Cp2yHelper.getCurrentUserId(request); User user = userService.findUserById(userId); String name = user.getUsername(); Date date=new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat=new SimpleDateFormat("yyyyMMdd"); //获取文件名 String filesname = file.getOriginalFilename(); String fileName=dateFormat.format(date)+userId+".jpg"; /**判断文件是否为空,空直接返回上传错误*/ if (file == null) { resMap.put(SystemConstants.FLAG, SystemConstants.FLAG_FAIL); resMap.put(SystemConstants.MESSAGE, "头像文件不存在"); model.addAttribute("message","头像文件不存在,请返回重新上传"); return "user/uploaderror"; } //获得文件后缀名 String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")); //检测图片类型 if (!verifyFile(suffix, new String[]{".jpg", ".jpeg", ".png", ".bmp"})) { resMap.put(SystemConstants.FLAG, SystemConstants.FLAG_FAIL); resMap.put(SystemConstants.MESSAGE, "文件格式错误"); logger.info("文件格式错误:" + fileName); model.addAttribute("message","文件格式错误,请返回重新上传"); return "user/uploaderror"; } if (file.getSize() > 10 * 1024 * 1024) { resMap.put(SystemConstants.FLAG, SystemConstants.FLAG_FAIL); resMap.put(SystemConstants.MESSAGE, "文件不能大于10M"); logger.info("文件不能大于10M"); model.addAttribute("message","文件超出大小限制,请返回重新上传"); return "user/uploaderror"; } try { String filepath = BGConfig.get("AVATAR_FILE_UPLOAD") + "/" + user.getId(); File newFile = new File(filepath); if (!newFile.exists()) { newFile.mkdirs(); } else { if (newFile.isDirectory()) { String[] children = newFile.list(); //递归删除目录中的子目录 for (int i = 0; i < children.length; i++) { new File(filepath, children[i]).delete(); } } } newFile = new File(filepath, fileName); if (!newFile.exists()) { newFile.createNewFile(); } InputStream in = file.getInputStream(); FileOutputStream out = new FileOutputStream(newFile); byte[] buffer = new byte[1024]; int length; //available,返回的实际可读字节数 while (in.available() > 0) { in.read(buffer); out.write(buffer, 0, buffer.length); } String compress=BGConfig.get("AVATAR_FILE_UPLOAD")+"/"+user.getId()+"/"+fileName; File compressfile=new File(compress); ImageUtil imagecompress=new ImageUtil(); imagecompress.resize(compressfile,new File(compress),200,1f); user.setAvatar(BGConfig.getHomeResUrl() + "/file/upload/avatar/" + user.getId() + "/" + fileName); userService.update(user); } catch (Exception e) { logger.error("上传失败", e); model.addAttribute("message","文件上传失败,请返回重新上传"); return "user/uploaderror"; } String files = user.getAvatar(); resMap.put(SystemConstants.FLAG, SystemConstants.FLAG_SUCCESS); model.addAttribute("username", name); model.addAttribute("fileurl", files); return "user/index"; } // 验证文件正确; private boolean verifyFile(String filename, String[] exts) throws Exception { boolean flag = false; String ext = FileUtil.parseExtendName(filename); if (ext == null) { return false; } if (exts != null && exts.length > 0) { if (exts[0].equals("*.*")) return true; for (int i = 0; i < exts.length; i++) { if (ext.equalsIgnoreCase(exts[i])) { flag = true; break; } } } return flag; } }
引用此工具类的时候,引入rt.jar包,但是由于
所在包为com.sun.image.codec.jpeg.JPEGImageEncoder
因为这个不是Java自带的包,是sun公司出的扩展包,javaapi查询不到,有时候会报一些错误。
基本解决办法:
1.引入rt.jar包
2.修改eclipse中把受访问限制的api提示从error改为warning
但是以上终归是只解决暂时问题,不是长久之计,最好是用ImageIO类来进行代替处理。
如果想用修改好的使用ImageIO来处理压缩的,请转至我的文章-----修改版imageio图片压缩工具