1、由于商户进件时,上游对图片大小有要求(500kb以下),而我们平台图片过大(10M以上),所以必须通过程序将图片压缩后再上传;
2、java api可以通过ImageIO实现图片压缩,但效果不好,图片压缩后出现变红现象,故舍弃;
3、测试谷歌Thumbnails插件后,觉得还不错,故选用该插件来实现;
4、谷歌插件固然好,能指定不同的参数进行压缩,例如:宽高(size)、缩放(scale)、旋转()、指定质量比(outputQuality),但不能指定图片占存大小进行压缩(如果可以,请留言告知我,感激不尽!),故自己实现了此功能;
代码功能:
1、指定源文件路径、目标文件路径、最大图片大小(单位kb)、递归压缩的比率(0-1之间,建议0.8),如果测试出现java OutOfMemoryError,大多是递归压缩比例设置有问题;
2、可以实现图片格式之间的互转,只需在源文件和目标文件路径指定即可;
3、通过测试可知,png转jpg图片占存大小变小,jgp转png图片占存大小变大;
引用的jar包:
thumbnailator-0.4.8.jar
代码如下:
- import java.awt.image.BufferedImage;
- import java.io.File;
- import java.io.IOException;
- import java.math.BigDecimal;
-
- import javax.imageio.ImageIO;
-
- import net.coobird.thumbnailator.Thumbnails;
-
- import org.apache.commons.lang3.StringUtils;
-
- public class PicUtils {
-
- public static void main(String[] args) {
-
- PicUtils.commpressPicForScale("C:\\Users\\123\\Desktop\\1.png",
- "C:\\Users\\123\\Desktop\\12.jpg", 500, 0.8);
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static String commpressPicForScale(String srcPath, String desPath,
- long desFileSize, double accuracy) {
- if (StringUtils.isEmpty(srcPath) || StringUtils.isEmpty(srcPath)) {
- return null;
- }
- if (!new File(srcPath).exists()) {
- return null;
- }
- try {
- File srcFile = new File(srcPath);
- long srcFileSize = srcFile.length();
- System.out.println("源图片:" + srcPath + ",大小:" + srcFileSize / 1024
- + "kb");
-
-
- Thumbnails.of(srcPath).scale(1f).toFile(desPath);
-
- commpressPicCycle(desPath, desFileSize, accuracy);
-
- File desFile = new File(desPath);
- System.out.println("目标图片:" + desPath + ",大小" + desFile.length()
- / 1024 + "kb");
- System.out.println("图片压缩完成!");
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- return desPath;
- }
-
- private static void commpressPicCycle(String desPath, long desFileSize,
- double accuracy) throws IOException {
- File srcFileJPG = new File(desPath);
- long srcFileSizeJPG = srcFileJPG.length();
-
- if (srcFileSizeJPG <= desFileSize * 1024) {
- return;
- }
-
- BufferedImage bim = ImageIO.read(srcFileJPG);
- int srcWdith = bim.getWidth();
- int srcHeigth = bim.getHeight();
- int desWidth = new BigDecimal(srcWdith).multiply(
- new BigDecimal(accuracy)).intValue();
- int desHeight = new BigDecimal(srcHeigth).multiply(
- new BigDecimal(accuracy)).intValue();
-
- Thumbnails.of(desPath).size(desWidth, desHeight)
- .outputQuality(accuracy).toFile(desPath);
- commpressPicCycle(desPath, desFileSize, accuracy);
- }
-
- }