开发者

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

开发者 https://www.devze.com 2025-04-10 10:44 出处:网络 作者: 很少更新
目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比:三、WebP高效格式转换核心优势:性能对比:四、方案选型建议总结 一、基于OpenCV的智能尺寸压缩
目录
  • 一、基于OpenCV的智能尺寸压缩
    • 技术亮点:
    • 适用场景:
  • 二、JPEG质量参数压缩
    • 关键技术:
    • 压缩效果对比:
  • 三、WebP高效格式转换
    • 核心优势:
    • 性能对比:
  • 四、方案选型建议
    • 总结 

      一、基于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.devze.com技术:

      • 质量梯度测试:从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.devze.comiter.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图片高效压缩内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号