热爱技术,追求卓越
不断求索,精益求精

在线压缩工具都收费,用java写个压缩图片工具类

UI丢过来20M的图片,上传到在线压缩工具,上传不上去,好不容易上传上去了,压缩后下载要收费,心里哪个不愿意,于是网上查资料“Ctrl+C”弄了一个工具类,全部代码如下:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.imageio.ImageIO;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;


@Slf4j
public class ImageCompressUtil {

	private static final Integer ZERO = 0;
	private static final Integer ONE_ZERO_TWO_FOUR = 1024;
	private static final Integer NINE_ZERO_ZERO = 900;
	private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
	private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
	private static final Double ZERO_EIGHT_FIVE = 0.85;
	private static final Double ZERO_SIX = 0.6;
	private static final Double ZERO_FOUR_FOUR = 0.44;
	private static final Double ZERO_FOUR = 0.4;

	/**
	 * 根据指定大小压缩图片
	 *
	 * @param imageBytes
	 *            源图片字节数组
	 * @param desFileSize
	 *            目标图片大小,单位kb
	 * @return 压缩质量后的图片字节数组
	 */
	public static byte[] compressPic(byte[] imageBytes, long desFileSize) {
		if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
			return imageBytes;
		}
		long srcSize = imageBytes.length;
		double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
		try {
			while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
				ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
				ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
				Thumbnails.of(inputStream).scale(accuracy).outputQuality(accuracy).toOutputStream(outputStream);
				imageBytes = outputStream.toByteArray();
			}
			log.info("图片原大小={}kb | 压缩后大小={}kb", srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
		} catch (Exception e) {
			log.error("【图片压缩】msg=图片压缩失败!", e);
		}
		return imageBytes;
	}

	/**
	 * 自动调节精度(经验数值)
	 *
	 * @param size
	 *            源图片大小
	 * @return 图片压缩质量比
	 */
	private static double getAccuracy(long size) {
		double accuracy;
		if (size < NINE_ZERO_ZERO) {
			accuracy = ZERO_EIGHT_FIVE;
		} else if (size < TWO_ZERO_FOUR_SEVEN) {
			accuracy = ZERO_SIX;
		} else if (size < THREE_TWO_SEVEN_FIVE) {
			accuracy = ZERO_FOUR_FOUR;
		} else {
			accuracy = ZERO_FOUR;
		}
		return accuracy;
	}
	
	public static void main(String[] args) throws IOException {
        BufferedImage result = ImageIO.read(Files.newInputStream(Paths.get("C:\\Users\\username\\Desktop\\1.jpg")));
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(result, "jpg", os);
        //图个图片太大,则进行压缩
        byte[] imageBytes = os.toByteArray();
        if(imageBytes.length >= 400 * 1024) {
            imageBytes = compressPic(os.toByteArray(), 400);
        }
        InputStream input = new ByteArrayInputStream(imageBytes);
        
        BufferedImage targetImage = ImageIO.read(input);
        File outPutFile = new File("C:\\Users\\username\\Desktop\\ys1.jpg");
        ImageIO.write(targetImage, "jpg", outPutFile);
    }

}
赞(0)
未经允许不得转载:LoveCTO » 在线压缩工具都收费,用java写个压缩图片工具类

热爱技术 追求卓越 精益求精