Visualizzare i metadati delle immagini in Java con metadata-extractor

Mattepuffo's logo
Visualizzare i metadati delle immagini in Java con metadata-extractor

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!


Condividi

Commentami!