Comment enregistrer une BufferedImage en tant que fichier

126

J'utilise la bibliothèque Java imgscalr pour redimensionner une image.

Le résultat d'un appel de méthode resize () est un objet BufferedImage. Je veux maintenant l'enregistrer dans un fichier (généralement .jpg).

Comment puis je faire ça? Je veux passer de BufferedImage-> Filemais ce n'est peut-être pas la bonne approche?

Ankur
la source

Réponses:

239
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
Werner Kvalem Vesterås
la source
7
Assurez-vous également que le fichier de sortie existe. Si ce n'est pas le cas, write () lancera (incorrectement) une NullPointerException
Cody S
9
entourez avec un essai / attraper.
Lou Morda
Ne pas attraper NullPointerException, utiliserif (outputfile.exists())
Danon
24

Vous pouvez enregistrer un BufferedImageobjet à l'aide de la méthode write de la javax.imageio.ImageIOclasse. La signature de la méthode est la suivante:

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

Voici imle RenderedImageà écrire, formatNameest la chaîne contenant le nom informel du format (par exemple png) et outputest l'objet de fichier dans lequel écrire. Un exemple d'utilisation de la méthode pour le format de fichier PNG est illustré ci-dessous:

ImageIO.write(image, "png", file);
Raj Adroit
la source
20

La réponse se trouve dans le didacticiel de la documentation Java pour l'écriture / l'enregistrement d'une image .

La Image I/Oclasse fournit la méthode suivante pour enregistrer une image:

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

Le tutoriel explique que

La classe BufferedImage implémente l'interface RenderedImage.

il peut donc être utilisé dans la méthode.

Par exemple,

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

Il est important d'entourer l' writeappel avec un bloc try car, selon l'API , la méthode lève un IOException"si une erreur se produit pendant l'écriture"

Les objectifs, les paramètres, les retours et les lancers de la méthode sont également expliqués plus en détail:

Écrit une image à l'aide d'un ImageWriter arbitraire qui prend en charge le format donné dans un fichier. S'il existe déjà un fichier, son contenu est ignoré.

Paramètres:

im - un RenderedImage à écrire.

formatName - une chaîne contenant le nom informel du format.

sortie - un fichier dans lequel écrire.

Retour:

false si aucun écrivain approprié n'est trouvé.

Jette:

IllegalArgumentException - si un paramètre est nul.

IOException - si une erreur se produit pendant l'écriture.

Cependant, cela formatNamepeut encore sembler assez vague et ambigu; le tutoriel clarifie un peu les choses:

La méthode ImageIO.write appelle le code qui implémente PNG en écrivant un «plug-in d'écriture PNG». Le terme plug-in est utilisé car les E / S d'image sont extensibles et peuvent prendre en charge un large éventail de formats.

Mais les plugins de format d'image standard suivants: JPEG, PNG, GIF, BMP et WBMP sont toujours présents.

Pour la plupart des applications, il suffit d'utiliser l'un de ces plugins standard. Ils ont l'avantage d'être facilement disponibles.

Il existe cependant d'autres formats que vous pouvez utiliser:

La classe Image I / O fournit un moyen de connecter la prise en charge de formats supplémentaires pouvant être utilisés, et de nombreux plug-ins de ce type existent. Si vous êtes intéressé par les formats de fichiers disponibles pour charger ou enregistrer dans votre système, vous pouvez utiliser les méthodes getReaderFormatNames et getWriterFormatNames de la classe ImageIO. Ces méthodes renvoient un tableau de chaînes répertoriant tous les formats pris en charge dans ce JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

Le tableau de noms renvoyé comprendra tous les plug-ins supplémentaires installés et l'un de ces noms peut être utilisé comme nom de format pour sélectionner un graveur d'image.

Pour un exemple complet et pratique, on peut se référer à l' exemple d'Oracle SaveImage.java.

Kartik Chugh
la source
9

Créez et enregistrez une image java.awt.image.bufferedImage dans un fichier:

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

Remarques:

  1. Crée un fichier appelé MyFile.png.
  2. L'image est de 500 par 500 pixels.
  3. Remplace le fichier existant.
  4. La couleur de l'image est noire avec une bande bleue en haut.
Eric Leschinski
la source
1
  1. Téléchargez et ajoutez imgscalr-lib-xxjar et imgscalr-lib-xx-javadoc.jar à vos bibliothèques de projets.
  2. Dans votre code:

    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));
Zon
la source
0

En une seule doublure:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
Nicolas Modrzyk
la source
11
Scalr est inexpliqué.
Zon