2016-07-03 4 views
0

Ich lese ein gif Bild von Internet-URL.Schreiben animiert-GIF in BufferedImage gespeichert zu java.io.File Objekt

// 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); 

Der Code wird erfolgreich ausgeführt. Das gespeicherte Bild wird jedoch nicht wie das Quellbild animiert.

Ich habe sahen viele der Stack-Überlauf Fragen/Antworten, aber ich bin nicht in der Lage, durch diesen zu bekommen. Die meisten von ihnen tun es durch BufferedImage Bild für Bild, das Framerate ändert. Ich möchte keine Änderungen am Quellbild vornehmen. Ich möchte es herunterladen, da es dieselbe Größe, dieselbe Auflösung und dieselbe Bildrate hat.

Bitte beachten Sie, dass i mit streams und unofficial-libraries so viel vermeiden wollen, wie ich kann (wenn es nicht ohne sie getan werden kann, ich sie verwenden).

Wenn es eine Alternative zu ImageIO oder die Art und Weise gibt, wie ich Bild von URL lese und es die Sache erledigt, bitte zeigen Sie mich in diese Richtung.

Antwort

2

Das Bild muss nicht decodiert und dann neu codiert werden.

Lesen Sie einfach die Bytes des Bildes, und die Bytes schreiben, wie es ist, in die Datei:

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

Sie ehrfürchtig sind. will nur fragen, ob ich es mit 1000 anrufe in einer 'for-loop' ausübung, wird es sequentiell arbeiten oder ich brauche' synchronized' block? – rupinderjeet

+0

Eine for-Schleife führt Code in mehreren Threads nicht aus. Es führt seinen Körper nur sequentiell in einem einzigen Thread aus. Also Synchronisation ist nutzlos. Aber auch wenn Sie diesen Code in mehreren Threads ausgeführt haben, gibt es 0 gemeinsamen Status zwischen Threads, also gibt es nichts, um den Zugriff zu synchronisieren. Die Synchronisierung wird benötigt, wenn mehrere Threads gleichzeitig auf den freigegebenen änderbaren Status zugreifen. Sie haben keine Threads. Du hast keinen Staat. –

+0

Ich bin mir nicht sicher, was Sie mit "übe es" meinen. Sie meinen, den obigen Code für 1000 verschiedene URLs auszuführen und in 1000 verschiedene Dateien zu schreiben, oder? –