Wie kann man auf ein bestehendes Bild zeichnen?

Mit Hilfe der Klasse java.awt.Graphics kann man nicht einfach nur so auf ein Panel oder Label, sondern auch auf ein Bild zeichnen.

Das fertig überzeichnete BildIn einem JLabel soll das nebenstehende Bild dargestellt werden. Ausgangspunkt ist eine Fotografie, auf die ein schwarzer Balken und der Text "zensiert" gezeichnet werden sollen.

Um das Bild zu laden, erstellen wir zunächst ein File-Objekt, dem der Pfad zur Bilddatei als String übergeben wird. Die Klasse javax.imageio.ImageIO stellt Methoden zum Lesen und Schreiben, sowie zum einfachen encodieren und decodieren von Bilddateien bereit. Die Methode read() liest u.a. aus einem übergebenen File-Objekt. Sie muss zum Abfangen einer IOException in einen try-catch-Block eingebettet werden.
Die abstrakte Klasse java.awt.Graphics stellt eine Unmenge an Möglichkeiten zur Verfügung um grafische Operationen in Java durchzuführen.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
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;
import javax.swing.border.LineBorder;

public class AufBildZeichnenClass extends JFrame {

    private static final long serialVersionUID = 1L;

    JPanel panel;

    JLabel label;

    ImageIcon icon;

    BufferedImage image;

    public AufBildZeichnenClass() {

        File file = new File("/pfad/bild.jpg");
        
        try {
            this.image = ImageIO.read(file);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        int imageBreite = image.getWidth();
        int imageHoehe = image.getHeight();
        

        Graphics g = image.getGraphics();
        g.setColor(Color.BLACK);
        g.fillRect(0, 190, 450, 50);
        g.setFont(new Font("Sans", Font.PLAIN, 40));
        g.setColor(Color.WHITE);
        g.drawString("zensiert", 40, 230);
        

        icon = new ImageIcon(image);
        label = new JLabel(icon);
        label.setBorder(new LineBorder(Color.WHITE));

        panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBackground(Color.DARK_GRAY);
        panel.add(label, BorderLayout.CENTER);

        getContentPane().add(panel);
        setSize(imageBreite + 100, imageHoehe + 100);
    }

    public static void main(String args[]) {
        AufBildZeichnenClass cl = new AufBildZeichnenClass();
        cl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        cl.setVisible(true);
    }
}

Die Methode Image.getGraphics() gibt eine entsprechende Referenz zurück, die hier zur Bearbeitung verwendet wird:

Zur Darstellung eines Bildes auf einem JLabel eignet sich die Klasse ImageIcon in besonderer Weise. Ein Objekt kann neben der Übergabe einer URL oder eines Pfad-Strings auch durch die Übergabe eines Image-Objektes gebildet werden.
Jetzt könnte das JLabel prinzipiell schon dargestellt werden und an den Hauptcontainer, der mit Hilfe von getContentPane() ermittelt wird, übergeben werden. Zur optisch angenehmeren Darstellung bilden wird jedoch noch ein JPanel-Objekt, dessen Hintergrund farblich definiert wird und der das JLabel mit dem Bild mittig positioniert. Dieses JPanel wird nun an den zusätzlich etwas vergrößerten Hauptcontainer übergeben.

1) Die Parameter bestimmen hier der Reihenfolge nach: x-Wert des oberen linken Punktes, y-Wert des oberen linken Punktes, Breite, Höhe
2) Die Parameter bestimmen hier der Reihenfolge nach: Schriftfamilie als String, Schrifttyp, Schriftgröße
3) Die Parameter bestimmen hier der Reihenfolge nach: zu schreibender String, x-Wert des oberen linken Punktes, y-Wert des oberen linken Punktes