java对图片进行压缩处理
前言:
减少网络开销,节约存储设备资源,同时获取更好的交互体验,同时又需要做到对图片的品质和质量没有太大的损失,需要对一些比较大的图片资源进行压缩处理。鉴于之前用到的一些开源的文件资源服务器,比如华为云obs,但是,其在图片进行等比压缩对图片文件数据压缩裁剪后质量太过于模糊,这样不满足用户交互体验,于是,需要程序对数据图片进行无损化处理。
简介:
本文主要是是针对原始图片最大边长进行最大限制,并根据原始图片的比例,进行最小边的大小设置,完成图片的等比缩放压缩。
1、导入需要依赖的外部jar包gav
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-imaging</artifactId>
<version>1.0-alpha2</version>
</dependency>
说明:本案例对以上的依赖资源,主要是解决对图片的尺寸大小进行获取。
2、图片进行裁剪
/**
* 模型原始贴图根据规则进行裁剪处理
* @param localFilePath (本地图片资源路径)
* @param ruleWidth (裁剪最长边)
*/
private String cutPicture(String localFilePath,int ruleWidth){
log.info("需要进行处理图片信息,path:{},ruleName:{},ruleWidth:{}",localFilePath,ruleName,ruleWidth);
String fileType = localFilePath.substring(localFilePath.lastIndexOf(".")+1);
File file = new File(localFilePath);
ImageInfo imageInfo = null;
try {
imageInfo = Imaging.getImageInfo(file);
} catch (ImageReadException e) {
log.error(e.getMessage(),e);
return null;
} catch (IOException e) {
log.error(e.getMessage(),e);
return null;
}
int height= imageInfo.getHeight();
int width= imageInfo.getWidth();
ruleWidth = ruleWidth > width ? width : ruleWidth;
double ratew =0d;
if(ruleWidth<width){
ratew = (double)ruleWidth/(double)width;
}
int ruleHeight =height;
if(ratew>0){
ruleHeight = (int)(height*ratew);
}
log.info("width = {},height = {},ruleWidth={},ruleHeight={}", width, height,ruleWidth,ruleHeight);
String fileName = file.getName();
String pathHead = localFilePath.substring(0,localFilePath.lastIndexOf("/")+1);
String filePrefix =pathHead+"new_"+fileName;
log.info("处理后图片存储:{}",filePrefix);
try(OutputStream outputStream = new FileOutputStream(new File(filePrefix));) {
BufferedImage orgImage = ImageIO.read(new FileInputStream(file));
BufferedImage buffImg = new BufferedImage(ruleWidth, ruleHeight,BufferedImage.TYPE_INT_RGB);
Graphics g = buffImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, ruleWidth, ruleHeight);
g.drawImage(orgImage, 0, 0, ruleWidth, ruleHeight, null);
g.dispose();
ImageIO.write(buffImg,fileType,outputStream);
return filePrefix;
} catch (IOException e) {
log.error(e.getMessage(),e);
}
return null;
}