Redimensionar imagem com java e obter o array de bytes

Desta vez irei postar algo que precisei a alguns dias, para redimensionar imagens e guardar essas imagens,
em uma pasta do S.O. Porém quando eu estava tentando guardar seu array de bytes por meio do modo tradicional
escrevendo ela no OutputStream diretamente, não estava guardando seu bytes corretamente, até que descobri a seguinte solução de escrever seu array de bytes através do ByteArrayOutputStream e escrever por meio do ImageIO.write. Veja como ficou as classes.

 
Classe para redimensionar Imagens

package com.wordpress.cassiosousa.redimensionar;

import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.imageio.ImageIO;

/**
 * Redimensiona imagem e obtém os byte[] dela
 * @author Cássio Alexandre de Sousa
 */
public class RedimensionarImagem {

	private static final Logger logger = Logger.getLogger(RedimensionarImagem.class.getName());
	private static final String EXTENSAO = "JPG";
	private int largura = 100;
	private int altura = 100;

	/**
	 * Construtor padrão
	 */
	public RedimensionarImagem(int largura,int  altura) {
		super();
		this.altura = altura;
		this.largura = largura;
	}

	/**
	 * Redimensiona imagem e retorna um array de bytes
	 * @param imagem
	 * @return
	 */
	public byte[] redimensionar(InputStream imagem){

		byte[] bytesImagem = null;
		Graphics2D graphisImagem = null;
		ByteArrayOutputStream baos = null;

		try {
			//transforma InputStream em uma BufferedImage
			BufferedImage bufImagemLida =  ImageIO.read(imagem);

			//cria imagem para
			BufferedImage imagemRedimensionada = new BufferedImage(largura,altura , BufferedImage.TYPE_INT_RGB);

			//realiza o redimensionamento da imagem
			graphisImagem = imagemRedimensionada.createGraphics();
			graphisImagem.drawImage(bufImagemLida,0,0, largura, altura,null);
			baos = new ByteArrayOutputStream();

			//escreve a imagem no OutputStream
			ImageIO.write(imagemRedimensionada, EXTENSAO, baos);

			//transforma o OutputStream em array de bytes e retorna
			bytesImagem = baos.toByteArray();
		} catch (IOException e) {
			logger.log(Level.SEVERE, e.getMessage());
		}finally{
			//libera recursos
			if(graphisImagem != null){
				graphisImagem.dispose();
			}

			if(baos != null){
				try {
					baos.close();
				} catch (IOException e) {
					logger.log(Level.SEVERE, e.getMessage());
				}
			}
		}

		return bytesImagem;
	}

	/**
	 * Obtém largura
	 * @return largura
	 */
	public int getLargura() {
		return largura;
	}

	/**
	 * Obtém altura
	 * @return altura
	 */
	public int getAltura() {
		return altura;
	}

}

Redimensionador de imagens

/**
 *
 */
package com.wordpress.cassiosousa.redimensionar;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Redimensionar que utiliza a classe<br/>
 * RedimensionarImagem para fazer o redimensionamento
 * @author Cássio Alexandre de Sousa
 */
public class Redimensionador {

	//log da aplicação
	private static final Logger logger = Logger.getLogger(Redimensionador.class.getName());
	private static final String DE = "C:\\Users\\Public\\Pictures\\Sample Pictures\\Desert.jpg";
	private static final String PARA = "C:\\Users\\Public\\Pictures\\Sample Pictures\\Deserto_Redimensionada.jpg";

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//cria o redimensionar imagem
		RedimensionarImagem redImagem = new RedimensionarImagem(400,200);

		FileOutputStream fos = null;
		try {
			//realizar o redimensionamento obtendo o array de byte para salver
			byte[] bytesImagem = redImagem.redimensionar(new FileInputStream(DE));
			fos = new FileOutputStream(PARA);
			fos.write(bytesImagem);
		} catch (FileNotFoundException e) {
			logger.log(Level.SEVERE, e.getMessage());
		} catch (IOException e) {
			logger.log(Level.SEVERE, e.getMessage());
		}finally{
			//libera recursos
			if(fos != null){
				try {
					fos.close();
				} catch (IOException e) {
					logger.log(Level.SEVERE, e.getMessage());
				}
			}
		}
	}
}

Espero que isso possa ajudar quem deseja, redimensionar imagens com java.

, , , , , ,

  1. #1 por Railon em fevereiro 14, 2012 - 7:57 am

    Muito bom valeu!!!!

  2. #2 por Railon em fevereiro 14, 2012 - 7:58 am

    Excelente post

  3. #3 por Fabrício Sautner em julho 20, 2012 - 5:03 pm

    Muito bom Cássio!
    Mas eu preciso salvar a imagem redimensionada (Que é um BufferedImage) em um FTP, e para isso eu uso o comando http://ftp.storeFile(NomeImagem, IS) – em que IS é um InputStream….. o problema que eu não consigo transformar o BufferedImage em um InputStream.
    Será que é possível?
    Abraços!

    • #4 por Cássio em julho 23, 2012 - 5:04 pm

      Olá Fabrício, vc pode utilizar o ByteArrayInputStream, exemplo depois que vc escreveu no ByteArrayOutputStream
      //escreve a imagem no OutputStream
      ImageIO.write(imagemRedimensionada, EXTENSAO, baos);
      //transforma o OutputStream em array de bytes e retorna
      bytesImagem = baos.toByteArray();

      ByteArrayInputStream inputStream = new ByteArrayInputStream(bytesImagem );

      Assim você vai ter o InputStream para passar como parâmetro como você falou.
      Exemplo de utilizado do ByteArrayInputStream http://www.java-samples.com/showtutorial.php?tutorialid=387

      Abraços!

      • #5 por Fabrício Sautner em julho 23, 2012 - 5:20 pm

        Maravilha Cássio! Obrigado!

        Funcionou exatamente assim.. a única diferente q estou usando a API JAI pra melhor qualidade de imagem!

        Forte abraço!

  4. #6 por manoel em novembro 9, 2013 - 2:41 pm

    Cara muito bom mesmo me ajudou muito

    valeu

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

%d blogueiros gostam disto: