Como salvar uma BufferedImage como um arquivo

125

Estou usando a biblioteca Java imgscalr para redimensionar uma imagem.

O resultado de uma chamada de método resize () é um objeto BufferedImage. Agora eu quero salvar isso como um arquivo (geralmente .jpg).

Como eu posso fazer isso? Eu quero ir de BufferedImage-> Filemas talvez essa não seja a abordagem correta?

Ankur
fonte

Respostas:

238
File outputfile = new File("image.jpg");
ImageIO.write(bufferedImage, "jpg", outputfile);
Werner Kvalem Vesterås
fonte
7
Além disso, verifique se existe o arquivo de saída. Se isso não acontecer, write () lançará (incorretamente) uma NullPointerException
Cody S
9
cercar com uma tentativa / captura.
Lou Morda
Não pegue NullPointerException, useif (outputfile.exists())
Danon
24

Você pode salvar um BufferedImageobjeto usando o método de gravação da javax.imageio.ImageIOclasse. A assinatura do método é assim:

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

Aqui imestá o que RenderedImagedeve ser escrito, formatNameé a String que contém o nome informal do formato (por exemplo, png) e outputé o objeto de arquivo no qual ele será gravado. Um exemplo de uso do método para o formato de arquivo PNG é mostrado abaixo:

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

A resposta está no Tutorial da documentação da Java para gravar / salvar uma imagem .

A Image I/Oclasse fornece o seguinte método para salvar uma imagem:

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

O tutorial explica que

A classe BufferedImage implementa a interface RenderedImage.

então ele pode ser usado no método

Por exemplo,

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

É importante cercar a writechamada com um bloco try, porque, conforme a API , o método gera IOException"se ocorrer um erro durante a gravação"

Também são explicados o objetivo, os parâmetros, os retornos e os arremessos do método, com mais detalhes:

Grava uma imagem usando um ImageWriter arbitrário que suporta o formato fornecido em um arquivo. Se já houver um arquivo presente, seu conteúdo será descartado.

Parâmetros:

im - uma RenderedImage a ser gravada.

formatName - uma String contendo o nome informal do formato.

output - um arquivo a ser gravado.

Devoluções:

false se nenhum gravador apropriado for encontrado.

Lances:

IllegalArgumentException - se algum parâmetro for nulo.

IOException - se ocorrer um erro durante a gravação.

No entanto, formatNameainda pode parecer bastante vago e ambíguo; o tutorial esclarece um pouco:

O método ImageIO.write chama o código que implementa o PNG gravando um "plug-in do gravador PNG". O termo plug-in é usado, pois o Image I / O é extensível e pode suportar uma ampla variedade de formatos.

Mas os seguintes plug-ins de formato de imagem padrão: JPEG, PNG, GIF, BMP e WBMP estão sempre presentes.

Para a maioria das aplicações, é suficiente usar um desses plugins padrão. Eles têm a vantagem de estar prontamente disponível.

Existem, no entanto, formatos adicionais que você pode usar:

A classe Image I / O fornece uma maneira de conectar o suporte a formatos adicionais que podem ser usados, e existem muitos desses plug-ins. Se você estiver interessado em quais formatos de arquivo estão disponíveis para carregar ou salvar em seu sistema, use os métodos getReaderFormatNames e getWriterFormatNames da classe ImageIO. Esses métodos retornam uma matriz de cadeias listando todos os formatos suportados neste JRE.

String writerNames[] = ImageIO.getWriterFormatNames();

A matriz de nomes retornada incluirá quaisquer plug-ins adicionais instalados e qualquer um desses nomes poderá ser usado como um nome de formato para selecionar um gravador de imagens.

Para um exemplo completo e prático, pode-se consultar o exemplo da Oracle SaveImage.java.

Kartik Chugh
fonte
9

Crie e salve uma java.awt.image.bufferedImage no arquivo:

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. Cria um arquivo chamado MyFile.png.
  2. A imagem tem 500 x 500 pixels.
  3. Substitui o arquivo existente.
  4. A cor da imagem é preta com uma faixa azul na parte superior.
Eric Leschinski
fonte
1
  1. Faça o download e inclua imgscalr-lib-xxjar e imgscalr-lib-xx-javadoc.jar nas suas Bibliotecas de projetos.
  2. No seu 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
fonte
0

Como um forro:

ImageIO.write(Scalr.resize(ImageIO.read(...), 150));
Nicolas Modrzyk
fonte
11
Scalr é inexplicável.
Zon