EXIF Metadata Extraction in Groovy
For a work project, I need to extract EXIF metadata from JPG's in Java code. The Apache Sanselan project supports reading and writing of EXIF metadata. I wrote a Groovy script as a test for extracting metadata. The script uses Grape to fetch the Sanselan dependency, however, Sanselan in not yet in one of the main Maven repos so I had to install it into our internal repository. (Just be aware that the script won't run 'out-of-the-box'). The code was just a quick port of this example:#!/usr/bin/env groovy @Grab(group='org.apache.commons', module='sanselan', version='0.97') import org.apache.sanselan.ImageReadException import org.apache.sanselan.Sanselan import org.apache.sanselan.common.IImageMetadata import org.apache.sanselan.common.RationalNumber import org.apache.sanselan.formats.jpeg.JpegImageMetadata import org.apache.sanselan.formats.tiff.TiffField import org.apache.sanselan.formats.tiff.TiffImageMetadata import org.apache.sanselan.formats.tiff.constants.TagInfo import org.apache.sanselan.formats.tiff.constants.TiffConstants def file = new File(args[0]) // get all metadata stored in EXIF format (ie. from JPEG or TIFF). // org.w3c.dom.Node node = Sanselan.getMetadataObsolete(imageBytes); IImageMetadata metadata = Sanselan.getMetadata(file) println("file: ${file.getPath()}") if (!metadata) { println("\tNo EXIF metadata was found") } if (metadata instanceof JpegImageMetadata) { JpegImageMetadata jpegMetadata = metadata // Jpeg EXIF metadata is stored in a TIFF-based directory structure // and is identified with TIFF tags. // Here we look for the "x resolution" tag, but // we could just as easily search for any other tag. // // see the TiffConstants file for a list of TIFF tags. // print out various interesting EXIF tags. println(" -- Standard EXIF Tags") printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_XRESOLUTION) printTagValue(jpegMetadata, TiffConstants.TIFF_TAG_DATE_TIME) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_DATE_TIME_ORIGINAL) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_CREATE_DATE) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_ISO) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_SHUTTER_SPEED_VALUE) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_APERTURE_VALUE) printTagValue(jpegMetadata, TiffConstants.EXIF_TAG_BRIGHTNESS_VALUE) printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE_REF) printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LATITUDE) printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE_REF) printTagValue(jpegMetadata, TiffConstants.GPS_TAG_GPS_LONGITUDE) // simple interface to GPS data println(" -- GPS Info") TiffImageMetadata exifMetadata = jpegMetadata.exif if (exifMetadata) { TiffImageMetadata.GPSInfo gpsInfo = exifMetadata.getGPS() if (gpsInfo) { double longitude = gpsInfo.longitudeAsDegreesEast double latitude = gpsInfo.latitudeAsDegreesNorth println(" GPS Description: ${gpsInfo}") println(" GPS Longitude (Degrees East): ${longitude}") println(" GPS Latitude (Degrees North): ${latitude}") } } println(" -- All EXIF info") ArrayList items = jpegMetadata.items.each { item -> println(" ${item}") } println("") } void printTagValue(JpegImageMetadata jpegMetadata, TagInfo tagInfo) { TiffField field = jpegMetadata.findEXIFValue(tagInfo); if (field == null) { println(" (" + tagInfo.name + " not found.)") } else { println(" " + tagInfo.name + ": " + field.valueDescription) } }
0 comments:
Post a Comment