2012-10-01 28 views
74

Estoy utilizando la biblioteca de Java imgscalr para cambiar el tamaño de una imagen.Cómo guardar una Imagen Buffered como un Archivo

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 quizás este no sea el enfoque correcto?

Respuesta

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

El código sería sobrescribir la imagen original. –

+5

Además, asegúrese de que exista el archivo de salida. Si no lo hace, write() lanzará (incorrectamente) una NullPointerException –

+5

surround con un try/catch. –

18

Usted puede ahorrar utilizando el método de escritura BufferedImage objeto de la clase javax.imageio.ImageIO. La firma del método es la siguiente:

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

Aquí im es el RenderedImage a escribirse, formatName es la cadena que contiene el nombre informal del formato (por ejemplo, PNG) y output es el objeto de archivo que se escriben en . Un ejemplo de uso del método de formato PNG se muestra a continuación:

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

Como un trazador de líneas:

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

Scalr no tiene explicación. – Zon

1
  1. Descargar y añadir imgscalr-lib-x.x.jar y imgscalr-lib-x.x-javadoc.jar a sus proyectos de Bibliotecas.
  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)); 
    
7

crear y guardar un java.awt.image.bufferedImage a presentar:

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.
1

La respuesta se encuentra en la Documentación de Java Tutorial for Writing/Saving an Image.

La clase Image I/O 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 implementa la interfaz BufferedImage RenderedImage.

por lo que se puede utilizar 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 para rodear la llamada write con un try block porque, según the API, el método produce una IOException "si se produce un error durante la escritura"

también explicó son el objetivo, los parámetros, las devoluciones y los lanzamientos del método, en más detalle:

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

Parámetros:

im - un RenderedImage a ser escritos.

formatName - una Cadena que contiene el nombre informal del formato.

salida - a Archivo para ser escrito.

Devoluciones:

false si no se encuentra la grabadora adecuada.

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 borra un poco:

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

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

Para la mayoría de las aplicaciones, basta con utilizar uno de estos complementos estándar. Tienen la ventaja de estar disponibles.

Hay, sin embargo, formatos adicionales que puede utilizar:

La imagen de E/clase S proporciona una manera de conectar el soporte para formatos adicionales que se pueden utilizar, y muchos de estos plug-ins existe. Si le interesan los formatos de archivo 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 matriz de cadenas que enumeran todos los formatos admitidos en este JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

La matriz devuelta de nombres incluirá ningún tipo de plug-ins adicionales que se instalan y cualquiera de estos nombres se pueden utilizar como un nombre de formato para seleccionar un escritor imagen.

Para un ejemplo completo y práctico, se puede hacer referencia a Oracle SaveImage.java example.

Cuestiones relacionadas