Java DIP - 图像压缩技术

图像可以通过 Java 轻松压缩和存储。图像压缩涉及将图像转换为 jpg 并存储。

为了压缩图像,我们读取图像并将其转换为 BufferedImage 对象。

此外,我们从 ImageIO 类中的 getImageWritersByFormatName() 方法获取 ImageWriter。从此 ImageWriter 创建一个 ImageWriteParam 对象。其语法如下 −

Iterator<ImageWriter> list = ImageIO.getImageWritersByFormatName("jpg");
ImageWriteParam obj = writer_From_List.getDefaultWriteParam();

从此 ImageWriteParam 对象,您可以通过调用这两个方法(setCompressionMode()setCompressionQuality())来设置压缩。它们的语法如下所示 −

obj.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
obj.setCompressionQuality(0.05f);

setCompressionMode() 方法以 Mode_EXPLICIT 作为参数。简要描述了其他一些模式 −

Sr.No. 模式
1

MODE_DEFAULT

它是一个常量值,可以传递到方法中以启用该功能以供将来写入。

2

MODE_DISABLED

它是一个常量值,可以传递到方法中以禁用该功能以供将来写入。

3

MODE_EXPLICIT

这是一个常量值,可以传递到方法中以启用该功能以供将来写入。

除了压缩方法之外,ImageWriteParam 类还提供了其他方法。它们简要描述 −

Sr.No. 方法 &描述
1

canOffsetTiles()

如果写入器在写入时可以执行具有非零网格偏移的平铺,则返回 true。

2

getBitRate(float quality)

返回一个浮点数,表示给定质量级别下输入图像数据的每一位输出数据的位数估计值。

3

getLocale()

返回当前设置的 Locale,如果只有默认 Locale,则返回 null支持。

4

isCompressionLossless()

如果当前压缩类型提供无损压缩,则返回 true。

5

unsetCompression()

它将删除所有先前的压缩类型和质量设置。

6

unsetTiling()

它将删除通过调用 setTiling 指定的任何先前的图块网格参数。

示例

以下示例演示了如何使用 ImageWriteParam 类来压缩图像 −

import java.io.*;
import java.util.*;
import java.awt.image.*;

import javax.imageio.*;
import javax.imageio.stream.ImageOutputStream;

class Compression {

   public static void main(String[] args) throws IOException {
   
      File input = new File("digital_image_processing.jpg");
      BufferedImage image = ImageIO.read(input);

      File compressedImageFile = new File("compress.jpg");
      OutputStream os =new FileOutputStream(compressedImageFile);

      Iterator<ImageWriter>writers =  ImageIO.getImageWritersByFormatName("jpg");
      ImageWriter writer = (ImageWriter) writers.next();

      ImageOutputStream ios = ImageIO.createImageOutputStream(os);
      writer.setOutput(ios);

      ImageWriteParam param = writer.getDefaultWriteParam();
      
      param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
      param.setCompressionQuality(0.05f);
      writer.write(null, new IIOImage(image, null, null), param);
      
      os.close();
      ios.close();
      writer.dispose();
   }
}

输出

执行给定的代码时,它会将图像 digital_image_processing.jpg 压缩为等效的压缩图像,并将其写入硬盘,名称为 compress.jpg

原始图像

图像压缩技术教程

压缩图像 - 质量因子 − 0.05

图像压缩技术教程

压缩图像 - 质量因子 − 0.5

图像压缩技术教程