图片按质量压缩

图片按质量压缩

    /***
     * author : dai xianjun
     * 按图片质量,压缩图片,直到小于制定的存储空间
     * @param originalFilePath
     * @param resizedFilePath
     * @param quality
     * @return
     * @throws IOException
     */
    public static boolean resizeByQuality(String originalFilePath, String resizedFilePath, float quality) throws IOException {
        if (quality > 1) {
            throw new IllegalArgumentException("Quality has to be between 0 and 1");
        }
        File originalFile = new File(originalFilePath);
        if (!originalFile.exists()){
            DkdLogger.error("resize",false,"originalFile is not exist,originalFilePath =: " + originalFilePath);
            return false;
        }
        ImageIcon ii = new ImageIcon(originalFile.getCanonicalPath());
        Image image = ii.getImage();
        Image resizedImage = null;
        resizedImage = image.getScaledInstance(image.getWidth(null), image.getHeight(null), 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(new File(resizedFilePath));

        // 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);
        return true;
    }
原文地址:https://www.cnblogs.com/daixianjun/p/resize-by-quality.html