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

   }

}

相关文章
|
10月前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
570 211
|
10月前
|
JavaScript Java 微服务
现代化 Java Web 在线商城项目技术方案与实战开发流程及核心功能实现详解
本项目基于Spring Boot 3与Vue 3构建现代化在线商城系统,采用微服务架构,整合Spring Cloud、Redis、MySQL等技术,涵盖用户认证、商品管理、购物车功能,并支持Docker容器化部署与Kubernetes编排。提供完整CI/CD流程,助力高效开发与扩展。
1104 64
|
9月前
|
存储 数据可视化 Java
Java Stream API 的强大功能
Java Stream API 是 Java 8 引入的重要特性,它改变了集合数据的处理方式。通过声明式语法,开发者可以更简洁地进行过滤、映射、聚合等操作。Stream API 支持惰性求值和并行处理,提升了代码效率和可读性,是现代 Java 开发不可或缺的工具。
192 0
Java Stream API 的强大功能
|
10月前
|
前端开发 JavaScript Java
Java 项目实战城市公园信息管理系统开发流程与实用功能实现指南
本系统基于Java开发,采用Spring Boot后端框架与Vue.js前端框架,结合MySQL数据库,构建了一个高效的城市公园信息管理系统。系统包含管理员、用户和保洁人员三大模块,涵盖用户管理、园区信息查询、订票预约、服务管理等功能,提升公园管理效率与服务质量。
284 6
|
10月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
452 2
|
11月前
|
Java API
Java API中Math类功能全景扫描
在实际使用时,这些方法的精确度和性能得到了良好的优化。当处理复杂数学运算或高精度计算时,`Math`类通常是足够的。然而,对于非常精细或特殊的数学运算,可能需要考虑使用 `java.math`包中的 `BigDecimal`类或其他专业的数学库。
255 11
|
10月前
|
机器学习/深度学习 算法 Java
Java 大视界 -- Java 大数据机器学习模型在生物信息学基因功能预测中的优化与应用(223)
本文探讨了Java大数据与机器学习模型在生物信息学中基因功能预测的优化与应用。通过高效的数据处理能力和智能算法,提升基因功能预测的准确性与效率,助力医学与农业发展。
|
11月前
|
Java API
深入解析Java API中Object类的功能
了解和合理运用 Object类的这些方法,对于编写可靠和高效的Java应用程序至关重要。它们构成了Java对象行为的基础,影响着对象的创建、识别、表达和并发控制。
211 0
|
11月前
|
消息中间件 监控 Java
借助最新技术构建 Java 邮件发送功能的详细流程与核心要点分享 Java 邮件发送功能
本文介绍了如何使用Spring Boot 3、Jakarta Mail、MailHog及响应式编程技术构建高效的Java邮件发送系统,涵盖环境搭建、异步发送、模板渲染、测试与生产配置,以及性能优化方案,助你实现现代化邮件功能。
802 0