Untitled

 avatar
unknown
plain_text
5 months ago
4.0 kB
11
Indexable
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Bild {
    private String format;      // Bildformat (z. B. P2)
    private int breite;         // Breite des Bildes
    private int hoehe;          // Höhe des Bildes
    private int maximalwert;    // Maximaler Pixelwert (z. B. 255)
    private int[][] daten;      // 2D-Array zum Speichern der Bilddaten

    // Methode zum Einlesen eines PGM-Bildes
    public void leseBild(String dateiName) throws IOException {
        var zeilen = Files.readAllLines(Path.of(dateiName));

        if (zeilen.isEmpty()) {
            throw new IOException("Die Datei ist leer!");
        }

        format = zeilen.get(0).trim();
        if (!"P2".equals(format)) {
            throw new IOException("Ungültiges Format! Nur P2 wird unterstützt.");
        }

        String[] dimensionen = zeilen.get(1).split("\\s+");
        if (dimensionen.length != 2) {
            throw new IOException("Ungültige Bilddimensionen in der Datei.");
        }
        breite = Integer.parseInt(dimensionen[0]);
        hoehe = Integer.parseInt(dimensionen[1]);

        maximalwert = Integer.parseInt(zeilen.get(2).trim());

        daten = new int[hoehe][breite];
        int zeilenIndex = 3;
        for (int i = 0; i < hoehe; i++) {
            String[] pixelZeile = zeilen.get(zeilenIndex++).trim().split("\\s+");
            if (pixelZeile.length != breite) {
                throw new IOException("Pixelanzahl stimmt nicht mit der Breite überein.");
            }
            for (int j = 0; j < breite; j++) {
                daten[i][j] = Integer.parseInt(pixelZeile[j]);
                if (daten[i][j] < 0 || daten[i][j] > maximalwert) {
                    throw new IOException("Pixelwert außerhalb des erlaubten Bereichs.");
                }
            }
        }
    }

    // Methode zur Ausgabe der Bildinformationen
    public void printBildInfo() {
        System.out.println("Format: " + format);
        System.out.println("Breite: " + breite);
        System.out.println("Höhe: " + hoehe);
        System.out.println("Maximalwert: " + maximalwert);
        System.out.println("Daten:");
        for (int[] zeile : daten) {
            for (int pixel : zeile) {
                System.out.printf("%3d ", pixel);
            }
            System.out.println();
        }
    }

    // Methode zum Rotieren des Bildes um 90 Grad gegen den Uhrzeigersinn
    public void rotiereBild() {
        int[][] rotiertesBild = new int[breite][hoehe];
        for (int i = 0; i < hoehe; i++) {
            for (int j = 0; j < breite; j++) {
                rotiertesBild[breite - j - 1][i] = daten[i][j];
            }
        }
        daten = rotiertesBild;

        // Breite und Höhe vertauschen
        int temp = breite;
        breite = hoehe;
        hoehe = temp;
    }

    // Methode zum Speichern des Bildes im PGM-Format
    public void schreibeBild(String verzeichnis) throws IOException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dateiname = dateFormat.format(new Date()) + ".pgm";
        Path dateiPfad = Path.of(verzeichnis, dateiname);

        // Header schreiben
        StringBuilder sb = new StringBuilder();
        sb.append(format).append("\n")
                .append(breite).append(" ").append(hoehe).append("\n")
                .append(maximalwert).append("\n");

        // Pixelwerte schreiben
        for (int[] zeile : daten) {
            for (int pixel : zeile) {
                sb.append(pixel).append(" ");
            }
            sb.append("\n");
        }

        // Datei schreiben
        Files.write(dateiPfad, sb.toString().getBytes(), StandardOpenOption.CREATE);
    }
}
Editor is loading...
Leave a Comment