2016-06-09 2 views
0

я следующий способ справиться JPG фотографии из одной папки в другую:Java клон 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); 
    }  
} 

Он работает, но немного потерять качество фото.

Как я могу достичь «идеального» клонирования без потери качества?

+0

Почему вы читаете/записываете как ** изображение **? Почему бы просто не копировать файл как таковой? http://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java/106807#106807 –

+0

@AndreasFester, спасибо, я попробовал, и он работает – mondayguy

ответ

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.

0

Вы использовали BufferedImage, который читал файл в объект изображения. вместо этого вы должны читать и записывать файл изображения так же, как с двоичными файлами (используйте InputStraem и OutputStream).

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(); 
     } 
Смежные вопросы