Neste tutorial trabalharemos com o processamento e a gravação da imagem no banco de dados, uma vez que já implementamos o método que transforma a imagem obtida (InputStream) em um array de bytes. E isso foi necessário porque as classes com as quais trabalharemos não aceitam diretamente um InputStream.

PRCESSAMENTO DE IMAGEM

Assim, para processar a imagem é preciso criar um array de bytes no método salvar() do ManagedBean, PessoaBean. Ao fazermos isso, deveremos na assinatura do método lançar uma exceção, fazendo com que não seja preciso recorrer aos blocos try/catch. O passo seguinte é “setar” a imagem original para o objeto que irá gravá-la no banco de dados.

MINIATURA DA IMAGEM

E uma vez que salvamos a imagem em seu formato original, agora iremos transformá-la em miniatura. É essa miniatura que será exibida na tela para o usuário, dessa forma, não onerando o sistema, uma vez que não será preciso carregar imagens pesadas para serem exibidas na tela.

Para transformar a imagem em miniatura, primeiro a transformaremos em um BufferedImage que é uma subclasse da classe Image. Esta subclasse é usada para manipular os dados da imagem.

Assim, para que a imagem possa ser lida pelo ImageIO.read e passada ao BufferedImage precisaremos converter a imagem processada em um InputStream. Faremos isso criando um objeto para receber e transformar a imagem em um array de bytes.

DESCOBRINDO O TIPO DA IMAGEM

Para descobrir o tipo da imagem utilizaremos inicialmente um operador ternário, onde a partir da variável bufferedImage obteremos o tipo e verificaremos se é igual a zero, se sim, significa que não há nada e um valor padrão deverá ser atribuído. Mas se não, se houver um tipo determinado, nós ficaremos com ele.

CRIANDO MINIATURA DA IMAGEM

Como nosso objetivo é criar uma miniatura da imagem definiremos duas variáveis para altura e largura respectivamente.

int largura = 200;
int altura = 200;

Utilizaremos assim, um segundo BufferedImage, porém agora, a intenção é a manipulação do tamanho da imagem. Dessa forma criaremos um novo objeto do tipo BufferedImage que como parâmetro receberá largura, altura e o tipo da imagem.

Utilizaremos também a classe Graphics2D para termos um maior controle das propriedades da imagem, e atribuir o tamanho dela. E com o drawImage renderizaremos a imagem, passando como argumentos para o processo de renderização o bufferedImage, altura e largura. E enfim encerrando a execução da transformação da imagem.

Escreveremos agora a imagem em tamanho menor, então instanciaremos um ByteArrayOutputStream que cria um buffer na memória onde todos os dados enviados para o fluxo são armazenados no buffer.

Com getContentType obteremos a extensão do arquivo, que retorna [imagem/png] por exemplo, assim, com o método split() que quebra uma String em várias substrings a partir de um caractere definido, obteremos a parte que nos interessa que é a extensão da imagem.

Agora, sim, tendo a extensão poderemos escrever a imagem, e para escrevê-la a imagem é preciso três parâmetros, a imagem em miniatura, a extensão e o objeto que a receberá.

O próximo passo é montar o cabeçalho padrão de um arquivo em base64 e atribuí-lo a uma variável do tipo String. O cabeçalho padrão de um arquivo em base64 é data:image/png;base64, se fosse um arquivo de PDF seria data:aplication/pdf;base64.

Ao montar o cabeçalho concatenaremos as partes informando a parte dinâmica, o tipo do arquivo e sua extensão. O último argumento que concatenaremos é a conversão da imagem em base64.

Com a imagem processada, atribuiremos a miniatura e a sua extensão ao objeto pessoa.

pessoa.setFotoIconBase64(miniImagem);
pessoa.setExtensao(extensao);

EM POUCAS PALAVRAS

Neste tutorial processamos a imagem, criamos a miniatura, obtivemos a extensão e a transformamos em base64, gravando-a no banco de dados com sucesso. No próximo tutorial criaremos o campo onde a imagem será exibida na tela.