1.代码如下:
/**
* 图片压缩
* 宽高0取原图,比例按原图大的宽或高算
* 若质量不变,建议去掉setQuality
*/
public static void zipImg(File originalFile, File resizedFile, int newWidth, int newHeight, float quality) throws IOException {
Image i = ImageIO.read(originalFile);
Image resizedImage;
int iWidth = i.getWidth(null);
int iHeight = i.getHeight(null);
if (iWidth >= iHeight) {
if(iWidth < newWidth || newWidth == 0){
newWidth = iWidth;
}
resizedImage = i.getScaledInstance(newWidth, (newWidth * iHeight) / iWidth, Image.SCALE_SMOOTH);
}else {
if(iHeight < newHeight || newHeight == 0){
newHeight = iHeight;
}
resizedImage = i.getScaledInstance((newHeight * iWidth) / iHeight, newHeight, Image.SCALE_SMOOTH);
}
// This code ensures that all the pixels in the image are loaded.
Image temp = new ImageIcon(resizedImage).getImage();
// Create the buffered image.
BufferedImage bufferedImage = new BufferedImage(temp.getWidth(null),
temp.getHeight(null), BufferedImage.TYPE_INT_RGB);
// Copy image to buffered image.
Graphics g = bufferedImage.createGraphics();
// Clear background and paint the image.
g.setColor(Color.white);
g.fillRect(0, 0, temp.getWidth(null), temp.getHeight(null));
g.drawImage(temp, 0, 0, null);
g.dispose();
// Soften.
float softenFactor = 0.05f;
float[] softenArray = { 0, softenFactor, 0, softenFactor,
1 - (softenFactor * 4), softenFactor, 0, softenFactor, 0 };
Kernel kernel = new Kernel(3, 3, softenArray);
ConvolveOp cOp = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
bufferedImage = cOp.filter(bufferedImage, null);
// Write the jpeg to a file.
FileOutputStream out = new FileOutputStream(resizedFile);
// Encodes image as a JPEG data stream
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
param.setQuality(quality, true);
encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);
}
2.1报错Unsupported Image Type解决方案,只需添加以下依赖即可。
<!-- cmyk格式图片转换 -->
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-jpeg</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.4.1</version>
</dependency>
2.2打包报错,程序包jpeg不存在,解决如下,按CTRL点击${java.home}时可以找到JDK的位置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArguments>
<verbose/>
<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>
</compilerArguments>
</configuration>
</plugin>
3.图片压缩工具thumbnailator,依赖
<!-- 图片压缩 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
其中方法
Thumbnails.of("原图片路径").size(width, height).outputQuality(quality).toFile("目标图片路径");
应该跟最上面的代码效果一样。
4.注意:发现png图片,单单质量压缩
Thumbnails.of("原图片路径").scale(1).outputQuality(quality).toFile("目标图片路径");
这方法图片大小会变大,还是得用最上面的代码。