Cómo guardar una imagen almacenada en búfer como un archivo

4 minutos de lectura

avatar de usuario
Ankur

estoy usando el imgscalr Biblioteca 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 -> File pero tal vez este no es el enfoque correcto?

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

  • Además, asegúrese de que exista el archivo de salida. Si no es así, write() lanzará (incorrectamente) una NullPointerException

    – CodyS

    23/10/2014 a las 18:52

  • rodear con un intento/captura.

    – Lou Morda

    12 de noviembre de 2014 a las 18:57

  • no atrapar NullPointerExceptionusar if (outputfile.exists())

    – Danón

    27 de mayo de 2020 a las 0:01

avatar de usuario
Kartik Chugh

La respuesta se encuentra dentro de la documentación de Java. Tutorial para Escribir/Guardar una Imagen.

los Image I/O class 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.

por lo que es capaz de ser utilizado 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 write llamar con un intentar bloquear porque, según la APIel método lanza un IOException “si ocurre un error durante la escritura”

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

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

Parámetros:

im: una imagen renderizada que se va a escribir.

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

salida: un archivo en el que se escribirá.

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, formatName todavía puede parecer bastante vago y ambiguo; el tutorial lo aclara un poco:

El método ImageIO.write llama al código que implementa la escritura PNG como un “complemento de escritura PNG”. El término complemento se usa porque 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, existen formatos adicionales que puede utilizar:

La clase Image I/O proporciona una forma de conectar la compatibilidad con formatos adicionales que se pueden usar, y existen muchos complementos de este tipo. 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();

La matriz de nombres devuelta 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 referirse a Oracle’s SaveImage.java ejemplo.

avatar de usuario
Raj hábil

Puedes guardar un BufferedImage objeto usando el método de escritura del javax.imageio.ImageIO clase. La firma del método es así:

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

Aquí im es el RenderedImage para ser escrito, formatName es la cadena que contiene el nombre informal del formato (por ejemplo, png) y output es el objeto de archivo en el que se va a escribir. A continuación se muestra un ejemplo de uso del método para el formato de archivo PNG:

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

avatar de usuario
eric leschinski

Cree y guarde una imagen java.awt.image.bufferedImage 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.

avatar de usuario
Zona

  1. Descargar y agregar imgscalr-lib-xxjar y imgscalr-lib-xx-javadoc.jar a sus Bibliotecas de Proyectos.
  2. En tu 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));
    

avatar de usuario
eric leschinski

Como una sola línea:

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

¿Ha sido útil esta solución?