基于JDK实现图片上传压缩 按照指定宽高压缩图片 生成缩略图

在很多项目中我们会把上传的图片做压缩处理,图片上传尺寸过大会对服务器的容量和网络带宽有很大浪费,如果不是必须的高清图片,我们可以通过代码来做压缩处理。我们压缩图片的目的是让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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值