Come salvare una BufferedImage come un file

Sto usando la libreria Java di imgscalr per ridimensionare un’immagine.

Il risultato di una chiamata al metodo resize () è un object BufferedImage. Ora voglio salvarlo come un file (solitamente .jpg).

Come lo posso fare? Voglio andare da BufferedImage -> File ma forse questo non è l’approccio corretto?

 File outputfile = new File("image.jpg"); ImageIO.write(bufferedImage, "jpg", outputfile); 

È ansible salvare un object BufferedImage utilizzando il metodo write della class javax.imageio.ImageIO . La firma del metodo è come questa:

 public static boolean write(RenderedImage im, String formatName, File output) throws IOException 

Qui im è RenderedImage da scrivere, formatName è la stringa che contiene il nome informale del formato (ad es. Png) e l’ output è l’object file su cui scrivere. Di seguito è riportato un esempio di utilizzo del metodo per il formato file PNG:

 ImageIO.write(image, "png", file); 

Crea e salva un file java.awt.image.bufferedImage:

 import java.io.*; import java.awt.image.*; import javax.imageio.*; public class Main{ public static void main(String args[]){ try{ BufferedImage img = new BufferedImage( 500, 500, BufferedImage.TYPE_INT_RGB ); File f = new File("MyFile.png"); int r = 5; int g = 25; int b = 255; int col = (r << 16) | (g << 8) | b; for(int x = 0; x < 500; x++){ for(int y = 20; y < 300; y++){ img.setRGB(x, y, col); } } ImageIO.write(img, "PNG", f); } catch(Exception e){ e.printStackTrace(); } } } 

Gli appunti:

  1. Crea un file chiamato MyFile.png.
  2. L'immagine è 500 per 500 pixel.
  3. Sovrascrive il file esistente.
  4. Il colore dell'immagine è nero con una striscia blu nella parte superiore.

La risposta si trova all’interno del tutorial della documentazione Java per la scrittura / il salvataggio di un’immagine .

La class Image I/O fornisce il seguente metodo per il salvataggio di un’immagine:

 static boolean ImageIO.write(RenderedImage im, String formatName, File output) throws IOException 

Il tutorial spiega questo

La class BufferedImage implementa l’interfaccia RenderedImage.

quindi è in grado di essere utilizzato nel metodo.

Per esempio,

 try { BufferedImage bi = getMyImage(); // retrieve image File outputfile = new File("saved.png"); ImageIO.write(bi, "png", outputfile); } catch (IOException e) { // handle exception } 

È importante circondare la chiamata di write con un blocco try perché, come per l’API , il metodo genera una IOException “se si verifica un errore durante la scrittura”

Vengono inoltre illustrati l’objective, i parametri, i rendimenti e i lanci del metodo, in modo più dettagliato:

Scrive un’immagine utilizzando un ImageWriter arbitrario che supporta il formato specificato in un file. Se è già presente un file, il suo contenuto viene scartato.

parametri:

im – una RenderedImage da scrivere.

formatName: una stringa che contiene il nome informale del formato.

output – un file su cui scrivere.

Ritorna:

falso se non viene trovato uno scrittore appropriato.

Produce:

IllegalArgumentException – se qualche parametro è nullo.

IOException – se si verifica un errore durante la scrittura.

Tuttavia, formatName può sembrare ancora piuttosto vago e ambiguo; il tutorial lo chiarisce un po ‘:

Il metodo ImageIO.write chiama il codice che implementa PNG scrivendo un “plug-in PNG writer”. Il termine plug-in viene utilizzato poiché Image I / O è estensibile e può supportare un’ampia gamma di formati.

Ma i seguenti plug-in standard di formato immagine: JPEG, PNG, GIF, BMP e WBMP sono sempre presenti.

Per la maggior parte delle applicazioni è sufficiente utilizzare uno di questi plugin standard. Hanno il vantaggio di essere prontamente disponibili.

Esistono tuttavia formati aggiuntivi che è ansible utilizzare:

La class Image I / O offre un modo per colbind il supporto a formati aggiuntivi che possono essere utilizzati e molti plug-in esistono. Se sei interessato a quali formati di file sono disponibili per caricare o salvare nel tuo sistema, puoi usare i metodi getReaderFormatNames e getWriterFormatNames della class ImageIO. Questi metodi restituiscono una serie di stringhe che elencano tutti i formati supportati in questo JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

L’array restituito di nomi includerà eventuali plug-in aggiuntivi installati e uno qualsiasi di questi nomi potrebbe essere utilizzato come nome di formato per selezionare un writer di immagini.

Per un esempio completo e pratico, è ansible fare riferimento SaveImage.java di SaveImage.java di Oracle .

  1. Scarica e aggiungi imgscalr-lib-xxjar e imgscalr-lib-xx-javadoc.jar alle tue librerie di progetti.
  2. Nel tuo codice:

     import static org.imgscalr.Scalr.*; public static BufferedImage resizeBufferedImage(BufferedImage image, Scalr.Method scalrMethod, Scalr.Mode scalrMode, int width, int height) { BufferedImage bi = image; bi = resize( image, scalrMethod, scalrMode, width, height); return bi; } // Save image: ImageIO.write(Scalr.resize(etotBImage, 150), "jpg", new File(myDir)); 

Come una nave:

 ImageIO.write(Scalr.resize(ImageIO.read(...), 150));