Come salvare un'immagine bufferizzata come file


126

Sto usando la libreria Java imgscalr per ridimensionare un'immagine.

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

Come lo posso fare? Voglio passare da BufferedImage-> Filema forse questo non è l'approccio corretto?

Risposte:


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

7
Inoltre, assicurati che il file output esista. In caso contrario, write () genererà (erroneamente) un'eccezione NullPointerException
Cody S

9
circondare con una prova / cattura.
Lou Morda

Non prendere NullPointerException, usaif (outputfile.exists())
Danon

24

È possibile salvare un BufferedImageoggetto utilizzando il metodo di scrittura della javax.imageio.ImageIOclasse. La firma del metodo è così:

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

Qui im il RenderedImageda scrivere, formatNameè la Stringa contenente il nome informale del formato (es. Png) ed outputè l'oggetto file su cui scrivere. Di seguito è riportato un esempio di utilizzo del metodo per il formato file PNG:

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

20

La risposta si trova nel Tutorial per la scrittura / salvataggio di un'immagine della documentazione Java .

La Image I/Oclasse fornisce il seguente metodo per salvare un'immagine:

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

Il tutorial lo spiega

La classe BufferedImage implementa l'interfaccia RenderedImage.

quindi può 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 racchiudere la writechiamata con un blocco try perché, come per l'API , il metodo genera un fileIOException "se si verifica un errore durante la scrittura"

Vengono inoltre spiegati l'obiettivo, i parametri, i ritorni 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 eliminato.

parametri:

im - una RenderedImage da scrivere.

formatName - una stringa contenente il nome informale del formato.

output - un file su cui scrivere.

Ritorna:

false se non viene trovato alcun writer appropriato.

Produce:

IllegalArgumentException - se un parametro è null.

IOException - se si verifica un errore durante la scrittura.

Tuttavia, formatNamepuò ancora sembrare piuttosto vago e ambiguo; il tutorial lo chiarisce un po ':

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

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

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 puoi utilizzare:

La classe Image I / O fornisce un modo per collegare il supporto per formati aggiuntivi che possono essere utilizzati e molti di questi 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 classe ImageIO. Questi metodi restituiscono un array di stringhe che elenca tutti i formati supportati in questo JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

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

Per un esempio completo e pratico, si può fare riferimento all'esempio di Oracle SaveImage.java.


9

Crea e salva una java.awt.image.bufferedImage su file:

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();
        }
    }
}

Appunti:

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

1
  1. Scarica e aggiungi imgscalr-lib-xxjar e imgscalr-lib-xx-javadoc.jar alle tue librerie dei 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));

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.