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图片高效压缩内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot使用maven实现多环境运行和打包问题

    springboot使用maven实现多环境运行和打包问题

    这篇文章主要介绍了springboot使用maven实现多环境运行和打包问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    基于Java SpringBoot的前后端分离信息管理系统的设计和实现

    当今社会,人才的流动速度大大增加,因此也对党建工作的管理层面工作带来了空前且复杂的挑战,从而使得如何高效的开展管理党建工作成为了亟待解决的问题。本文将介绍通过Java SpringBoot实现前后端分离信息管理系统,感兴趣的同学可以了解一下
    2021-11-11
  • Spring Data JPA 设置字段默认值方式

    Spring Data JPA 设置字段默认值方式

    这篇文章主要介绍了Spring Data JPA设置字段默认值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中的ByteArrayInputStream详解

    Java中的ByteArrayInputStream详解

    Java中,ByteArrayInputStream类是实现内存级别的字节流读取的工具,可以从字节数组中读取数据,这个类位于java.io包中,继承自InputStream,ByteArrayInputStream的主要特点有:在内存中操作,不涉及磁盘IO,可以重用流读取数据
    2024-09-09
  • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    JavaEE开发之SpringMVC中的自定义消息转换器与文件上传

    本篇文章主要介绍了SpringMVC的相关知识。同时也会介绍到js、css这些静态文件的加载配置,以及服务器推送的两种实现方式并且给出了两者的区别。下面跟着小编一起来看下吧
    2017-04-04
  • Java多线程同步工具类CyclicBarrier的使用

    Java多线程同步工具类CyclicBarrier的使用

    本文主要介绍了Java多线程同步工具类CyclicBarrier的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

    Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

    对比SpringBoot拦截器与过滤器在执行顺序、作用范围、异常处理等核心差异,指导开发实践与选型策略,强调拦截器适合Web层通用逻辑,过滤器用于底层处理,建议结合APM工具优化性能,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • Java中的HashMap为什么会产生死循环

    Java中的HashMap为什么会产生死循环

    这篇文章主要介绍了Java中的HashMap为什么会产生死循环,HashMap 死循环是一个比较常见、比较经典的问题,下面文章我们就来彻底理解死循环的原因。需要的小伙伴可以参考一下
    2022-05-05
  • IDEA Maven下载依赖包速度过慢的问题及解决方案

    IDEA Maven下载依赖包速度过慢的问题及解决方案

    这篇文章主要介绍了IDEA Maven下载依赖包速度过慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • RocketMQ消息存储文件的加载与恢复机制源码分析

    RocketMQ消息存储文件的加载与恢复机制源码分析

    这篇文章主要介绍了RocketMQ源码分析之消息存储文件的加载与恢复机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论