ImageHelper.java 4.4 KB
package com.yanzuoguang.util;

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * 图片处理程序
 *
 * @author 颜佐光
 */
public class ImageHelper {

    public static final float DEFAULT_SIZE = 1f;
    public static final float DEFAULT_QUALITY = 1f;

    /**
     * 压缩图片
     *
     * @param srcFilePath  来源路径
     * @param descFilePath  目标路径
     * @param quality      质量程度,取值0~1范围内
     * @param size         大小程度,取值0~1范围内
     * @throws IOException
     */
    public static void compressPicBySystem(String srcFilePath, String descFilePath,
                                           float quality, float size) throws IOException {
        // 设置默认值
        if (size == 0) {
            size = 1;
        }
        if (quality == 0) {
            quality = 1;
        }
        File input = new File(srcFilePath);
        BufferedImage image = ImageIO.read(input);

        // 压缩图片大小
        if (size < 1) {
            int toWidth = (int) (image.getWidth() * size);
            int toHeight = (int) (image.getHeight() * size);
            BufferedImage buffImage = new BufferedImage(toWidth, toHeight, BufferedImage.TYPE_INT_RGB);
            buffImage.getGraphics().drawImage(image.getScaledInstance(toWidth, toHeight, Image.SCALE_SMOOTH),
                    0, 0, null);
            image = buffImage;
        }

        // 先指定Output,才能调用writer.write方法
        File output = new File(descFilePath);

        // 指定写图片的方式为 jpg
        ImageWriter writer = null;
        OutputStream out = null;
        ImageOutputStream ios = null;
        try {
            writer = ImageIO.getImageWritersByFormatName("jpg").next();
            out = new FileOutputStream(output);
            ios = ImageIO.createImageOutputStream(out);

            writer.setOutput(ios);

            ImageWriteParam param = writer.getDefaultWriteParam();
            if (param.canWriteCompressed()) {
                // 指定压缩方式为MODE_EXPLICIT
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                // param.set
                // 压缩程度,参数quality是取值0~1范围内
                param.setCompressionQuality(quality);
            }
            // 调用write方法,向输入流写图片
            writer.write(null, new IIOImage(image, null, null), param);
        } finally {
            if (out != null) {
                out.close();
            }
            if (ios != null) {
                ios.close();
            }
            if (writer != null) {
                writer.dispose();
            }
        }
    }


    /**
     * 压缩图片
     *
     * @param srcFilePath  来源路径
     * @param descFilePath  目标路径
     * @throws IOException
     */
    public static void compressPic(String srcFilePath, String descFilePath) throws IOException {
        compressPic(srcFilePath, descFilePath, DEFAULT_QUALITY, DEFAULT_SIZE);
    }

    /**
     * 压缩图片
     *
     * @param srcFilePath  来源路径
     * @param descFilePath  目标路径
     * @param quality      压缩程度,参数quality是取值0~1范围内
     * @throws IOException
     */
    public static void compressPic(String srcFilePath, String descFilePath, float quality) throws IOException {
        compressPic(srcFilePath, descFilePath, quality, DEFAULT_SIZE);
    }

    /**
     * 压缩图片
     *
     * @param srcFilePath  来源路径
     * @param descFilePath  目标路径
     * @param quality      质量程度,取值0~1范围内
     * @param size         大小程度,取值0~1范围内
     * @throws IOException
     */
    public static void compressPic(String srcFilePath, String descFilePath, float quality, float size) throws IOException {
        Thumbnails
                // 来源目录
                .of(srcFilePath)
                // 按比例缩小
                .scale(size)
                // 质量压缩
                .outputQuality(quality)
                // 目标文件
                .toFile(descFilePath);
    }
}