Como salvar um BufferedImage como um arquivo

Eu estou usando a biblioteca Java imgscalr para resize uma imagem.

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

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

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

Você pode salvar um object BufferedImage usando o método write da class javax.imageio.ImageIO . A assinatura do método é assim:

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

Aqui im é o RenderedImage a ser escrito, formatName é o String contendo o nome informal do formato (por exemplo, png) e a output é o object do arquivo a ser gravado. Um exemplo de uso do método para o formato de arquivo PNG é mostrado abaixo:

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

Crie e salve um 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 é de 500 por 500 pixels.
  3. Sobrescreve o arquivo existente.
  4. A cor da imagem é preta com uma faixa azul na parte superior.

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

A class Image I/O 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 class 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 chamada de write com um bloco try porque, conforme a API , o método gera uma IOException “se ocorrer um erro durante a gravação”

Também são explicados os objectives, parâmetros, retornos e lançamentos do método, com mais detalhes:

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

parameters:

im – um RenderedImage a ser escrito.

formatName – uma String contendo o nome informal do formato.

saída – um arquivo a ser gravado.

Retorna:

false se nenhum escritor apropriado for encontrado.

Lança:

IllegalArgumentException – se algum parâmetro for nulo.

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

No entanto, formatName ainda 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 escrevendo um “plug-in do gravador PNG”. O termo plug-in é usado porque o Image I / O é extensível e pode suportar uma ampla gama de formatos.

Mas os seguintes plugins 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 plug-ins padrão. Eles têm a vantagem de estar prontamente disponíveis.

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

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

String writerNames[] = ImageIO.getWriterFormatNames();

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

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

  1. Faça o download e adicione imgscalr-lib-xxjar e imgscalr-lib-xx-javadoc.jar às suas bibliotecas de projetos.
  2. Em 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)); 

Como um forro:

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