commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Damjan Jovanovic <damjan....@gmail.com>
Subject Re: [IMAGING] Getting EXIF and IPTC metadata using metadata and image format neutral code
Date Tue, 03 Jul 2012 19:58:52 GMT
I've also considered the metadata interfaces we use, and I am not sure
the current approaches are any good.

Most metadata formats are designed in a way specific to that format,
eg. some have arbitrary levels of nesting, others have a flat
structure, etc. But most are designed to be stored in any image
format.

So instead of a Imaging.getMetadata() method that tries to unify all
metadata into one common interface - and does so badly, because eg.
EXIF can have nested subdirectories and this information is lost -
maybe we should have:
Imaging.getExifMetadata()
Imaging.getIptcMetadata()
Imaging.getXmpMetadata()

Regards
Damjan

On Tue, Jul 3, 2012 at 9:19 PM, Farrukh Najmi
<farrukh@wellfleetsoftware.com> wrote:
>
> Updated proposed patch with following new changes:
>
> Add getValue() method to nested class IImageMetadataItem. These return the
> value of the item as an Object allowing for values of various types to be
> returned.
>
>
> On 07/03/2012 11:01 AM, Farrukh Najmi wrote:
>
> Moving this thread to dev list as it seems to be more appropriate there....
>
> Attached is a patch to the IImageMetadata.java that reflects my revised
> proposal thinking this through in conjunction with the proposed solution in
> another thread...
>
> Add a getMetadataSpecification() method to IImageMetadata so we can manage
> the metadata specification that defines the metadata
> Add getMetadata() to nested class IImageMetadataItem to get back at the
> parent IImageMetadata instance so we can access the metadata specification
> information managed from an IImageMetadata instance
> Add getId(), getName(), getDescription() methods to nested class
> IImageMetadataItem. These are the key triplet of info about the metadata
> item that is needed in my experience
>
> Of course implementations of these two interfaces would need to also be
> updated to support the new methods according to proposed semantics. I would
> be happy to contribute in any way that I can and as requested.
>
> Dev team colleagues, please weigh in on the proposal. Thanks for your
> awesome work to create this project and for considering this proposal.
>
> On 07/02/2012 07:12 PM, Farrukh Najmi wrote:
>
>
> 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:
>
> For EXIF return the Field Name as in Table 3 TIFF Rev. 6.0 Attribute
> Information Used in Exif in the Exif spec.
> 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 ide
>
>
> --
> Regards,
> Farrukh
>
> Web: http://www.wellfleetsoftware.com
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
> ntifies 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 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
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message