commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Farrukh Najmi <farr...@wellfleetsoftware.com>
Subject Re: [IMAGING] Getting EXIF and IPTC metadata using metadata and image format neutral code
Date Mon, 02 Jul 2012 23:12:20 GMT

Here is a proposed change to the API that would help my scenario...

Modify the org.apache.commons.imaging.common.ImageMetadata$Item class to 
have the following additional methods:

  * getMetadataSpecification() method that returns a constant String
    such as "IPTC:1.1", "EXIF:2.1", "EXIF:2.2"
  * getId() method that returns a unique id as follows:
      o For EXIF return the Field Name as in Table 3 TIFF Rev. 6.0
        Attribute Information Used in Exif in the Exif spec
        <http://www.exif.org/Exif2-2.PDF>.
      o For IPTC return the IptcRecord..iptcType.getType()

This would allow the first code pattern below to identify each item 
based on a specific metadata field defined by a specific specification.

Thoughts?

On 07/02/2012 06:18 PM, Farrukh Najmi wrote:
>
> Hi Guys,
>
> I am trying to use commons-imaging latest svn bits to write a program 
> that will read standard metadata such as Exif and IPTC from images in 
> a variety of image formats using code that is as image format neutral 
> as possible. The goal is to store each class of metadata (e.g. Exif, 
> IPTC, ...) in a separate Map where the key identifies a metadata 
> attribute identifier defined by the standard and a value that is the 
> metadata attribute's value.
>
> Here are two patterns I have identified for reading the metadata by 
> looking at test programs and code....
>
> 1. Read metadata items without considering image format or metadata 
> standard.
>
>             IImageMetadata metadata = Imaging.getMetadata(is, "Oregon 
> Scientific DS6639 - DSC_0307 - iptc added with irfanview.jpg");
>             List<? extends IImageMetadata.IImageMetadataItem> items = 
> metadata.getItems();
>
>             int i=0;
>             for (IImageMetadata.IImageMetadataItem iitem : items) {
>                 ImageMetadata.Item item = (ImageMetadata.Item)iitem;
>                 System.err.println("Index: " + i + " Key: " + 
> item.getKeyword() + " Value: " + item.getText() + " class: " + 
> iitem.getClass());   //common.ImageMetadata$Item, Tiff.TiffImageMetadata
>                 i++;
>             }
>
>
> This is closest to what I want. The EXIF metadata is represented by 
> org.apache.commons.imaging.formats.tiff.TiffImageMetadata$Item and I 
> can get at the TiffField and its tagName and value (good). However, 
> IPTC metadata is represented by 
> org.apache.commons.imaging.common.ImageMetadata$Item. This class seems 
> to have no link back to the 
> org.apache.commons.imaging.formats.jpeg.iptc.IptcRecord and thus I 
> cannot find a way to get the attribute defined by the IPTC spec 
> <http://www.iptc.org/std/photometadata/2008/specification/IPTC-PhotoMetadata-2008.pdf>

> under the IIM mapping rows.
>
>
> 2. Read Exif and IPTC separately using following metadata and image 
> format specific  patterns as shown below...
>
>             //Read EXIF
>             JpegImageMetadata metadata = (JpegImageMetadata) 
> Imaging.getMetadata(is, "Oregon Scientific DS6639 - DSC_0307 - iptc 
> added with irfanview.jpg");
>             TiffImageMetadata exifMetadata = metadata.getExif();
>             List<TiffField> fields = exifMetadata.getAllFields();
>
>             int i=0;
>             for (TiffField field : fields) {
>                 String key = field.getTagName();
>                 Object value = field.getValue();
>                 String fieldName = field.tagInfo.name;
>                 System.err.println("Index: " + i + " Key: " + key + ", 
> Value: " + value + ", valueType: " + value.getClass());
>                 i++;
>             }
>
>             //Read IPTC
>             JpegImageMetadata metadata = (JpegImageMetadata) 
> Imaging.getMetadata(is, "Oregon Scientific DS6639 - DSC_0307 - iptc 
> added with irfanview.jpg");
>             JpegPhotoshopMetadata psMetadata = metadata.getPhotoshop();
>             List oldRecords = psMetadata.photoshopApp13Data.getRecords();
>
>             for (int j = 0; j < oldRecords.size(); j++) {
>                 IptcRecord record = (IptcRecord) oldRecords.get(j);
>                 System.err.println("Key: " + record.iptcType.getName() 
> + " (0x"
>                             + 
> Integer.toHexString(record.iptcType.getType())
>                             + "), value: " + record.value);
>             }
>
> Above gives me all the linkage back to specification defined metadata 
> fields but is less desirable because it metadata and image format 
> specific.
>
> I feel that it would be ideal to support a generic api that is 
> agnostic to metadata and image format but provides a reference back to 
> the specification defined field (attribute) identifier some how.
>
> I would very much appreciate some ideas from dev team on how we could 
> improve the api to support providing a reference back to a 
> specification defined field in a metadata and image format neutral manner.
>
> My apologies if I am missing an obvious solution while I am getting 
> familiar with the code.

-- 
Regards,
Farrukh

Web: http://www.wellfleetsoftware.com


Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message