使用了工具thumbnailator,据说thumbnailator是一个非常好的图片开源工具,使用起来很方便。不过没仔细看过,我只是需要压缩图片,让其占用空间变小而已。使用maven引入jar包
<!-- 图片缩略图 --> <dependency> <groupId>net.coobird</groupId> <artifactId>thumbnailator</artifactId> <version>0.4.8</version> </dependency>
代码如下即可:
Thumbnails.of("C:/Users/my/Pictures/this/2.jpg") .scale(1f) .outputQuality(0.25f) .toFile("C:/Users/my/Pictures/this/2(1).jpg");
源图片为1.2MB,压缩后图片大小为157KB
另外一种压缩,我这边的场景是,开始有一张图片只有200~300KB左右,但是我们要绘制一些特殊的图片或水印在上面,绘制完成后,就变成3、4M左右了,经过下面这种方式压缩后,大概变为1/3大小,但是分辨率和清晰度基本看不出有什么变化
import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.Map; import java.util.concurrent.Callable; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import org.apache.commons.lang.StringUtils; import com.grand.mysql_handler.mapper.SystemMapper; import net.sf.json.JSONObject; public static byte[] compressPic(BufferedImage image) throws IOException { ByteArrayOutputStream outArray = new ByteArrayOutputStream(); // 指定写图片的方式为 jpg ImageWriter imgWrier = ImageIO.getImageWritersByFormatName("jpg").next(); ImageWriteParam imgWriteParams = new javax.imageio.plugins.jpeg.JPEGImageWriteParam( null); // 要使用压缩,必须指定压缩方式为MODE_EXPLICIT imgWriteParams.setCompressionMode(imgWriteParams.MODE_EXPLICIT); // 这里指定压缩的程度,参数qality是取值0~1范围内, imgWriteParams.setCompressionQuality((float)1); imgWriteParams.setProgressiveMode(imgWriteParams.MODE_DISABLED); ColorModel colorModel = image.getColorModel();// ColorModel.getRGBdefault(); imgWriteParams.setDestinationType(new ImageTypeSpecifier( colorModel, colorModel.createCompatibleSampleModel(16, 16))); try { imgWrier.reset(); // 必须先指定 out值,才能调用write方法, ImageOutputStream可以通过任何 // OutputStream构造 imgWrier.setOutput(ImageIO.createImageOutputStream(outArray)); // 调用write方法,就可以向输入流写图片 imgWrier.write(null, new IIOImage(image, null, null), imgWriteParams); } catch (Exception e) { e.printStackTrace(); } return outArray.toByteArray(); }