Clipping

Unter Clipping versteht man das Beschneiden einer Grafik am Rand eines vorgegebenen Ausschnittes. Im vorliegenden Beispiel wird ein Hintergrundfoto in eine Schriftkontur eingefügt und das Umfeld einfarbig eingefärbt.

Das Beispiel überschreibt die paint-Methode des Container-Kontextes. Das Hintergrundbild wird als BufferedImage über die statische Methode read() der Klasse ImageIO geladen. Als Parameter muss ihr ein File-Objekt übergeben werden und die Auslese-Vorgang muss in einen try-catch-Block eingebettet werden, um IOExceptions abzufangen. Um das Fenster der Anwendung exakt auf Bildgröße zu setzen, wird an dieser Stelle, nach Laden des Bildes zusätzlich setSize() aufgerufen.
Javas Graphics2D-Kontext ist mächtiger als der einfachere und ursprünglichere Graphics-Kontext. Aus diesem Grunde wird der als Parameter der Methode paint(Graphics g) übergebene entsprechend gecastet.
Die anschließend aufgerufenen RenderingHints dienen dem Glätten der in der Folge initialisierten Schrift. Danach beginnt der Code für das eigentliche Clipping.

import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GlyphDemo extends JFrame {

    private static final long serialVersionUID = 1L;

    JPanel panel;

    JLabel label;

    ImageIcon icon;

    BufferedImage image;

    public GlyphDemo() {
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void paint(Graphics g) {
        File file = new File("test.jpg");

        try {
            this.image = ImageIO.read(file);
            setSize(image.getWidth(), image.getHeight());
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        
        Font f = new Font("Verdana", Font.ITALIC | Font.BOLD, 200);

        GlyphVector gv = f
                .createGlyphVector(g2d.getFontRenderContext(), "Java");

        g2d.fill(new Rectangle2D.Float(0, 0, image.getWidth(), image
                .getHeight()));

        Shape clipping_shape = gv.getOutline();

        g2d.translate(-clipping_shape.getBounds().getX() / 2, -clipping_shape
                .getBounds().getY() + 100);

        g2d.setClip(clipping_shape);

        g2d.setTransform(new AffineTransform());

        g2d.drawImage(image, null, 0, 0);
    }

    public static void main(String args[]) {
        new GlyphDemo();
    }
}

Zunächst wird der GlyphVector festgelegt. Hierunter ist die Kontur des vorgegebenen Textes zu verstehen. Er wird auf dem deklarierten Font-Objekt aufgerufen, und bekommt als Parameter den FontRenderContext und den Schriftzug als String übergeben. Darüber wird nun ein (hier) einfarbiges Rechteck gelegt, aus dem schließlich die Kontur mittels GlyphVector.getOutline() ausgeschnitten wird. Es folgen die korrekte Positionierung und das Setzen (=Zeichnen) der Darstellung.
Interessant ist die Zeile g2d.setTransform(new AffineTransform());, deren Notwendigkeit zunächst unklar scheint. Sie verhindert jedoch die Transformation des Grafikkontext. Das Zeichnen des Image-Objektes mit dem Ursprungspunkt in der linken oberen Ecke (0, 0) schließt den Vorgang ab.