调用CompressPictureUtils.compress(要压缩的图片路径,保存的图片路径)可以对图片进行压缩。
左边的原图,右边是压缩后的图片。
调用函数的方法:
public static void main(String[] args) {CompressPictureUtils.compress("D:\\1.jpg", "D:\\0.jpg");}
可以设置压缩属性:
/*** 图片压缩最大宽1920像素*/public static final Integer PICTURE_COMPRESS_WIDTH_MAX = 1920;// 1920像素/*** 图片压缩最大高1920像素*/public static final Integer PICTURE_COMPRESS_HEIGHT_MAX = 1920;// 1920像素/*** 图片压缩最小容量64KB*/public static final Integer PICTURE_COMPRESS_MIN = 1 << 16;// 64KB/*** 图片压缩最大容量64MB*/public static final Integer PICTURE_COMPRESS_MAX = 1 << 26;// 64MB/*** 图片压缩最小容量差64KB*/public static final Integer PICTURE_COMPRESS_DIFFER_MIN = 1 << 16;// 64KB
工具类:(复制后可以直接使用)
package util;import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Files;import javax.imageio.ImageIO;/*** 图片压缩算法* * @author ALI**/
public class CompressPictureUtils {public static void main(String[] args) {CompressPictureUtils.compress("D:\\1.jpg", "D:\\0.jpg");}/*** 图片压缩最大宽1920像素*/public static final Integer PICTURE_COMPRESS_WIDTH_MAX = 1920;// 1920像素/*** 图片压缩最大高1920像素*/public static final Integer PICTURE_COMPRESS_HEIGHT_MAX = 1920;// 1920像素/*** 图片压缩最小容量64KB*/public static final Integer PICTURE_COMPRESS_MIN = 1 << 16;// 64KB/*** 图片压缩最大容量64MB*/public static final Integer PICTURE_COMPRESS_MAX = 1 << 26;// 64MB/*** 图片压缩最小容量差64KB*/public static final Integer PICTURE_COMPRESS_DIFFER_MIN = 1 << 16;// 64KBpublic static void compress(String sourceImagePath, String destinationImagePath) {try {/* 过滤小于64kb和大于64mb的图片 */File sourceImageFile = new File(sourceImagePath);File destinationImageFile = new File(destinationImagePath);long sourceImageSize = sourceImageFile.length();if (sourceImageSize == 0) {throw new Exception("empty");}if (sourceImageSize < PICTURE_COMPRESS_MIN) {throw new Exception("small");}if (sourceImageSize > PICTURE_COMPRESS_MAX) {throw new Exception("large");}/* 设置图片大小 */BufferedImage inputImage = ImageIO.read(sourceImageFile);int sourceImageWidth = inputImage.getWidth();int sourceImageHeight = inputImage.getHeight();int destinationImageWidth = sourceImageWidth;int destinationImageHeight = sourceImageHeight;if (sourceImageWidth > PICTURE_COMPRESS_WIDTH_MAX || sourceImageHeight > PICTURE_COMPRESS_HEIGHT_MAX) {if (sourceImageWidth > sourceImageHeight) {destinationImageWidth = PICTURE_COMPRESS_WIDTH_MAX;destinationImageHeight = destinationImageWidth * sourceImageHeight / sourceImageWidth;} else {destinationImageHeight = PICTURE_COMPRESS_HEIGHT_MAX;destinationImageWidth = destinationImageHeight * sourceImageWidth / sourceImageHeight;}}/* 压缩图片 */Image image = inputImage.getScaledInstance(destinationImageWidth, destinationImageHeight,Image.SCALE_DEFAULT);BufferedImage outputImage = new BufferedImage(destinationImageWidth, destinationImageHeight,BufferedImage.TYPE_INT_RGB);Graphics graphics = outputImage.getGraphics();graphics.drawImage(image, 0, 0, null);graphics.dispose();ImageIO.write(outputImage, "jpg", destinationImageFile);/* 过滤比原图小8kb以下的的图片 */long destinationImageSize = destinationImageFile.length();if (destinationImageSize > (sourceImageSize - PICTURE_COMPRESS_DIFFER_MIN)) {throw new Exception("low");}} catch (Exception e) {try {String msg = e.getMessage();if (msg == "small" || msg == "low") {// 过小或压缩率过低,保存原图File sourceImageFile = new File(sourceImagePath);File destinationImageFile = new File(destinationImagePath);destinationImageFile.delete();Files.copy(sourceImageFile.toPath(), destinationImageFile.toPath());} else {// 空或过大或异常,保存空图File emptyfile = new File(destinationImagePath);emptyfile.delete();emptyfile.createNewFile();}} catch (Exception e1) {}}}
}