Java克隆jpg不会丢失图像质量

时间:2016-06-09 05:46:14

标签: java image copy

我有以下方法将jpg照片从一个文件夹复制到另一个文件夹:

public static void copyImage(String from, String to) {
    try {
        File sourceimage = new File(from);
        BufferedImage image = ImageIO.read(sourceimage);
        ImageIO.write(image, "jpg", new File(to));
    } catch (IOException ex) {
        Logger.getLogger(ImgLib.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NullPointerException ex){
        Logger.getLogger(ImgLib.class.getName()).log(Level.SEVERE, null, ex);
    }       
}

它有效,但有点失去照片的质量。

我如何实现"完美"克隆没有失去质量?

3 个答案:

答案 0 :(得分:1)

        InputStream is = null;
        OutputStream os = null;
        try {
            is = new FileInputStream(new File("path/to/img/src"));
            os = new FileOutputStream(new File("path/to/img/dest"));
            byte[] buffer = new byte[1024];
            int length;
            while ((length = is.read(buffer)) > 0) {
                os.write(buffer, 0, length);
            }
        } finally {
            is.close();
            os.close();
        }

答案 1 :(得分:1)

是的,你是对的。在这一行:

ImageIO.write(image, "jpg", new File(to));

您的方法仍在重新编码图像数据,使用JPEG等有损格式,将不可避免地导致图像失真。

我想,您可以尝试使用以下代码复制图像文件:

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(new File("path/to/img/src"));
        os = new FileOutputStream(new File("path/to/img/dest"));
        byte[] buffer = new byte[8192];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }

此外,您可以使用Apache Commons IOUtils来简化从一个流到另一个流的复制,或者如果您使用的是Java 8,那么您只需调用Files.copy方法。

答案 2 :(得分:0)

您已使用BufferedImage将文件读入图像对象。 相反,您应该以与使用二进制文件相同的方式读取和写入图像文件(使用InputStraem和OutputStream)。