简体   繁体   中英

How to read XMP face data from JPEG in Java

I have saved Picasa's face data inside my JPEG files (in XMP) and now I am trying to read that information in Java. So far I am failing and help would be much appreciated.

I am trying to use metadata-extractor library (though any other solution would also be fine). I can read the basic information (like the date, the image size etc.), but I am lost at extracting the additional data. This is what I get so far:

File file -- this is my JPEG file

Metadata metadata = JpegMetadataReader.readMetadata(file);
XmpDirectory xmpDirectory = metadata.getDirectory(XmpDirectory.class); 
XMPMeta xmpMeta = xmpDirectory.getXMPMeta();
System.out.println(xmpMeta.dumpObject()); 

Result:

ROOT NODE
    http://www.metadataworkinggroup.com/schemas/regions/ = "mwg-rs:" (0x80000000 : SCHEMA_NODE)
        mwg-rs:Regions  (0x100 : STRUCT)
            mwg-rs:AppliedToDimensions  (0x100 : STRUCT)
                stDim:h = "2793"
                stDim:unit = "pixel"
                stDim:w = "2047"
            mwg-rs:RegionList   (0x200 : ARRAY)
                [1] (0x100 : STRUCT)
                    mwg-rs:Area (0x100 : STRUCT)
                        stArea:h = "0.69531"
                        stArea:unit = "normalized"
                        stArea:w = "0.790425"
                        stArea:x = "0.491451"
                        stArea:y = "0.41783"
                    mwg-rs:Name = "abcde"
                    mwg-rs:Type = "Face"
    http://ns.adobe.com/xap/1.0/ = "xmp:"   (0x80000000 : SCHEMA_NODE)
        xmp:ModifyDate = "2014-04-06T19:43:24+01:00"

I do not understand how to get to these stArea:w, mwg-rs:Type = "Face", etc.

As usual, right after posting I've found a solution . I'll list it below to have it here.

try {
    Metadata metadata = ImageMetadataReader.readMetadata(imageFile);
    XmpDirectory xmpDirectory = metadata.getDirectory(XmpDirectory.class);
    XMPMeta xmpMeta = xmpDirectory.getXMPMeta();
    XMPIterator itr = xmpMeta.iterator();
    while (itr.hasNext()) {
        XMPPropertyInfo pi = (XMPPropertyInfo) itr.next();
        if (pi != null && pi.getPath() != null) {
            if ((pi.getPath().endsWith("stArea:w")) || (pi.getPath().endsWith("mwg-rs:Name")) || (pi.getPath().endsWith("stArea:h")))
                System.out.println(pi.getValue().toString());
        }
    }
} catch (final NullPointerException npe) {
  // ignore
}

What I do not like here is that it iterates through all properties instead of just reading the required ones. Any better (faster) solution?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM