2016-07-03 3 views
0

Я читаю gif изображение из интернет-url.Записать анимированный-gif, хранящийся в BufferedImage, в java.io.File Object

// URL of a sample animated gif, needs to be wrapped in try-catch block 
URL imageUrl = new Url("http://4.bp.blogspot.com/-CTUfMbxRZWg/URi_3Sp-vKI/AAAAAAAAAa4/a2n_9dUd2Hg/s1600/Kei_Run.gif"); 

// reads the image from url and stores in BufferedImage object. 
BufferedImage bImage = ImageIO.read(imageUrl); 

// creates a new `java.io.File` object with image name 
File imageFile = new File("download.gif"); 

// ImageIO writes BufferedImage into File Object 
ImageIO.write(bImage, "gif", imageFile); 

Код успешно выполнен. Но сохраненное изображение не анимируется, как исходное изображение.

У меня есть посмотрел на многие вопросы/ответы о переполнении стека, но я не могу пройти через это. Большинство из них делают это по BufferedImage по кадру, что изменяет частоту кадров. Мне не нужны изменения исходного изображения. Я хочу загрузить его так же, как и с тем же размером, с тем же разрешением и с той же частотой кадров.

Пожалуйста, имейте в виду, что я хочу, чтобы избежать использования streams и unofficial-libraries столько, сколько я могу (если это не может быть сделано без них, я буду использовать их).

Если есть альтернатива ImageIO или тому, как я читаю изображение с URL-адреса, и это делает все, пожалуйста, укажите мне в этом направлении.

ответ

2

Нет необходимости декодировать изображение, а затем повторно закодировать его.

Просто читать байты изображения и записывать байты, как есть, в файл:

try (InputStream in = imageUrl.openStream()) { 
    Files.copy(in, new File("download.gif").toPath()); 
} 
+0

вы удивительным. просто хочу спросить, могу ли я использовать его с 1000 вызовами в 'for-loop', будет ли он работать последовательно или мне нужен« синхронизированный »блок? – rupinderjeet

+0

Цикл for не выполняет код в нескольких потоках. Он просто выполняет свое тело последовательно, в одном потоке. Поэтому синхронизация бесполезна. Но даже если вы выполнили этот код в нескольких потоках, существует 0 разделяемых состояний между потоками, поэтому синхронизировать доступ нет. Синхронизация необходима, когда mutiple одновременные потоки получают доступ к общему изменяемому состоянию. У вас нет нитей. У вас нет состояния. –

+0

Я не уверен, что вы подразумеваете под «упражнением». Вы имеете в виду выполнение вышеуказанного кода для 1000 разных URL-адресов, запись в 1000 разных файлов, не так ли? –

Смежные вопросы