Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】

 更新时间:2018年07月20日 14:46:22   作者:赤砂之蝎我爱罗  
这篇文章主要介绍了Java实现的上传并压缩图片功能,可实现图片的等比例压缩或原尺寸压缩,涉及java文件读写、转换、传输等相关操作技巧,需要的朋友可以参考下

本文实例讲述了Java实现的上传并压缩图片功能。分享给大家供大家参考,具体如下:

先看效果:

原图:1.33M

处理后:27.4kb

关键代码:

package codeGenerate.util;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageZipUtil {
  public static void main(String[] args) {
    zipWidthHeightImageFile(new File("C:\\spider\\3.png"),new File("C:\\spider\\3-1.jpg"),425,638,0.7f);
    //zipImageFile(new File("C:\\spider\\2.JPG"),new File("C:\\spider\\2-2.JPG"),425,638,0.7f);
    //zipImageFile(new File("C:\\spider\\3.jpg"),new File("C:\\spider\\3-3.jpg"),425,638,0.7f);
    System.out.println("ok");
  }
  /**
   * 根据设置的宽高等比例压缩图片文件<br> 先保存原文件,再压缩、上传
   * @param oldFile 要进行压缩的文件
   * @param newFile 新文件
   * @param width 宽度 //设置宽度时(高度传入0,等比例缩放)
   * @param height 高度 //设置高度时(宽度传入0,等比例缩放)
   * @param quality 质量
   * @return 返回压缩后的文件的全路径
   */
  public static String zipImageFile(File oldFile,File newFile, int width, int height,float quality) {
    if (oldFile == null) {
      return null;
    }
    try {
      /** 对服务器上的临时文件进行处理 */
      Image srcFile = ImageIO.read(oldFile);
      int w = srcFile.getWidth(null);
      int h = srcFile.getHeight(null);
      double bili;
      if(width>0){
        bili=width/(double)w;
        height = (int) (h*bili);
      }else{
        if(height>0){
          bili=height/(double)h;
          width = (int) (w*bili);
        }
      }
      String srcImgPath = newFile.getAbsoluteFile().toString();
      System.out.println(srcImgPath);
      String subfix = "jpg";
      subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
      BufferedImage buffImg = null;
      if(subfix.equals("png")){
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      }else{
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      }
      Graphics2D graphics = buffImg.createGraphics();
      graphics.setBackground(new Color(255,255,255));
      graphics.setColor(new Color(255,255,255));
      graphics.fillRect(0, 0, width, height);
      graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
      ImageIO.write(buffImg, subfix, new File(srcImgPath));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return newFile.getAbsolutePath();
  }
  /**
   * 按设置的宽度高度压缩图片文件<br> 先保存原文件,再压缩、上传
   * @param oldFile 要进行压缩的文件全路径
   * @param newFile 新文件
   * @param width 宽度
   * @param height 高度
   * @param quality 质量
   * @return 返回压缩后的文件的全路径
   */
  public static String zipWidthHeightImageFile(File oldFile,File newFile, int width, int height,float quality) {
    if (oldFile == null) {
      return null;
    }
    String newImage = null;
    try {
      /** 对服务器上的临时文件进行处理 */
      Image srcFile = ImageIO.read(oldFile);
      String srcImgPath = newFile.getAbsoluteFile().toString();
      System.out.println(srcImgPath);
      String subfix = "jpg";
      subfix = srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length());
      BufferedImage buffImg = null;
      if(subfix.equals("png")){
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
      }else{
        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
      }
      Graphics2D graphics = buffImg.createGraphics();
      graphics.setBackground(new Color(255,255,255));
      graphics.setColor(new Color(255,255,255));
      graphics.fillRect(0, 0, width, height);
      graphics.drawImage(srcFile.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
      ImageIO.write(buffImg, subfix, new File(srcImgPath));
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
    }
    return newImage;
  }
}

说明:

1、根据需求大家可以自行设置质量参数quality,到底设置成多少,可以先看下效果在取值;

2、网上通用的方法用的是jdk自带jar包中方法,我这里衍生了一下:用Graphics2D,能够同时处理jpg和png格式;

3、new Color(255,255,255)是白色,等同于WHITE,但是用WHITE 的话,Linux下某些图片会有其它色值;

4、main中的宽425和高638可以根据自己的需求自行设置,但是对于长和宽一样的,按照400(小值的值425)*400来处理;

更多java相关内容感兴趣的读者可查看本站专题:《Java图片操作技巧汇总》、《java日期与时间操作技巧汇总》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》及《Java数据结构与算法教程》。

希望本文所述对大家java程序设计有所帮助。

相关文章

  • Java中JDBC实现动态查询的实例详解

    Java中JDBC实现动态查询的实例详解

    从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询。下面通过实例代码给大家讲解JDBC实现动态查询的方法,需要的朋友参考下吧
    2017-07-07
  • SpringBoot中读取application.properties配置文件的方法

    SpringBoot中读取application.properties配置文件的方法

    这篇文章主要介绍了SpringBoot中读取application.properties配置文件的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • java递归与非递归实现扫描文件夹下所有文件

    java递归与非递归实现扫描文件夹下所有文件

    这篇文章主要为大家详细介绍了java递归与非递归实现扫描文件夹下所有文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java上传文件到服务器指定文件夹实现过程图解

    Java上传文件到服务器指定文件夹实现过程图解

    这篇文章主要介绍了Java上传文件到服务器指定文件夹实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • springboot集成springsecurity 使用OAUTH2做权限管理的教程

    springboot集成springsecurity 使用OAUTH2做权限管理的教程

    这篇文章主要介绍了springboot集成springsecurity 使用OAUTH2做权限管理的教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Java 中 synchronized 的使用方式和锁升级

    Java 中 synchronized 的使用方式和锁升级

    Java中的synchronized关键字用于实现线程同步,保证同一时刻只有一个线程可以访问被同步的代码块或方法,JVM引入了锁升级机制,从无锁状态开始,根据竞争情况逐步升级为偏向锁、轻量级锁和重量级锁,以提高性能,感兴趣的朋友一起看看吧
    2025-03-03
  • Java的Socket通讯基础编程完全指南

    Java的Socket通讯基础编程完全指南

    这篇文章主要介绍了Java的Socket通讯基础编程,包括对Socket服务器的并发访问方法,是Java网络编程中的重要知识,相当推荐!需要的朋友可以参考下
    2015-08-08
  • SpringBoot中@FeignClient 注解的作用

    SpringBoot中@FeignClient 注解的作用

    Feign可以帮助我们定义和实现服务之间的 RESTful 接口,使得服务之间的调用更加方便和可靠,本文主要介绍了SpringBoot中@FeignClient 注解的作用,感兴趣的可以了解一下
    2024-06-06
  • SpringBoot2整合Redis多数据源步骤详解

    SpringBoot2整合Redis多数据源步骤详解

    这篇文章主要介绍了SpringBoot2整合Redis多数据源步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java从内存角度带你理解数组名实质是个地址的论述

    Java从内存角度带你理解数组名实质是个地址的论述

    这篇文章主要介绍了Java如何从内存解析的角度理解“数组名实质是一个地址”,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-09-09

最新评论