# Exif mittels Java auslesen



## TheGame (7. Dez 2010)

Hallo Community,

folgendes Problem habe ich. 
Ich suche nach einer Möglichkeit, das Erstelldatum einer JPEG-Datei auszulesen. 
Hab bereits rausgefunden, das dies mit Exif geht. 
Dazu habe ich auch diese Tolle Seite mit passender Bibliotheken gefunden: drewnoakes.com - jpeg exif / iptc metadata extraction in java

Da ich Java Technisch nur Grundlagen aus der Schule/Ausbildung kenne, konnte ich nicht ganz so viel damit anfangen. Also hab ich noch weiter gesucht und dann folgende Lösung gefunden:


```
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import java.io.File;
import java.util.Iterator;

 

public class main {
   
    public static void main(String[] args) {
        File jpegFile = new File("D:/Bilder/IMG_5177.JPG");
        Metadata metadata = null;
        try {
            metadata = JpegMetadataReader.readMetadata(jpegFile);
        } catch (JpegProcessingException ex) {
            ex.printStackTrace();
        }
        
        // iterate through metadata directories
        Iterator directories = metadata.getDirectoryIterator();
        if(directories != null) {
            while (directories.hasNext()) {
                Directory directory = (Directory)directories.next();
                // iterate through tags and print to System.out
                Iterator tags = directory.getTagIterator();
                while (tags.hasNext()) {
                    Tag tag = (Tag)tags.next();
                    // use Tag.toString()
                    System.out.println(tag);
                    
                }           
            }
        }
    }
}
```

Bis Zeile 22 ist mir noch alles klar, aber ab dieser Zeile versteh ich nur Bahnhof. 
Dieses Programm liefert mir dann alle gespeicherten Exif-Informationen, allerdings brauch ich nur das Datum, wann das Bild erstellt wurde. Dies wird auch angezeigt: [Exif] Date/Time - 2010:09:30 19:07:08

Hat jemand vielleicht nen Vorschlag wie ich nur das Datum rausfiltern kann oder ähnliches? 
Mein Englisch ist auch nicht gerade das beste, darum kann ich mit der Webseite auch nicht ganz so viel anfangen 

Danke für Eure Hilfe

Lg


----------



## tagedieb (8. Dez 2010)

so muesste es eigentlich funktionieren
1. zuerst das "Exif" directory raussuchen
2. dann nur noch das datetime Tag rauslesen


```
com.drew.metadata.exif.ExifDirectory exifDirectory 
    = metadata.getDirectory(com.drew.metadata.exif.ExifDirectory.class);
java.util.Date date = exifDirectory.getDate(com.drew.metadata.exif.ExifDirectory.TAG_DATETIME);
```


----------



## TheGame (8. Dez 2010)

Hey,
ja cool, vielen Dank.
Es Funktioniert. 

lg


----------



## uwe75-1 (5. Mrz 2011)

Hallöle,

Sorry, wenn ich das Thema nochmal öffne, aber ich will auch genau nur ganz bestimmte EXIF-Daten auslesen und TheGame scheint ja mit dem Hinweis von tagedieb bestens zurecht gekommen sein. Leider funktioniert das bei mir nicht. Die zwei Befehlszeilen ergeben bei Netbeans folgende Fehler:

found   : com.drew.metadata.Directory
required: com.drew.metadata.exif.ExifDirectory
            = metadata.getDirectory(com.drew.metadata.exif.ExifDirectory.class);

Leider komme ich nicht dahinter was falsch sein könnte.
Weiß jemad Rat? Dar wäre echt super!

Hier mein kompletter Code:

```
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page import="com.drew.metadata.Tag"%>
<%@page import="com.drew.metadata.Directory"%>
<%@page import="com.drew.metadata.Metadata"%>
<%@page import="com.drew.metadata.exif.*"%>
<%@page import="com.drew.imaging.jpeg.JpegMetadataReader"%>
<%@page import="com.drew.imaging.jpeg.JpegProcessingException"%>
<%@page import="java.io.File, java.util.Iterator"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<%
        File jpegFile = new File("D:\\test.jpg");
        Metadata metadata = null;
        try {
            metadata = JpegMetadataReader.readMetadata(jpegFile);
        } catch (JpegProcessingException ex) {
            ex.printStackTrace();
        }
        
        // iterate through metadata directories
        Iterator directories = metadata.getDirectoryIterator();
        if(directories != null) {
            while (directories.hasNext()) {
                Directory directory = (Directory)directories.next();
                // iterate through tags and print to System.out
                Iterator tags = directory.getTagIterator();
                while (tags.hasNext()) {
                    Tag tag = (Tag)tags.next();
                    // use Tag.toString()
                    out.println(tag+"<br>");
                    
                }           
            }
        }
        com.drew.metadata.exif.ExifDirectory exifDirectory
            = metadata.getDirectory(com.drew.metadata.exif.ExifDirectory.class);
        java.util.Date date = exifDirectory.getDate(com.drew.metadata.exif.ExifDirectory.TAG_DATETIME);
        out.println(date);
%>
```


----------



## tagedieb (5. Mrz 2011)

Ich glaube in meiner Loesung hatte ich den Cast vergessen..
Einfacher noch ist direkt 
	
	
	
	





```
com.drew.metadata.Directory
```
 als Typ deklarieren


```
com.drew.metadata.Directory exifDirectory 
    = metadata.getDirectory(com.drew.metadata.exif.ExifDirectory.class);
java.util.Date date = exifDirectory.getDate(com.drew.metadata.exif.ExifDirectory.TAG_DATETIME);
```


----------



## uwe75-1 (5. Mrz 2011)

super Danke Dir - jetzt geht es bei mir auch!!!!


----------



## schattengay (9. Aug 2011)

Was mache ich falsch!
Danke schonmal für die antworten

```
import java.io.*;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifIFD0Directory;
import java.io.File;
import java.util.Iterator;
import java.util.Date;
import com.drew.imaging.ImageMetadataReader;
public class Programs
{
    public static void main(String[] args)
    {
        

		 File jpegFile = new File("t.JPG");
   	Metadata metadata = null;
      
	try {
metadata = ImageMetadataReader.readMetadata(jpegFile);
       //       metadata = JpegMetadataReader.readMetadata(jpegFile);
 } catch (IOException ioexception) {}
    
        
        Directory directory = metadata.getDirectory(ExifIFD0Directory.class);
	Date date = directory.getDate(ExifIFD0Directory.TAG_DATETIME);
	System.out.println (date); 
  

    }
}
```


----------



## tagedieb (9. Aug 2011)

schattengay hat gesagt.:


> Was mache ich falsch!
> Danke schonmal für die antworten



:bahnhof:

Was du falsch machst? Du hast weder dein Problem beschrieben noch hast eine Frage gestellt. Wie sollen wir dir da helfen koennen. Ich werde mal meine Kristalkugel befragen ;-)


Als erstes wuerd ich mal ueberpruefen ob dein File auch gefunden wird oder ob eine Exception geworfen wird, die du abfaengst aber nicht verarbeitest und ob das Bild ueberhaupt Exif-Daten enhaelt. Nicht alle .jpg enhalten Exif-Daten.


----------



## schattengay (16. Aug 2011)

sorry

mein problem ist dieses

java:21
unreported exeption com.drew.imageProcessingException; must be caught or declared to be throw
metadata = ImageMetadataReder.readMetadata(jpegFile);
                                                                     /\


----------



## tagedieb (16. Aug 2011)

Und wo ist das Problem? Der Compiler sagt dir ja schon die Loesung.
Du musst die ImageProcessingException abfangen...


```
try {
			metadata = ImageMetadataReader.readMetadata(jpegFile);
		} catch (IOException ioexception) {
			ioexception.printStackTrace();
		} catch (ImageProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```


----------



## schattengay (16. Aug 2011)

Danke 

ich habe es auch fersucht aber bei mir war es nur schrot und es gab noch mehr fehlermeldungen


----------



## Andi_CH (16. Aug 2011)

Hilfe ich habe ein Problem, helft mir -
Ach so - was für Eines ist auch noch wichtig  ... und dann kommt noch dazu dass ich die Lösung längst gefunden habe ;-)

Ernsthaft - just for fun wollte ich das mal ausprobieren, aber 
	
	
	
	





```
com.drew.metadata.exif.ExifDirectory
```
 gibt es bei mir nicht
Da ist z.B. ein ExifIFD0Directory drin und das ist von com.drew.metadata.Directory abgeleitet ....

Die richtige Version laden hilft, denn nach Version 2.3.1 ist das verschwunden - na ja, einfach so als Hinweis für Nachamer - 2.3.1 steht ja immer noch zur Verfügung.


----------



## Stephan2009 (26. Sep 2011)

Hallo zusammen, nach einiger Suche bin ich auf dieses Interessante Thema gestoßen, ich möchte auch gerne Exif Daten aus Fotos auslesen allerdings sind die Fotos nicht auf der Festplatte sondern als URL vorhanden. Ist dies trotzdem möglich diese auszulesen?


----------



## tagedieb (26. Sep 2011)

Solange du Zugriff auf die Fotos hast sollte das kein Problem sein. Du kannst die Methode


```
ImageMetadataReader.readMetadata(java.io.BufferedInputStream inputStream, boolean waitForBytes)
```

verwenden oder einfach das File runterladen und die Daten auslesen.


----------



## Allrounder93 (22. Mrz 2014)

Hey,

ich hab da auch mal ein Problemchen...
Wie bekomme ich die 


> import com.drew.imaging.jpeg.JpegMetadataReader;
> import com.drew.imaging.jpeg.JpegProcessingException;
> import com.drew.metadata.Directory;
> import com.drew.metadata.Metadata;
> import com.drew.metadata.Tag;


eingebunden?


----------

