Loading ...

Applicare un watermark ad una immagine in Java

Applicare un watermark ad una immagine in Java

Lo scopo del codice che vedremo oggi nasce da una esigenza reale: mettere un watermark, corrispondente al nome del file, su tante immagini risiedenti tutte nella stessa cartella.

Facendolo in Java ci ho messo relativamente poco tempo.

Nel programma non è prevista una gui; il path viene dato tramite riga di comando.

Voi, ovviamente, fate tutte le modifiche che volete / vi servono.

Questa la classe che applica il watermark:

public class Watermark {

    private String dir;
    private File initDir;
    private File finalDir;

    public Watermark(String dir) {
        this.dir = dir;
        initDir = new File(dir);
        finalDir = new File(dir + "/WATERMARKED/");
        if (!finalDir.exists()) {
            finalDir.mkdir();
        }
    }

    public void init() {
        if (initDir.isDirectory()) {
            FileNameExtensionFilter filter = 
new FileNameExtensionFilter("Images", "jpg", "jpeg", "png");
            File[] files = initDir.listFiles((File file) -> filter.accept(file));
            for (File input : files) {
                if (input.isFile()) {
                    String nome = input.getName();
                    if (nome.indexOf(".") > 0) {
                        nome = nome.substring(0, nome.lastIndexOf("."));
                    }
                    addWatermark(nome, input);
                }
            }
        }
    }

    private void addWatermark(String text, File input) {
        try {
            BufferedImage bi = ImageIO.read(input);
            Graphics2D g2d = (Graphics2D) bi.getGraphics();
            g2d.setColor(Color.BLACK);
            g2d.setFont(new Font("Arial", Font.BOLD, 100));
            FontMetrics fontMetrics = g2d.getFontMetrics();
            Rectangle2D rect = fontMetrics.getStringBounds(text, g2d);
            int centerX = (bi.getWidth() - (int) rect.getWidth()) / 2;
            int centerY = bi.getHeight() / 2;
            g2d.drawString(text, centerX, 90);
            File output = new File(finalDir + "/" + input.getName());
            ImageIO.write(bi, "jpg", output);
            g2d.dispose();
            System.out.println("Watermark aggiunto: " + input.getAbsolutePath());
        } catch (IOException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Nel costruttore inizializziamo due directory:

  • quella che contiene le immagini
  • quella dove verranno salvate le immagini modificate; quindi gli originali non verranno toccati

Nel metodo init, facciamo la lista di tutti i files nella directory iniziale, controllando l'estensione del file in modo da prendere solo immagini.

Per ogni file trovato corrispondente al filtri impostato con FileNameExtensionFilter, applichiamo il watermark, prendendo con testo il nome del file stesso.

Fate qualche prova con i settaggi per capire bene come funziona l'applicazione del watermark.

Enjoy!