java实现图片压缩功能

简介: java实现图片压缩功能

加哥最近在写代码过程中需要将上传的图片进行自动压缩,但是又不能借助插件,下来就把代码分享给志同道合的小伙伴吧,在运行过程中一定需要注意图片路径输入正确。

1.java借助awt实现图片的压缩的方式一

public static void main(String[] args) {
        try {
            String inputImagePath = "D:\\500540b041a30ad044b5a19344f1b24f.png"; // 输入图片路径
            String outputImagePath = "D:\\500540b041a30ad044b5a19344f1b24f.png"; // 输出图片路径
            int targetSizeKB = 8; // 目标压缩大小(KB)
            BufferedImage image = ImageIO.read(new File(inputImagePath));
            Image compressedImage = compressImage(image, targetSizeKB);
            ImageIO.write((BufferedImage) compressedImage, "jpg", new File(outputImagePath));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    public static Image compressImage(BufferedImage image, int targetSizeKB) {
        // 计算目标图片的尺寸
        long targetSizeBytes = targetSizeKB * 1024;
        long originalSizeBytes = getImageSize(image);
        double compressionRatio = (double) targetSizeBytes / originalSizeBytes;
        int targetWidth = (int) (image.getWidth() * Math.sqrt(compressionRatio));
        int targetHeight = (int) (image.getHeight() * Math.sqrt(compressionRatio));
        // 使用ImageIO进行压缩
        BufferedImage compressedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
        compressedImage.getGraphics().drawImage(image.getScaledInstance(targetWidth, targetHeight, Image.SCALE_SMOOTH), 0, 0, null);
        return compressedImage;
    }
    public static long getImageSize(BufferedImage image) {
        File tempFile;
        try {
            tempFile = File.createTempFile("temp", ".tmp");
            ImageIO.write(image, "jpg", tempFile);
            long size = tempFile.length();
            tempFile.delete();
            return size;
        } catch (IOException ex) {
            ex.printStackTrace();
            return 0;
        }
    }

2.java借助awt实现图片的压缩的方式二

public static void main(String[] args) throws IOException {

   // 读取图片文件

  /**File input = new File("D:\\1691455935941.jpg");

   BufferedImage image = ImageIO.read(input);


   // 压缩图片

   BufferedImage compressedImage = compress(image, 0.5f);


   // 保存压缩后的图片

   File output = new File("D:\\");

   ImageIO.write(compressedImage, "jpg", output);**/

  File img = new File("D:\\500540b041a30ad044b5a19344f1b24f.jpg");

   System.out.println("输入的图片大小:" + img.length()/1024 + "KB");

   String outputDir = "D:\\";

   PicUtils.thumbnail_w_h(img, 0,0, outputDir);

}


public static BufferedImage compress(BufferedImage image, float quality) throws IOException {

   // 创建新的图片对象

   BufferedImage compressedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);


   // 设置压缩质量

   java.util.Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpg");

   ImageWriter writer = iterator.next();

   ImageWriteParam param = writer.getDefaultWriteParam();

   param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);

   param.setCompressionQuality(quality);


   // 压缩图片

   writer.setOutput(ImageIO.createImageOutputStream(compressedImage));

   writer.write(null, new IIOImage(image, null, null), param);

   return compressedImage;

}


/**

* 按照指定的宽高压缩原图

* @param img

* @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("."));

           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();

   }

}

相关文章
|
2月前
|
Java API
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
深入探讨 Java 8 集合操作:全面解析 Stream API 的强大功能
33 2
|
3月前
|
设计模式 Java API
【设计模式】JAVA Design Patterns——Combinator(功能模式)
【设计模式】JAVA Design Patterns——Combinator(功能模式)
|
26天前
|
存储 NoSQL Java
Java中使用redis的bitMap实现签到功能
这个实现示例提供了一种灵活、高效的方式,展示了如何使用Redis来解决现实中的问题。
27 2
|
6天前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
20 0
|
2月前
|
前端开发 Java 开发工具
Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统
系统开发环境 开发语言:java 技术架构:B/S架构 开发工具:maven、Visual Studio Code 前端框架:avue 后端框架:springboot、mybaits 数 据 库:MySQL
38 4
Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统
|
1月前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之使用ODPS Tunnel Upload功能时,遇到报错:Java 堆内存不足,该如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
1月前
|
搜索推荐 Java API
如何在Java应用中实现全文搜索功能
如何在Java应用中实现全文搜索功能
|
1月前
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
553 2
|
29天前
|
Java Spring
Java演进问题之Spring框架使用技术实现其核心功能如何解决
Java演进问题之Spring框架使用技术实现其核心功能如何解决
|
1月前
|
设计模式 并行计算 安全
Java面试题: 如何使用装饰器模式来增强ConcurrentHashMap的功能?在什么情况下应该使用CopyOnWriteArrayList而不是ArrayList?
Java面试题: 如何使用装饰器模式来增强ConcurrentHashMap的功能?在什么情况下应该使用CopyOnWriteArrayList而不是ArrayList?
20 0