Java保存原始JPEG没有损失

时间:2011-05-19 20:03:21

标签: java image-processing

如下所示,我将第一张图像作为原始JPEG图像。第二张图像用于缓冲图像,而不是使用1.0质量的http://www.lac.inpe.br/JIPCookbook/6040-howto-compressimages.jsp保存。静止图像尺寸变小,失真很小。是否可以将图像保存到其质量中?请注意,保存图像不仅仅是一个样本测试。添加文本后,我将其保存为最高质量,这也会丢失信息。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:6)

不要重绘图像并保存。只需复制原始字节!


我怀疑你当前的代码是这样的:

BufferedImage image = ImageIO.read(new File("my.jpg");
ImageIO.write(image, "jpg", new File("copy.jpg"));

每次重复此操作时,图像都会稍微改变(因为您看到总是松开一些质量)。如果您只想复制JPEG /文件而不更改任何内容,可以执行以下操作(从此页http://www.exampledepot.com/egs/java.io/CopyFile.html开始):

void copy(File src, File dst) throws IOException {
    InputStream in = new FileInputStream(src);
    OutputStream out = new FileOutputStream(dst);

    // Transfer bytes from in to out
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}

答案 1 :(得分:1)

即使原始图像数据来自JPEG,即使具有最高质量设置,JPEG也始终是有损的。

有一些操作,如旋转/镜像/裁剪,可以在JPEG上无损耗(使用像jpegtran这样的工具),但这些是罕见的例外。

无论如何,您似乎可以访问原始JPG图像并且不进行更改,因此我不明白为什么要再次压缩它。

如果你真的必须存储这些无损图像,最好的选择是使用JPEG2000的无损模式,这比使用JPG压缩的图像数据的PNG等其他替代品提供了更小的文件大小(尽管它仍然大得多)比原来的JPG)。例如,对于您的第一个示例图片:

 hAw2d.jpg ->   268,678 bytes (Original)
 hAw2d.jp2 -> 1,021,007 bytes (JPEG 2000, lossless)
 hAw2d.png -> 1,213,392 bytes (PNG)