Visualizzare i metadati delle immagini in Java con metadata-extractor
Per l'estrazione dei metadati delle immagini in Java, ci sono diverse librerie.
Probabilmente metadata-extractor è la più completa!
Io l'ho usata anche per il mio programmino MPPhotoGallery, che ho messo anche si GitHub.
Se usate Maven:
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.11.0</version>
</dependency>
Questa la classe che mi sono creato:
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.lang.GeoLocation;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import com.drew.metadata.exif.GpsDirectory;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
public class ImageInfo {
private File image;
private Metadata metadata;
public ImageInfo(File image)
throws ImageProcessingException, IOException {
this.image = image;
metadata = ImageMetadataReader.readMetadata(image);
}
public Map<String, String> getMapInfo() {
Map<String, String> map = new HashMap<>();
for (Directory d : metadata.getDirectories()) {
for (Tag tag : d.getTags()) {
map.put(tag.getTagName(), tag.getDescription());
}
}
return map;
}
public Optional getCoordinates() {
Collection gpsDirectories =
metadata.getDirectoriesOfType(GpsDirectory.class);
for (GpsDirectory gpsDirectory : gpsDirectories) {
GeoLocation geoLocation = gpsDirectory.getGeoLocation();
if (geoLocation != null && !geoLocation.isZero()) {
return Optional.of(geoLocation);
}
}
return Optional.empty();
}
}
Ci sono due metodi:
- il primo estrae i metadati in generale
- il secondo è specifico per le coordinate geografiche
Un potenziale esempio del suo utilizzo potrebbe essere questo:
try {
ImageInfo ii = new ImageInfo(f);
Map<String, String> map = ii.getMapInfo();
String size = map.get("File Size").replace("bytes", "").trim();
DateFormat df = new SimpleDateFormat("EEE MMM dd HH:mm:ss XXX yyyy", Locale.ITALIAN);
Date date = df.parse(map.get("File Modified Date"));
DateFormat df2 = new SimpleDateFormat("dd/MM/yyy", Locale.ITALIAN);
String dateFormat = df2.format(date);
StringBuilder sb = new StringBuilder();
sb.append("Name: ").append(map.get("File Name"))
.append("nn")
.append("Width: ").append(map.get("Image Width"))
.append("nn")
.append("Height: ").append(map.get("Image Height"))
.append("nn")
.append("Resolution Info: ").append(map.get("Resolution Info"))
.append("nn")
.append("MIME Type: ").append(map.get("Detected MIME Type"))
.append("nn")
.append("File extension: ").append(map.get("Expected File Name Extension"))
.append("nn")
.append("File size: ").append(FileUtils.byteCountToDisplaySize(Long.parseLong(size)))
.append("nn")
.append("Last modified: ").append(dateFormat)
.append("nn");
setLblText(sb.toString());
Optional geoLocation = ii.getCoordinates();
if (geoLocation.isPresent()) {
GeoLocation gl = geoLocation.get();
lat = gl.getLatitude();
lon = gl.getLongitude();
lblMap.setText("Apri mappa");
lblMap.setVisible(true);
} else {
lat = 0;
lon = 0;
lblMap.setVisible(false);
}
} catch (IOException | ImageProcessingException | ParseException e) {
GenericDialog.showDialog(e.getMessage(), Alert.AlertType.ERROR);
}
Io, poi, uso queste informazioni per riempire dei componenti grafici; è giusto un esempio per vedere come è possibile estrapolare le varie informazioni.
Enjoy!
java metadata-extractor maven
Commentami!