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

   }

}

相关文章
|
18天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
101 60
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
29天前
|
Java 程序员
在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。
【10月更文挑战第13天】在Java编程中,关键字不仅是简单的词汇,更是赋予代码强大功能的“魔法咒语”。本文介绍了Java关键字的基本概念及其重要性,并通过定义类和对象、控制流程、访问修饰符等示例,展示了关键字的实际应用。掌握这些关键字,是成为优秀Java程序员的基础。
23 3
|
28天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
58 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
1月前
|
机器学习/深度学习 算法 Java
通过 Java Vector API 利用 SIMD 的强大功能
通过 Java Vector API 利用 SIMD 的强大功能
40 10
|
1月前
|
Oracle 安全 Java
Java 22 为开发人员带来了重大增强功能
Java 22 为开发人员带来了重大增强功能
37 9
|
1月前
|
Java
让星星⭐月亮告诉你,jdk1.8 Java函数式编程示例:Lambda函数/方法引用/4种内建函数式接口(功能性-/消费型/供给型/断言型)
本示例展示了Java中函数式接口的使用,包括自定义和内置的函数式接口。通过方法引用,实现对字符串操作如转换大写、数值转换等,并演示了Function、Consumer、Supplier及Predicate四种主要内置函数式接口的应用。
25 1
|
3月前
|
Java 开发者
Java多线程教程:使用ReentrantLock实现高级锁功能
Java多线程教程:使用ReentrantLock实现高级锁功能
42 1
|
3月前
|
前端开发 开发者 安全
JSF支付功能大揭秘:探索如何在Java世界中实现安全无缝的在线支付体验
【8月更文挑战第31天】在电子商务和在线交易日益普及的今天,实现在线支付功能已成为许多Web应用的必备需求。JavaServer Faces (JSF) 作为一种流行的Java Web框架,提供了丰富的组件和工具来构建用户界面,包括与支付网关集成以实现在线支付。支付网关是处理信用卡和借记卡支付的系统,在商家和银行之间起到桥梁作用。本文将探讨如何使用JSF与支付网关集成,以及实现在线支付功能时需要考虑的关键点
46 0