emperorking

自用图片压缩工具类

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图片压缩工具

分类:

技术点:

相关文章: