如何在java中保存无损jpg?

时间:2016-10-22 10:14:32

标签: java image-processing jpeg steganography jai

我必须保存jpeg图像无损。我正在研究一个隐写术项目,但是Java压缩并保存了我的结果。我研究每个论坛并尝试一切,但它没有用。

这里我的无损示例代码保存了一个jpeg图像:

BufferedImage image = ImageIO.read(new File("sources/image.jpg"));

ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next();
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null);

jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
jpegParams.setCompressionQuality(1f);

writer.setOutput(ImageIO.createImageOutputStream(new File("example.jpg")));
writer.write(null, new IIOImage(image,null,null), jpegParams);
writer.dispose();

在此过程之后,我计算的PSNR值为28.53173,“ example.jpg ”的大小大于“ image.jpg ”。

我尝试导入JAI库,但我不确定Java 8是否支持JAI。

1 个答案:

答案 0 :(得分:2)

JPEG始终是有损。即使在100%压缩质量下,也会有一些信息丢失,但它会被最小化。

你的example.jpg具有更大尺寸的原因是因为它使用100%品质因数进行编码,而大多数jpeg编码器的默认值为50%-75%,这是最常用的例子.JPG。您可以尝试使用不同的质量因子来查看两个文件的大小相同。

确实存在无损JPEG格式(在JAI中可用),但应该将其视为与传统JPEG格式不同的格式。然而,它并没有被广泛使用,你可能无法在大多数应用程序中查看它,这实际上会打败共享无辜图像的点。