使用Thumbnails工具类能帮助我们对图片进行很好的处理,Thumbnails对图片的操作进行了很好的封装,往往很复杂的步骤用一行代码就完成了。

//一般针对文件处理,把一个源文件处理后输出到另一个文件
Thumbnails.of("aaa.jpg")   
        .size(400, 800)  
        .outputFormat("png")   
        .toFile("d:/bbb.png");

它可以实现如下常用图片处理功能:

指定大小(宽X高)进行缩放
按比例缩放
宽高不变调整图片质量
添加水印
旋转变换
图片格式转换
裁剪等
但是,生产环境常用的场景是,收集拍照图片上传,现在手机像素越来越高,一不留神就很大。APP加载程序崩溃。

图片大小不能超过指定Xk,所以我们得稍微加工一下。

利用递归方法,循环处理图片,直到达到我们要求的大小。

//初始缩放大小为不缩放,1
File tempFile=scaleImageAuto(srcFile, 1);
引入maven依赖:

<dependency>
		   <groupId>net.coobird</groupId>
		   <artifactId>thumbnailator</artifactId>
		   <version>0.4.8</version>
</dependency>
public static float MIN_IMAGE_SIZE=200.0f;//最小
public static float MAX_IMAGE_SIZE=100000f;//最大
public static float SCALE_STEP=0.05F;
public static float SCALE_ABS=30F;
public static String IMAGE_TYPE=".jpg";
/**
	 * 递归缩小大图,直到达到指定精度 
	 * 返回缩放比例
	 * @throws IOException 
	 * **/
	public static File scaleImageAuto(final File srcFile, float scale) throws IOException{
		float srcSize=srcFile.length()/1024f;
		if(srcSize<=MIN_IMAGE_SIZE  || Math.abs(MIN_IMAGE_SIZE-srcSize)<=SCALE_ABS){
			log.debug("文件大小符合规范!");
			return srcFile;
		}
		if(srcSize>MAX_IMAGE_SIZE){
			log.debug("文件太大,不处理!");
			return srcFile;
		}
		DecimalFormat df2 = new DecimalFormat("0.00");
		//创建临时目标文件
		File destFile=File.createTempFile(df2.format(scale)+srcFile.getName().replace(IMAGE_TYPE, ""),
                                      IMAGE_TYPE);
		Thumbnails.of(srcFile)
		.scale(scale)
		.outputQuality(0.8f)
		.toFile(destFile);
		
		//程序退出自动删除临时文件
		destFile.deleteOnExit();
		return scaleImageAuto(destFile, scale-SCALE_STEP);
    }
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐