我必须保存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。
答案 0 :(得分:2)
JPEG始终是有损。即使在100%压缩质量下,也会有一些信息丢失,但它会被最小化。
你的example.jpg具有更大尺寸的原因是因为它使用100%品质因数进行编码,而大多数jpeg编码器的默认值为50%-75%,这是最常用的例子.JPG。您可以尝试使用不同的质量因子来查看两个文件的大小相同。
确实存在无损JPEG格式(在JAI中可用),但应该将其视为与传统JPEG格式不同的格式。然而,它并没有被广泛使用,你可能无法在大多数应用程序中查看它,这实际上会打败共享无辜图像的点。