Cómo guardar una imagen almacenada como un archivo

125

Estoy usando la biblioteca imgscalr de Java para cambiar el tamaño de una imagen.

El resultado de una llamada al método resize () es un objeto BufferedImage. Ahora quiero guardar esto como un archivo (generalmente .jpg).

¿Cómo puedo hacer eso? Quiero ir de BufferedImage-> Filepero ¿quizás este no es el enfoque correcto?

Ankur
fuente

Respuestas:

238
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
Werner Kvalem Vesterås
fuente
77
Además, asegúrese de que exista el archivo de salida. Si no es así, write () arrojará (incorrectamente) una NullPointerException
Cody S
9
rodear con un try / catch.
Lou Morda
No atrapar NullPointerException, usarif (outputfile.exists())
Danon
24

Puede guardar un BufferedImageobjeto utilizando el método de escritura de la javax.imageio.ImageIOclase. La firma del método es así:

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

Aquí imestá el RenderedImagepara ser escrito, formatNamees la Cadena que contiene el nombre informal del formato (por ejemplo, png) y outputes el objeto de archivo para ser escrito. A continuación se muestra un ejemplo de uso del método para el formato de archivo PNG:

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

La respuesta se encuentra en el Tutorial de documentación de Java para escribir / guardar una imagen .

La Image I/Oclase proporciona el siguiente método para guardar una imagen:

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

El tutorial explica que

La clase BufferedImage implementa la interfaz RenderedImage.

entonces puede ser usado en el método.

Por ejemplo,

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

Es importante rodear la writellamada con un bloque de prueba porque, según la API , el método arroja un IOException"si ocurre un error durante la escritura"

También se explican el objetivo del método, los parámetros, los retornos y los lanzamientos, con más detalle:

Escribe una imagen usando un ImageWriter arbitrario que admite el formato dado a un archivo. Si ya hay un archivo presente, su contenido se descarta.

Parámetros:

im: una imagen renderizada que se escribirá.

formatName: una cadena que contiene el nombre informal del formato.

salida - un archivo para ser escrito.

Devoluciones:

falso si no se encuentra un escritor apropiado.

Lanza

IllegalArgumentException: si algún parámetro es nulo.

IOException: si se produce un error durante la escritura.

Sin embargo, formatNameaún puede parecer bastante vago y ambiguo; el tutorial lo aclara un poco:

El método ImageIO.write llama al código que implementa PNG escribiendo un "complemento de escritor PNG". El término complemento se utiliza ya que Image I / O es extensible y puede admitir una amplia gama de formatos.

Pero los siguientes complementos de formato de imagen estándar: JPEG, PNG, GIF, BMP y WBMP siempre están presentes.

Para la mayoría de las aplicaciones es suficiente usar uno de estos complementos estándar. Tienen la ventaja de estar fácilmente disponibles.

Sin embargo, hay formatos adicionales que puede usar:

La clase Image I / O proporciona una forma de conectar el soporte para formatos adicionales que se pueden usar, y existen muchos de estos complementos. Si está interesado en qué formatos de archivo están disponibles para cargar o guardar en su sistema, puede usar los métodos getReaderFormatNames y getWriterFormatNames de la clase ImageIO. Estos métodos devuelven una serie de cadenas que enumeran todos los formatos admitidos en este JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

El conjunto de nombres devuelto incluirá cualquier complemento adicional que esté instalado y cualquiera de estos nombres se puede usar como un nombre de formato para seleccionar un escritor de imágenes.

Para un ejemplo completo y práctico, uno puede consultar el ejemplo de Oracle SaveImage.java.

Kartik Chugh
fuente
9

Cree y guarde una imagen java.awt.image.buffered en el archivo:

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

Notas:

  1. Crea un archivo llamado MyFile.png.
  2. La imagen es de 500 por 500 píxeles.
  3. Sobrescribe el archivo existente.
  4. El color de la imagen es negro con una franja azul en la parte superior.
Eric Leschinski
fuente
1
  1. Descargue y agregue imgscalr-lib-xxjar e imgscalr-lib-xx-javadoc.jar a sus bibliotecas de proyectos.
  2. En su código:

    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
fuente
0

Como un trazador de líneas:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
Nicolas Modrzyk
fuente
11
Scalr es inexplicable.
Zon