在很多项目中我们会把上传的图片做压缩处理,图片上传尺寸过大会对服务器的容量和网络带宽有很大浪费,如果不是必须的高清图片,我们可以通过代码来做压缩处理。我们压缩图片的目的是让web页面或者移动端打开的速度很快,并且节省空间。
下面通过2种方式分享压缩图片具体实现过程:
方式一:按照指定的宽高压缩原图
/**
* 按照指定的宽高压缩原图
* @param img
* @param width
* @param height
* @param outputDir
*/
public static void thumbnail(File img, int destWidth, int destHeight,String outputDir){
System.out.println("图片压缩开始");
long startTime = System.currentTimeMillis();
try {
//读取源图
BufferedImage BI = ImageIO.read(img);
double srcWidth = BI.getWidth(); // 源图宽度
double srcHeight = BI.getHeight(); // 源图高度
if ((int)srcWidth >= destWidth && (int)srcHeight >= destHeight) {
String imageFullName = img.getName();
String prefix = imageFullName.substring(0,imageFullName.lastIndexOf("."))+'-'+destWidth +'×'+destHeight;
String suffix = imageFullName.substring(imageFullName.lastIndexOf("."));
String newName = prefix+suffix;
OutputStream fos =new FileOutputStream(outputDir+File.separatorChar+newName);
Image image = BI.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(destWidth, destHeight,BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.setColor(Color.RED);
g.drawImage(image, 0, 0, null); //绘制处理后的图
g.dispose();
ImageIO.write(tag, "JPEG", fos);
System.out.println("图片压缩结束");
long endTime = System.currentTimeMillis();
System.out.println("图片压缩共计耗时:" +(endTime-startTime)+"毫秒" );
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
方式二:按照宽高等比例缩放(缩小或放大)
/**
* 按照宽高等比例缩放(缩小或放大)
* @param img
* @param width
* @param height
* @param outputDir
*/
public static void thumbnail_w_h(File img,int destWidth,int destHeight,String outputDir){
try {
BufferedImage bi = ImageIO.read(img);
double srcWidth = bi.getWidth(); // 源图宽度
double srcHeight = bi.getHeight(); // 源图高度
double scale = 1;//缩放比例因子,大于1表示放大,小于1表示缩小
if (destWidth > 0 && destHeight > 0) {
//下面这个缩放比例因子取值很好理解,目标尺寸和原图尺寸的比值越大,
//表示缩放的比率越小,也就代表图片变形的越小,就取影响图片变形小的比例因子
scale = destHeight/srcHeight < destWidth/srcWidth ? destHeight/srcHeight : destWidth/srcWidth;
}
thumbnail(img, (int)(srcWidth * scale),(int)(srcHeight * scale),outputDir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
首先配置一个常量类,定义一些常用的图片宽高尺寸
package com.demo.serverProvider.utils;
/**
* 创建时间:2019年2月14日 上午11:22:26
* 项目名称:server-provider
* 类说明:图片资源常量
* @author guobinhui
* @since JDK 1.8.0_51
*/
public class ImageConstants {
/*移动端图片(小型缩略图,中型缩略图,大图)尺寸规格(宽高)*/
public static final int MOBILE_SMALL_IMAGE_WIDTH = 100;
public static final int MOBILE_SMALL_IMAGE_HEIGHT = 100;
/*文件资源存储的服务器的IP(主机host)*/
public static final String FILE_RESOURCE_HOST = "10.220.146.3";
/*图片资源存储的服务器(Windows)根目录*/
public static final String WIN_IMAGE_ROOT_DIR = "D:/image";
/*图片资源存储的服务器(Linux)根目录*/
public static final String LIN_IMAGE_ROOT_DIR = "/opt/image";
}
下面新建一个测试方法测一下:
public static void main(String[] args) {
// TODO Auto-generated method stub
File img = new File("D:/image/abc.jpg");
System.out.println("输入的图片大小:" + img.length()/1024 + "KB");
String outputDir = "D:/image";
ImageUtils.thumbnail(img,
ImageConstants.MOBILE_SMALL_IMAGE_WIDTH,ImageConstants.MOBILE_SMALL_IMAGE_HEIGHT, outputDir);
}
压缩后的结果如下图所示
欢迎各位开发者朋友一起交流。笔者电话(微信):18629374628