Guardar imagen en fichero

De ChuWiki


Crear imagen y guardarla en fichero[editar]

Vamos a ver aquí un ejemplo de cómo guardar una imagen con java en un fichero jpg. Para ello utilizaremos la clase ImageIO.

En primero lugar, se debe crear una imagen en memoria sobre la que podamos dibujar. Para ellos se usa BufferedImage. El código puede ser así

BufferedImage imagen = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);

donde 100, 100 son el ancho y alto en pixels para nuestra imagen, y el tercer parámetro indica cómo queremos que sea esa imagen. En nuestro ejemplo, BufferedImage.TYPE_INT_RGB representa una imagen con pixels de 8 bits en RGB.

Una vez obtenido el BufferedImage, le pedimos el Graphics para poder dibujar

// Hacemos el dibujo
Graphics g = imagen.getGraphics();
g.setColor(Color.red);
g.fillRect(50, 50, 100, 100);
g.setColor(Color.green);
g.fillRect(0, 0, 50, 50);
g.setColor(Color.yellow);
g.fillOval(25, 25, 50, 50);

Finalmente, sólo nos queda salvar la imagen en el fichero

try {
   ImageIO.write(imagen, "jpg", new File("foto.jpg"));
} catch (IOException e) {
   System.out.println("Error de escritura");
}

Los formatos en los que se puede grabar son bmp, jpg, wbmp, jpeg, png, gif, que son los que obtenemos con el siguiente trozo de código

for (String posibleFormato : ImageIO.getReaderFileSuffixes())
   System.out.println(posibleFormato);

El código completo de este ejemplo sería

package chuidiang.ejemplos;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
 * Ejemplo para guardar una imagen en un fichero desde java. Código original de
 * webo_cs
 */
public class GuardaGrafico {

	/**
	 * Main de ejemplo. Crea un BufferedImage, hace un dibujito y lo guarda en
	 * un fichero jpg.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		File fichero = new File("foto.jpg");
		String formato = "jpg";

		// Creamos la imagen para dibujar en ella.
		BufferedImage imagen = new BufferedImage(100, 100,
				BufferedImage.TYPE_INT_RGB);

		// Hacemos el dibujo
		Graphics g = imagen.getGraphics();
		g.setColor(Color.red);
		g.fillRect(50, 50, 100, 100);
		g.setColor(Color.green);
		g.fillRect(0, 0, 50, 50);
		g.setColor(Color.yellow);
		g.fillOval(25, 25, 50, 50);

		// Escribimos la imagen en el archivo.
		try {
			ImageIO.write(imagen, formato, fichero);
		} catch (IOException e) {
			System.out.println("Error de escritura");
		}
	}

}


Guardar una ventana en fichero[editar]

Si queremos guardar una de las ventanas de nuestra aplicación en un fichero de imagen, el proceso es similar, sólo que delegaremos el dibujado a la ventana.

Para ello, primero hay que crear un BufferedImage del tamaño del panel que queremos dibujar

BufferedImage imagen = new BufferedImage(panel.getWidth(),
   panel.getHeight(), BufferedImage.TYPE_INT_RGB);

y el dibujado, como hemos dicho, se delega al panel

Graphics g = imagen.getGraphics();
panel.paint(g);

el resto es igual. Veamos el ejemplo concreto con una ventana que tiene un JLabel, un JButton y un JTextField

package chuidiang.ejemplos;

import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.WindowConstants;

/**
 * Ejemplo para guardar una imagen en un fichero desde java. Código original de
 * webo_cs
 */
public class GuardaGraficoComponente {

	/**
	 * Main de ejemplo. Crea un BufferedImage, hace un dibujito y lo guarda en
	 * un fichero jpg.
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame unaVentana = new JFrame("la ventana");
		unaVentana.getContentPane().setLayout(new FlowLayout());
		unaVentana.getContentPane().add(new JLabel("etiqueta"));
		unaVentana.getContentPane().add(new JButton("boton"));
		unaVentana.getContentPane().add(new JTextField(20));
		unaVentana.pack();
		unaVentana.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		unaVentana.setVisible(true);

		File fichero = new File("foto.jpg");
		String formato = "jpg";

		// Creamos la imagen para dibujar en ella.
		BufferedImage imagen = new BufferedImage(unaVentana.getContentPane().getWidth(),
				unaVentana.getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB);

		// Hacemos el dibujo
		Graphics g = imagen.getGraphics();
		unaVentana.getContentPane().paint(g);

		// Escribimos la imagen en el archivo.
		try {
			ImageIO.write(imagen, formato, fichero);
		} catch (IOException e) {
			System.out.println("Error de escritura");
		}
	}

}