Pipe?

Herr Kaiser

Bekanntes Mitglied
Hi Forum,
ich versuche mich gerade darin, für verschiedene Fotos die Brennweite des verwendeten Objektivs zu ermitteln.
Manuell mache ich das bei mir auf Linux mit folgendem Konsolen-Kommando:

/usr/bin/exiftool -a -T -FocalLength 1.JPG

Das würde ich nun gerne mit Java automatisieren. Der Start des Kommandos scheint schonmal so zu gelingen:

Java:
String cmd = "/usr/bin/exiftool -a -T -FocalLength 1.JPG";
try {
    Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
    System.out.println(e.getMessage());
}

Jetzt stellt sich noch die Frage, wie ich die Ausgabe von exiftool in mein Java-Programm einlesen kann. Ich schätze mal, ich muss eine Pipe anlegen und irgendwie mit Streams arbeiten. Meine Java-Kenntnisse reichen aber noch nicht ganz so weit, dass ich die gefundenen Infos hierzu auf mein Beispiel anwenden könnte. Hättet Ihr einen Tip für mich, wie ich prinzipiell vorgehen muss? Das wäre klasse! Danke schonmal :)



EDIT: Hier ein Versuch, der noch nicht ganz funktioniert. in.read() liefert gleich -1, der Datenstrom scheint also leer zu sein (oder?). Wo könnte der Fehler liegen?

Java:
String cmd = "/usr/bin/exiftool -a -T -FocalLength 1.JPG";
Runtime runtime = Runtime.getRuntime();
Process process = null;
try {
    process = runtime.exec(cmd);
    DataInputStream in = new DataInputStream(process.getInputStream());
    System.out.println(in.read());
} catch (Exception e) {
    System.out.println(e.getMessage());
}
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Zwei Schnipsel
Java:
        Process process = Runtime.getRuntime().exec(command);
        String errorMessage = 
            new String(toByteArray(process.getErrorStream()));
        String outputMessage = 
            new String(toByteArray(process.getInputStream()));
        int exitValue = 0;
        try
        {
            exitValue = process.waitFor();
        }
        catch (InterruptedException e)
        {
            Thread.currentThread().interrupt();
        }
mit
Java:
    /**
     * Fully reads the given InputStream and returns it as a byte array.
     *  
     * @param inputStream The input stream to read
     * @return The byte array containing the data from the input stream
     * @throws IOException If an I/O error occurs
     */
    private static byte[] toByteArray(
        InputStream inputStream) throws IOException
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte buffer[] = new byte[8192];
        while (true)
        {
            int read = inputStream.read(buffer);
            if (read == -1)
            {
                break;
            }
            baos.write(buffer, 0, read);
        }
        return baos.toByteArray();
    }

Aber es gibt auch direkt in Java Möglichkeiten, EXIF-Daten auszulesen (web- oder Forensuche) - vielleicht brauchst du dir diesen Krampf gar nicht anzutun :)
 

Herr Kaiser

Bekanntes Mitglied
Klasse, Marco! Das sieht sehr gut aus. Zwischenzeitlich habe ich etwas zusammengeschustert, was zwar funktioniert, aber auf mich unelegant wirkt. Ich werde das mal mit deinen Lösungen ersetzen oder kombinieren.
Vielen Dank für deine Mühe!!! :)

Du hast recht, es gibt auch sehr gute direkte Lösungen zum Auslesen der Metadaten mit Java. Dieses hier funktioniert prima: drewnoakes.com - jpeg exif / iptc metadata extraction in java

Leider werden aber damit nicht alle Daten erfasst, die ich benötige, daher der etwas komplizierte Umweg.

Hier mein Versuch:

Java:
String[] str = new String[]{"/bin/bash", "-c", "/usr/bin/exiftool -a -T -FocalLength /home/user2/1.JPG"};
String ergebnis="";
try {
    Process p = Runtime.getRuntime().exec(str);
    int wert;
    while (true) {
        DataInputStream in = new DataInputStream(p.getInputStream());
        wert = in.readByte();
        ergebnis=ergebnis+(char)wert;
    }
} catch (Exception e) {
    System.out.println(e.getMessage());
}
System.out.println("Ergebnis = " + ergebnis);
 

Ähnliche Java Themen

Neue Themen


Oben