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

2025-04-08 16:50

本文主要是介绍Java图片压缩三种高效压缩方案详细解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效...

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

Java public static voipythond 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)
     javascript           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();
    }

关键http://www.chinasem.cn技术:

  • 质量梯度测试:从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输出
            wrwww.chinasem.cniter.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) {
          javascript  e.printStackTrace();
        }
    }

核心优势:

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

性能对比:

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

四、方案选型建议

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

总结 

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

这篇关于Java图片压缩三种高效压缩方案详细解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154135

相关文章

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2