So speichern Sie ein BufferedImage als Datei

125

Ich verwende die imgscalr Java-Bibliothek, um die Größe eines Bildes zu ändern.

Das Ergebnis eines resize () -Methodenaufrufs ist ein BufferedImage-Objekt. Ich möchte dies jetzt als Datei speichern (normalerweise .jpg).

Wie kann ich das machen? Ich möchte von BufferedImage-> gehen, Fileaber vielleicht ist dies nicht der richtige Ansatz?

Ankur
quelle

Antworten:

238
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
Werner Kvalem Vesterås
quelle
7
Stellen Sie außerdem sicher, dass die Ausgabedatei vorhanden ist. Wenn dies nicht der Fall ist, löst write () (fälschlicherweise) eine NullPointerException
Cody S
9
umgeben mit einem try / catch.
Lou Morda
Nicht fangen NullPointerException, benutzenif (outputfile.exists())
Danon
24

Sie können ein BufferedImageObjekt mit der Schreibmethode der javax.imageio.ImageIOKlasse speichern . Die Signatur der Methode lautet wie folgt:

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

Hier imist der RenderedImagezu schreibende formatNameString, der String, der den informellen Namen des Formats enthält (z. B. png) und outputdas Dateiobjekt, in das geschrieben werden soll. Ein Beispiel für die Verwendung der Methode für das PNG-Dateiformat ist unten dargestellt:

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

Die Antwort liegt im Tutorial der Java-Dokumentation zum Schreiben / Speichern eines Bildes .

Die Image I/OKlasse bietet die folgende Methode zum Speichern eines Bildes:

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

Das Tutorial erklärt das

Die BufferedImage-Klasse implementiert die RenderedImage-Schnittstelle.

so kann es in der Methode verwendet werden.

Beispielsweise,

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

Es ist wichtig, den writeAufruf mit einem try-Block zu umgeben , da die Methode gemäß der API ein IOException"Wenn beim Schreiben ein Fehler auftritt" auslöst.

Außerdem werden das Ziel, die Parameter, die Rückgaben und die Würfe der Methode ausführlicher erläutert:

Schreibt ein Bild mit einem beliebigen ImageWriter, der das angegebene Format unterstützt, in eine Datei. Wenn bereits eine Datei vorhanden ist, wird deren Inhalt verworfen.

Parameter:

im - ein zu schreibendes RenderedImage.

formatName - Ein String, der den informellen Namen des Formats enthält.

Ausgabe - eine Datei, in die geschrieben werden soll.

Kehrt zurück:

false, wenn kein geeigneter Writer gefunden wird.

Würfe:

IllegalArgumentException - Wenn ein Parameter null ist.

IOException - wenn beim Schreiben ein Fehler auftritt.

Allerdings formatNamescheinen mag noch recht vage und mehrdeutig; Das Tutorial klärt es ein wenig auf:

Die ImageIO.write-Methode ruft den Code auf, der das Schreiben eines PNG-Writer-Plug-Ins durch PNG implementiert. Der Begriff Plug-In wird verwendet, da Image I / O erweiterbar ist und eine Vielzahl von Formaten unterstützen kann.

Die folgenden Standard-Plugins für das Bildformat sind jedoch immer vorhanden: JPEG, PNG, GIF, BMP und WBMP.

Für die meisten Anwendungen ist es ausreichend, eines dieser Standard-Plugins zu verwenden. Sie haben den Vorteil, leicht verfügbar zu sein.

Es gibt jedoch zusätzliche Formate, die Sie verwenden können:

Die Image I / O-Klasse bietet eine Möglichkeit, die Unterstützung für zusätzliche Formate einzubinden, die verwendet werden können, und es gibt viele solcher Plug-Ins. Wenn Sie daran interessiert sind, welche Dateiformate zum Laden oder Speichern in Ihrem System verfügbar sind, können Sie die Methoden getReaderFormatNames und getWriterFormatNames der ImageIO-Klasse verwenden. Diese Methoden geben ein Array von Zeichenfolgen zurück, in denen alle in dieser JRE unterstützten Formate aufgelistet sind.

String writerNames[] = ImageIO.getWriterFormatNames();

Das zurückgegebene Array von Namen enthält alle zusätzlichen Plug-Ins, die installiert sind, und jeder dieser Namen kann als Formatname zur Auswahl eines Bildschreibers verwendet werden.

Ein vollständiges und praktisches Beispiel finden Sie im Beispiel von Oracle SaveImage.java.

Kartik Chugh
quelle
9

Erstellen und speichern Sie ein java.awt.image.bufferedImage in einer Datei:

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

Anmerkungen:

  1. Erstellt eine Datei mit dem Namen MyFile.png.
  2. Das Bild ist 500 x 500 Pixel groß.
  3. Überschreibt die vorhandene Datei.
  4. Die Farbe des Bildes ist schwarz mit einem blauen Streifen oben.
Eric Leschinski
quelle
1
  1. Laden Sie imgscalr-lib-xxjar und imgscalr-lib-xx-javadoc.jar Ihre Projektbibliotheken herunter und fügen Sie sie hinzu .
  2. In Ihrem 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
quelle
0

Als Einzeiler:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
Nicolas Modrzyk
quelle
11
Scalr ist ungeklärt.
Zon