Olá desenvolvedores, neste tutorial sobre miniatura de imagem iremos trabalhar com o que afeta diretamente a performance do sistema. Imagine que cada imagem inserida pelo usuário tenha no mínimo 3MB. Então, se existem 10 registros, são 30MB, imagine 100 registros, certamente nossa aplicação começaria a ficar cada vez mais lenta para carregar todas essas imagens.

A solução é não carregar a imagem original, e na tabela onde a imagem é exibida em tela, exibi-la em miniatura. Em outras palavras significa que iremos compactar a imagem de forma que uma imagem de 5MB fique com apenas alguns kilobytes. Assim só iremos trazer a imagem em seu tamanho original para o download, o que melhorará a performance do sistema tornando-o mais rápido, ou impedindo que ele fique lento.

Assim, qual é o momento de compactar a imagem? No momento de cadastrá-la.

COMPACTANDO A IMAGEM

E se a compactação da imagem acontecerá no momento do cadastro, então deverá ocorrer na servlet usuario.java. Entenda, quando salvamos a imagem, o fluxo de código é direcionado para o doPost, para o bloco responsável pelo upload das imagens. Neste bloco de código após a atribuição a imagem é colocada em um bloco de código para depois salvar.

DECODIFICANDO A IMAGEM

Antes de criarmos a miniatura da imagem, é preciso depois de transformá-la em base64 decodificá-la, ou seja, transformá-la em uma imagem, passando-a para um array de bytes.

Depois de decodificar a imagem em base64, iremos passar esta imagem decodificada para o BufferedImage.

Depois de decodificar a imagem em base64, iremos passar esta imagem decodificada para o BufferedImage.

Precisaremos transformar a imagem em BufferedImage. O BufferedImage é uma subclasse do Java para manipulação de imagens que descreve uma Image com um buffer acessível dos dados da imagem. Em outras palavras, trata-se de uma implementação da classe abstrata Image que corresponde a imagens representadas por uma sequência de pixels armazenados inteiramente na memória.

Neste contexto, Image é uma classe abstrata que é a superclasse de todas as classes que representam imagens gráficas.

IMAGEM EM BUFFEREDIMAGE

Depois da decodificação da imagem em base64, iremos transformá-la em BufferedImage, “setaremos” a largura e a altura dela a partir da confirmação do tipo de arquivo. Na sequência criaremos a imagem em miniatura, gravaremos no banco de dados e a mostraremos na tela.

Em nossa implementação o objeto BufferedImage receberá uma ImageIO do pacote javax.imageio, um método que localiza ImageReaders e ImageWriters para realizar codificação e decodificação simples. Então iremos escrevê-lo transformando em um fluxo de entrada de arrays.

E para pegarmos o tipo da imagem, iremos declarar uma variável do tipo inteiro que irá receber o bufferedImage invocando um getType que retorna um inteiro. Então utilizaremos um operador ternário para verificar se o inteiro retornado é igual a zero. Se o inteiro for igual a zero retornaremos o padrão TYPE_INT_ARGB, mas se a imagem tem um tipo definido retornaremos este tipo por meio do bufferedImage.

Então temos agora uma imagem transforma em buffer e o tipo dela. O buffer nos permite trabalhar com facilidade com imagens gráficas, e por isso é importante antes de manipularmos a imagem convertê-la em buffer. Agora podemos criar a imagem em miniatura determinando valores para a largura e a altura.

Para criar a imagem em miniatura iremos instanciar um novo bufferedImage para o qual passaremos a largura, altura e tipo. Porém, não é tudo, precisamos trabalhar também a parte gráfica, que será a responsável por iniciar o processo de criação da miniatura da imagem.

E precisaremos transformar a miniatura em imagem para deixa-la preparada para impressão. Faremos isso utilizando o drawImage para qual passaremos a miniatura, valores zero para os atributos que não estão sendo usados, largura, altura e o tipo. E então finalizamos o processo.

VAbaixo a imagem que melhor exemplifica o que são cada um dos argumentos passados para o método drawImage().

ESCREVENDO A IMAGEM

Até agora temos a imagem em fluxo de dados, é preciso escrevê-la novamente, instanciando um OutputStream, que representa a saída. E agora o ImageIO vai escrever a miniatura em formato png. E todas as informações necessárias a este processo serão passadas como argumento. E por fim o processo deverá ser finalizado.

E por fim a imagem em miniatura será gravada no banco de dados, porém, pronta para ser mostrada na tela. Assim, é preciso passar o cabeçalho completo, concatenando com a miniatura em base64 que recebe o fluxo de dados da miniatura em um array.

EM POUCAS PALAVRAS

E neste tutorial implementamos todo o processo de compactação de uma imagem para transformá-la em miniatura. Assim, nossa aplicação não perderá em performance. Não é um processo difícil, mas é um processo rico em detalhes descrito em várias etapas as quais você deve conhecer bem. Então a dica aqui é a de sempre, assista a aula quantas vezes forem necessárias, refaça a aula, e pratique. Eu fico por aqui e nós nos vemos no próximo tutorial.