Marca d’água com java e thumbnailator

Manipulação de imagens no java nem sempre é uma tarefa fácil, especialmente se você precisa alterar o tamanho, rotacionar, ou alterar a opacidade da imagem sem contar com um editor como Netbeans ou Eclipse. Para nossa alegria, existe uma API chamada thumbnailator que, apesar do nome difícil, é bem simples e intuitiva de usar. Nesse post vou mostrar um exemplo de redimensionamento e inclusão de marca d’água com o thumbnailator.

1 – O primeiro passo é incluir o thumbnailator em nossa lista de dependências do maven. Inclua o seguinte trecho no pom.xml do seu projeto:

<dependency>
	<groupId>net.coobird</groupId>
	<artifactId>thumbnailator</artifactId>
	<version>0.4.8</version>
</dependency>

Se você não usa o maven, inclua o jar do thumbnailator na pasta de libraries do seu projeto. O jar pode ser encontrado aqui.

2 – Crie uma nova classe, que será responsável por redimensionar e incluir a marca d’água. Crie um método conforme exemplo abaixo:

Listagem 1: método addThumbnail
Listagem 1: método addThumbnail

O método da listagem 1 recebe como parâmetros a imagem original, a url da marca dágua (se a imagem não estiver em uma url, basta substituir o objeto URL pelo objeto File) e o caminho onde será gravada a imagem já alterada. O retorno do método será a imagem já alterada e gravada.

As linhas 19, 20 e 21 são apenas para garantir que o método addThumbnail sempre receberá os parâmetros essenciais.

As linhas 23 e 24 estão lendo as imagens e jogando num buffer.

As linhas 28 e 29 redimensionam a imagem da marca d’agua para um tamanho 4x menor do que a imagem original. Dessa forma garantimos que, independente do tamanho da imagem da marca d’agua, ela nunca será maior do que a imagem original. O ideal é utilizar imagens vetoriais para não distorce-las no processo de redimensionamento.

As linhas 32 e 33 adiciona a marca dágua na imagem original. Note que é possível definir a posição onde a marca deve aparecer, através do objeto Positions e a opacidade da marca, que no me caso foi de 80%.

No trecho “Thumbnails.of(image).size(image.getWidth(), image.getHeight())” estou ajustando a imagem para seu próprio tamanho por que o thumbnailator é uma biblioteca de criação de thumbnails, então ele espera que seja informado o tamanho do thumbnail desejado. No meu caso, quero que seja mantido o tamanho original.

3 – Para testar, vamos criar um método main e chamar nosso método addThumbnail, passando os caminhos das imagens, conforme listagem 2:

Listagem 2: método main

Abaixo segue o código completo:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;

import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

public class Thumbnail {
	
	public File addThumbnail(File imagemOriginal, URL imagemMarca, String imagemDestino) throws IOException{
		try {
			assert imagemOriginal != null : "Imagem original deve ser fornecida";
			assert imagemMarca != null : "Imagem da marca dagua deve ser fornecida";
			assert (imagemDestino != null && !imagemDestino.isEmpty()) : "Caminho da imagem destino deve ser fornecida";

			BufferedImage image = ImageIO.read(imagemOriginal);
			BufferedImage overlay = ImageIO.read(imagemMarca);

			// a imagem da marca dagua deve ser menor do que a a foto. Deixando
			// 4x menor..
			BufferedImage watermarkImage = Thumbnails.of(overlay).size(image.getWidth() / 4, image.getHeight() / 4)
					.asBufferedImage();

			// imagem centralizada com 80% de opacidade
			BufferedImage thumbnail = Thumbnails.of(image).size(image.getWidth(), image.getHeight())
					.watermark(Positions.CENTER, watermarkImage, 0.8f).asBufferedImage();

			File file = new File(imagemDestino);
			ImageIO.write(thumbnail, "PNG", file);
			return file;
		} catch (IOException e) {
			System.out.println("Ocorreu um erro ao tentar aplicar marca dagua na imagem " + imagemDestino);
			throw e;
		}		
	}
	
    public static void main( String[] args ) throws MalformedURLException, IOException
    {
    	 Thumbnail t = new Thumbnail();
    	 t.addThumbnail(new
         File("C:\\Pictures\\DSC01195.JPG"),
         new URL("http://www.umaurlqualquer.com/meulogo.png"), "C:\\Pictures\\waterMark.jpg");  
        
         System.out.println("DONE!");
    }
}

Agora é so rodar e.. TADA! Sua imagem com a marca dágua

Figura 1. Imagem da marca d'água
Figura 1. Imagem da marca d’água

 

Por MARCIA TANIMOTO

Formada em Informática - UEM/Maringá. Analista de Sistemas, apaixonada pela profissão, curiosa e MATERANA de coração.

Postado em: 04 de março de 2015

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário