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.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.SwingUtilities;
import javax.swing.border.LineBorder;

public class AufBildZeichnenClass {

    String imgPath = "img/h1.jpg";
    BufferedImage image;

    public AufBildZeichnenClass() {

        File file = new File(imgPath);
        image = loadImg(file);
        if (image == null) {
            return;
        }
        zensiere();
        init();
    }

    private void init() {
        JFrame frame = new JFrame("Zensiert");
        ImageIcon icon = new ImageIcon(image);
        JLabel label = new JLabel(icon);
        label.setBorder(new LineBorder(Color.WHITE));
        frame.add(label);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private BufferedImage loadImg(File file) {
        BufferedImage image = null;
        try {
            image = ImageIO.read(file);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return image;
    }

    public void zensiere() {
        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);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(() -> new AufBildZeichnenClass());
    }
}

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 kann das JLabel an den Hauptcontainer übergeben werden.

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

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.