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:
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 .
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));