java自带的Graphics

不需要额外引入Java包,速度略慢
测试代码

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.UUID;

public class ImageCompressUtil {

    private static String path = "D:\\picture\\";

    public static void main(String[] args) throws IOException {
        File imageFile = new File(path + "1234.jpg");
        BufferedImage inputImage = ImageIO.read(imageFile);

        //通过比例压缩
        float scale = 0.5f;
        BufferedImage outputImage = compress(inputImage, scale);

        //图片输出路径,以及图片名
        File outputFile = new File(path + UUID.randomUUID() + "." + getImageType(inputImage.getType()));
        ImageIO.write(outputImage, getImageType(inputImage.getType()), outputFile);
        // 图片持久化 方法二
//        FileOutputStream fileOutputStream = new FileOutputStream(path + UUID.randomUUID() + "." + getImageType(bufferedImage.getType()));
//        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fileOutputStream);
//        encoder.encode(finalImage);
//        fileOutputStream.close();
    }

    /**
     * 压缩图片
     */
    public static BufferedImage compress(BufferedImage inputImage, float scale) {
        //压缩之后的长度和宽度
        int outputHeight = (int)(inputImage.getHeight()*scale);
        int outputWidth = (int)(inputImage.getWidth()*scale);

        BufferedImage outputImage = new BufferedImage(outputWidth, outputHeight, inputImage.getType());

        outputImage.getGraphics().drawImage(
                inputImage.getScaledInstance(outputWidth, outputHeight, Image.SCALE_SMOOTH), 0, 0, null);
        
        return outputImage;
    }

    public static String getImageType(int imageType){
        switch (imageType){
//            case 5:
//                return "jpg";
            case 6:
                return "png";
            case 13:
                return "gif";
            default:
                return "jpg";
        }
    }

}

Google的一个开源框架thumbnailator

引入maven依赖

        <!--  压缩图片-->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.8</version>
        </dependency>

测试代码

import net.coobird.thumbnailator.Thumbnails;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.UUID;

public class ImageThumbnailsUtil {

    private static String path = "D:\\picture\\";

    public static void main(String[] args) throws Exception {
        long start = System.currentTimeMillis();
        File imageFile = new File(path + "1234.jpg");
        InputStream is = new FileInputStream(imageFile);
        BufferedImage bufferedImage = resizeImageSize(is, 1000);

        File outputFile = new File(path + UUID.randomUUID() + "." + getImageType(bufferedImage.getType()));
        ImageIO.write(bufferedImage, getImageType(bufferedImage.getType()), outputFile);
        System.out.print("用时:");
        System.out.println(System.currentTimeMillis()-start);
    }

    /**
     * 调整图片大小
     * @param inputStream 图片流
     * @param size
     */
    public static BufferedImage resizeImageSize(InputStream inputStream,int size) {

        ByteArrayOutputStream os = null;
        ByteArrayInputStream is = null;

        try{
            int length = size * 1200;// size*1024*3/4 向下取近似值
            int fileSize = inputStream.available();
            BufferedImage src = ImageIO.read(inputStream);

            for (int i = 0; i < 10 && fileSize > length; i++) {
                BufferedImage outImage = Thumbnails.of(src).outputQuality(0.5f).size(src.getWidth() / 2, src.getHeight() / 2).asBufferedImage();

                os = imageOutput(outImage);
                is = new ByteArrayInputStream(os.toByteArray());

                fileSize = is.available();
                src = ImageIO.read(is);

                is.close();
                os.close();
            }

            return src;
        } catch (Exception e) {
            e.printStackTrace();
            try {
                if (is != null) { is.close(); }
                if (os != null) { os.close(); }
                if (inputStream != null) { inputStream.close(); }
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }

        }
        return null;
    }

    // BufferedImage 输出 OutputStream
    public static ByteArrayOutputStream imageOutput(BufferedImage bufferedImage) throws IOException {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ImageIO.write(bufferedImage, getImageType(bufferedImage.getType()), outputStream);
        return outputStream;
    }

    public static String getImageType(int imageType){
        switch (imageType){
//            case 5:
//                return "jpg";
            case 6:
                return "png";
            case 13:
                return "gif";
            default:
                return "jpg";
        }
    }
}
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐