Clipping
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.