Java图片压缩三种高效压缩方案详细解析

 更新时间:2025年04月08日 11:01:54   作者:很少更新  
图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,这篇文章主要介绍了Java图片压缩三种高效压缩方案的相关资料,需要的朋友可以参考下

一、基于OpenCV的智能尺寸压缩

java public static void extracted2() { '
String path = "C:\test.jpg"; 
String savePath = "D:\compressed.jpg"; 
int maxWidth = 800; 
int maxHeight = 600; 
compressImage(new File(path), new File(savePath), maxWidth, maxHeight); 
}
compressImage 写法为kotlin语法法,需要自己转换
fun compressImage(inputFile: File, outputFile: File, maxWidth: Int, maxHeight: Int) {
        try {
            val image = ImageIO.read(inputFile)
            val originalWidth = image.width
            val originalHeight = image.height
            var newWidth = originalWidth
            var newHeight = originalHeight

            // 计算新的宽度和高度,保持比例
            if (originalWidth > maxWidth || originalHeight > maxHeight) {
                val ratio = Math.min(maxWidth.toDouble() / originalWidth, maxHeight.toDouble() / originalHeight)
                newWidth = (originalWidth * ratio).toInt()
                newHeight = (originalHeight * ratio).toInt()
            }

            val resizedImage = BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB)
            resizedImage.createGraphics().apply {
                drawImage(image.getScaledInstance(newWidth, newHeight, java.awt.Image.SCALE_SMOOTH), 0, 0, null)
                dispose()
            }

            // 确保输出目录存在
            val outputPath: Path = Paths.get(outputFile.parent)
            if (!Files.exists(outputPath)) {
                Files.createDirectories(outputPath)
            }

            ImageIO.write(resizedImage, "jpg", outputFile)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

技术亮点:

  • 动态尺寸调整:通过设置最大宽高(800x600),自动保持原图比例
  • OpenCV加持:使用Imgproc.resize()进行高质量缩放
  • 跨平台支持:需配置OpenCV本地库(System.loadLibrary)

适用场景:

  • 移动端图片展示
  • 用户头像上传

二、JPEG质量参数压缩

java public static void extracted4() { 
	for (int i = 1; i <=10; i++) { 
		float quality = 0.1f * i; 
		compressImage(inputFile, outputFile, quality); 
	} 
}
public static void compressImage(File inputFile, File outputFile, float quality) throws IOException {
        // 读取图片
        BufferedImage image = ImageIO.read(inputFile);

        // 获取图片写入器
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("webp");
        ImageWriter writer = writers.next();

        // 设置写入器的输出目标
        ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
        writer.setOutput(ios);

        // 创建图片写入器配置
        IIOImage imageIO = new IIOImage(image, null, null);
        ImageWriteParam param = writer.getDefaultWriteParam();

        // 设置压缩质量
        if (param.canWriteCompressed()) {
            param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            param.setCompressionQuality(quality);
        }

        // 写入图片
        writer.write(null, imageIO, param);

        // 关闭资源
        ios.close();
        writer.dispose();
    }

关键技术:

  • 质量梯度测试:从0.1到1.0进行10级压缩测试
  • 无损压缩支持:通过ImageWriteParam控制压缩模式
  • 视觉质量平衡:找到文件大小与清晰度的最佳平衡点

压缩效果对比:

质量参数文件大小清晰度
0.345KB可接受
0.7120KB良好
1.0350KB无损

三、WebP高效格式转换

public static void extracted6() {
        String path = "C:\\Users\\美众\\Pictures\\test2.jpg";
        for (int i = 1; i <=10; i++) {
            float quality = 0.0f + i * 0.1f;
            System.out.println("quality:" + quality);
            String savePath = "D:\\save\\test2-webp-"+quality+".jpg";
            File inputFile = new File(path); // 原始图片文件
            File outputFile = new File(savePath);
            try {
                jpg2webp(inputFile, outputFile,quality);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
public static void jpg2webp(File oldfile, File newfile,float quality){
        try {
            // 获取原始文件的编码
            BufferedImage image = ImageIO.read(oldfile);
            // 创建WebP ImageWriter实例
            ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();
            // 配置编码参数
            WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
            // 设置压缩模式
            writeParam.setCompressionMode(WebPWriteParam.MODE_EXPLICIT);
            System.out.println("getCompressionTypes:"+JSON.toJSON(writeParam.getCompressionTypes()));
//            "Lossy"-有损,"Lossless"-无损
            writeParam.setCompressionType(writeParam.getCompressionTypes()[0]);
            writeParam.setCompressionQuality(quality);
            // 配置ImageWriter输出
            writer.setOutput(new FileImageOutputStream(newfile));
            // 进行编码,重新生成新图片
            writer.write(null, new IIOImage(image, null, null), writeParam);
            System.out.println("jpg文件转成webp格式成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

核心优势:

  • 压缩率提升:比JPEG节省25-35%空间
  • 透明通道支持:支持Alpha通道透明效果
  • 渐进式加载:支持渐进式解码加载

性能对比:

格式质量0.8加载速度兼容性
JPEG150KB100%
WebP95KB较快95%+

四、方案选型建议

  • 移动端优先:WebP + 质量压缩(0.6-0.8)
  • 用户上传处理:尺寸压缩 + JPEG质量0.7
  • 专业图库存储:OpenCV双算法校验(直方图对比+尺寸压缩)

总结 

到此这篇关于Java图片压缩三种高效压缩方案的文章就介绍到这了,更多相关Java图片高效压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现JDBC批量插入原理详解

    Java实现JDBC批量插入原理详解

    在JDBC中,executeBatch这个方法可以将多条dml语句批量执行,效率比单条执行executeUpdate高很多,这是什么原理呢?在mysql和oracle中又是如何实现批量执行的呢?本文将给大家介绍这背后的原理
    2023-03-03
  • Java之实现十进制与十六进制转换案例讲解

    Java之实现十进制与十六进制转换案例讲解

    这篇文章主要介绍了Java之实现十进制与十六进制转换案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • springboot如何解决跨域后session获取不到sessionId不一致

    springboot如何解决跨域后session获取不到sessionId不一致

    这篇文章主要介绍了springboot如何解决跨域后session获取不到sessionId不一致问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 约定优于配置_动力节点Java学院整理

    约定优于配置_动力节点Java学院整理

    以前做项目,总是写Ant配置文件,满足于自己更灵活的配置,而没有去思考,这么做到底值不值得
    2017-08-08
  • Java实现AC自动机全文检索示例

    Java实现AC自动机全文检索示例

    本篇文章主要介绍了Java实现AC自动机全文检索示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • java通过URLClassLoader类加载器加载外部jar代码示例

    java通过URLClassLoader类加载器加载外部jar代码示例

    ClassLoader翻译过来就是类加载器,普通的java开发者其实用到的不多,但对于某些框架开发者来说却非常常见,下面这篇文章主要给大家介绍了关于java通过URLClassLoader类加载器加载外部jar的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java获取调用当前方法的类名或方法名(栈堆信息)的四种方式举例

    Java获取调用当前方法的类名或方法名(栈堆信息)的四种方式举例

    在Java编程中我们经常需要在运行时获取当前执行的方法名称,这在日志记录、性能监控、调试等方面非常有用,这篇文章主要给大家介绍了关于Java获取调用当前方法的类名或方法名(栈堆信息)的四种方式,需要的朋友可以参考下
    2024-09-09
  • Java中的DelayQueue源码解析

    Java中的DelayQueue源码解析

    这篇文章主要介绍了Java中的DelayQueue源码解析,一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素,只有延时期满后才能从队列中获取元素,需要的朋友可以参考下
    2023-12-12
  • java类中serialVersionUID的作用及其使用

    java类中serialVersionUID的作用及其使用

    这篇文章主要介绍了java类中serialVersionUID的作用及其使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 借助Maven搭建Hadoop开发环境的最详细教程分享

    借助Maven搭建Hadoop开发环境的最详细教程分享

    在Maven插件的帮助下,VSCode写Java其实非常方便,所以本文就来和大家详细讲讲如何借助maven用VScode搭建Hadoop开发环境,需要的可以参考下
    2023-05-05

最新评论