Added iptc4xmpExt and plus XMP schemas (Based on a patch from Mikolaj Machowski).

v0.27.3
Andreas Huggel 16 years ago
parent 247bc0cd06
commit 09ec544678

@ -72,7 +72,9 @@ SCHEMA = xmp_dc \
xmp_aux \
xmp_iptc \
xmp_MicrosoftPhoto \
xmp_digiKam
xmp_digiKam \
xmp_iptcExt \
xmp_plus
TAGLIST = ../../src/taglist

@ -35,6 +35,8 @@
<li><a href="tags-xmp-exif.html"><span>exif</span></a></li>
<li><a href="tags-xmp-aux.html"><span>aux</span></a></li>
<li><a href="tags-xmp-iptc.html"><span>Iptc4xmpCore</span></a></li>
<li><a href="tags-xmp-iptcExt.html"><span>Iptc4xmpExt</span></a></li>
<li><a href="tags-xmp-plus.html"><span>plus</span></a></li>
<li><a href="tags-xmp-digiKam.html"><span>digiKam</span></a></li>
<li><a href="tags-xmp-MicrosoftPhoto.html"><span>MicrosoftPhoto</span></a></li>
</ul>

@ -0,0 +1,31 @@
__doctype__
<html>
__header2__
<body>
<div id="content">
__index1__
__index2__
<h2>IPTC Extension schema</h2>
<p>This schema specifies the IPTC Extension XMP properties. The IPTC
Extension schema extends and complements the IPTC Core schema by a set
of more granular properties and further specialized rights related
properties from the PLUS metadata schema.
<ul>
<li>Exiv2 keys are <b><code>Xmp.iptcExt.&lt;Property&gt;</code></b></li>
<li>The schema namespace URI is <b><code>http://iptc.org/std/Iptc4xmpExt/2008-02-29/</code></b></li>
<li>The preferred schema namespace prefix is <b><code>Iptc4xmpExt</code></b></li>
</ul>
Reference: <a href="http://www.iptc.org/std/photometadata/2008/specification/IPTC-PhotoMetadata-2008_2.pdf" title="IPTC Standard Photo Metadata 2008">IPTC Photo Metadata 2008</a> standard</p>
<p>Note: Exiv2 uses <b><code>iptcExt</code></b> (rather than <code>Iptc4xmpExt</code>) as the group name for keys of IPTC Extension schema properties.</p>
<p>Click on a column header to sort the table.</p>
__xmp_iptcExt__
</div>
<!-- closes content -->
</body>
</html>

@ -0,0 +1,29 @@
__doctype__
<html>
__header2__
<body>
<div id="content">
__index1__
__index2__
<h2>PLUS License Data Format schema</h2>
<p>The PLUS License Data Format ("LDF") is an ordered group of fields available
for optional use in embedding and reading image license metadata in digital
files and other documents.
<ul>
<li>Exiv2 keys are <b><code>Xmp.plus.&lt;Property&gt;</code></b></li>
<li>The schema namespace URI is <b><code>http://ns.useplus.org/ldf/xmp/1.0/</code></b></li>
<li>The preferred schema namespace prefix is <b><code>plus</code></b></li>
</ul>
Reference: <a href="http://ns.useplus.org/go.ashx" title="PLUS Technical Specification">PLUS Technical Specification</a></p>
<p>Click on a column header to sort the table.</p>
__xmp_plus__
</div>
<!-- closes content -->
</body>
</html>

@ -70,6 +70,8 @@
- <a href="tags-xmp-exif.html">exif schema</a>
- <a href="tags-xmp-aux.html">aux schema</a>
- <a href="tags-xmp-iptc.html">Iptc4xmpCore schema</a>
- <a href="tags-xmp-iptcExt.html">Iptc4xmpExt schema</a>
- <a href="tags-xmp-plus.html">PLUS schema</a>
- <a href="tags-xmp-digiKam.html">digiKam schema</a>
- <a href="tags-xmp-MicrosoftPhoto.html">MicrosoftPhoto schema</a>

@ -84,9 +84,11 @@ namespace Exiv2 {
extern const XmpPropertyInfo xmpExifInfo[];
extern const XmpPropertyInfo xmpAuxInfo[];
extern const XmpPropertyInfo xmpIptcInfo[];
extern const XmpPropertyInfo xmpIptcExtInfo[];
extern const XmpPropertyInfo xmpPlusInfo[];
extern const XmpNsInfo xmpNsInfo[] = {
// Schemas
// Schemas - NOTE: Schemas which the XMP-SDK doesn't know must be registered in XmpParser::initialize - Todo: Automate this
{ "http://purl.org/dc/elements/1.1/", "dc", xmpDcInfo, N_("Dublin Core schema") },
{ "http://www.digikam.org/ns/1.0/", "digiKam", xmpDigikamInfo, N_("digiKam Photo Management schema") },
{ "http://ns.adobe.com/xap/1.0/", "xmp", xmpXmpInfo, N_("XMP Basic schema") },
@ -104,6 +106,9 @@ namespace Exiv2 {
{ "http://ns.adobe.com/exif/1.0/aux/", "aux", xmpAuxInfo, N_("Exif schema for Additional Exif Properties")},
{ "http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/", "iptc", xmpIptcInfo, N_("IPTC Core schema") },
// NOTE: 'Iptc4xmpCore' is just too long
{ "http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", xmpIptcExtInfo, N_("IPTC Extension schema") },
// NOTE: It really should be 'Iptc4xmpExt' but following example above
{ "http://ns.useplus.org/ldf/xmp/1.0/", "plus", xmpPlusInfo, N_("PLUS License Data Format schema") },
// Structures
{ "http://ns.adobe.com/xap/1.0/g/", "xapG", 0, N_("Colorant structure") },
@ -384,8 +389,8 @@ namespace Exiv2 {
{ 0, 0, 0, invalidTypeId, xmpInternal, 0 }
};
//! crs:CropUnits
extern const TagDetails xmpCrsCropUnits[] = {
//! XMP crs:CropUnits
extern const TagDetails crsCropUnits[] = {
{ 0, N_("pixels") },
{ 1, N_("inches") },
{ 2, N_("cm") }
@ -630,8 +635,92 @@ namespace Exiv2 {
{ 0, 0, 0, invalidTypeId, xmpInternal, 0 }
};
extern const XmpPropertyInfo xmpIptcExtInfo[] = {
{ "AddlModelInfo", N_("Additional model info"), "Text", xmpText, xmpExternal, N_("Information about the ethnicity and other facts of the model(s) in a model-released image.") },
{ "OrganisationInImageCode", N_("Code of featured Organisation"), "bag Text", xmpBag, xmpExternal, N_("Code from controlled vocabulary for identyfing the organisation or company which is featured in the image.") },
{ "CVterm", N_("Controlled Vocabulary Term"), "bag URI", xmpBag, xmpExternal, N_("A term to describe the content of the image by a value from a Controlled Vocabulary.") },
{ "ModelAge", N_("Model age"), "bag Integer", xmpBag, xmpExternal, N_("Age of the human model(s) at the time this image was taken in a model released image.") },
{ "OrganisationInImageName", N_("Name of featured Organisation"), "bag Text", xmpBag, xmpExternal, N_("Name of the organisation or company which is featured in the image.") },
{ "PersonInImage", N_("Person shown"), "bag Text", xmpBag, xmpExternal, N_("Name of a person shown in the image.") },
{ "DigImageGUID", N_("Digital Image Identifier"), "Text", xmpText, xmpExternal, N_("Globally unique identifier for this digital image. It is created and applied by the creator of the digital image at the time of its creation. this value shall not be changed after that time.") },
{ "DigitalSourcefileType", N_("Physical type of original photo"), "URI", xmpText, xmpExternal, N_("The type of the source digital file.") },
{ "Event", N_("Event"), "Lang Alt", langAlt, xmpExternal, N_("Names or describes the specific event at which the photo was taken.") },
{ "MaxAvailHeight", N_("Maximum available height"), "Integer", xmpText, xmpExternal, N_("The maximum available height in pixels of the original photo from which this photo has been derived by downsizing.") },
{ "MaxAvailWidth", N_("Maximum available width"), "Integer", xmpText, xmpExternal, N_("The maximum available width in pixels of the original photo from which this photo has been derived by downsizing.") },
{ "RegistryId", N_("Registry Entry"), "bag RegistryEntryDetails", xmpBag, xmpExternal, N_("Both a Registry Item Id and a Registry Organisation Id to record any registration of this digital image with a registry.") },
{ "RegItemId", N_("Registry Entry-Item Identifier"), "Text", xmpText, xmpExternal, N_("A unique identifier created by a registry and applied by the creator of the digital image. This value shall not be changed after being applied. This identifier is linked to a corresponding Registry Organisation Identifier.") },
{ "RegOrgId", N_("Registry Entry-Organisation Identifier"), "Text", xmpText, xmpExternal, N_("An identifier for the registry which issued the corresponding Registry Image Id.") },
{ "IptcLastEdited", N_("IPTC Fields Last Edited"), "Date", xmpText, xmpExternal, N_("The date and optionally time when any of the IPTC photo metadata fields has been last edited.") },
{ "LocationShown", N_("Location shown"), "bag LocationDetails", xmpBag, xmpExternal, N_("A location shown in the image.") },
{ "LocationCreated", N_("Location Created"), "bag LocationDetails", xmpBag, xmpExternal, N_("The location the photo was taken.") },
{ "City", N_("Location-City"), "Text", xmpText, xmpExternal, N_("Name of the city of a location.") },
{ "CountryCode", N_("Location-Country ISO-Code"), "Text", xmpText, xmpExternal, N_("The ISO code of a country of a location.") },
{ "CountryName", N_("Location-Country Name"), "Text", xmpText, xmpExternal, N_("The name of a country of a location.") },
{ "ProvinceState", N_("Location-Province/State"), "Text", xmpText, xmpExternal, N_("The name of a subregion of a country - a province or state - of a location.") },
{ "Sublocation", N_("Location-Sublocation"), "Text", xmpText, xmpExternal, N_("Name of a sublocation. This sublocation name could either be the name of a sublocation to a city or the name of a well known location or (natural) monument outside a city.") },
{ "WorldRegion", N_("Location-World Region"), "Text", xmpText, xmpExternal, N_("The name of a world region of a location.") },
{ "ArtworkOrObject", N_("Artwork or object in the image"), "bag ArtworkOrObjectDetails", xmpBag, xmpExternal, N_("A set of metadata about artwork or an object in the image.") },
{ "AOCopyrightNotice", N_("Artwork or object-Copyright notice"), "Text", xmpText, xmpExternal, N_("Contains any necessary copyright notice for claiming the intellectual property for artwork or an object in the image and should identify the current owner of the copyright of this work with associated intellectual property rights.") },
{ "AOCreator", N_("Artwork or object-Creator"), "seq ProperName", xmpSeq, xmpExternal, N_("Contains the name of the artist who has created artwork or an object in the image. In cases where the artist could or should not be identified the name of a company or organisation may be appropriate.") },
{ "AODateCreated", N_("Artwork or object-Date Created"), "Date", xmpText, xmpExternal, N_("Designates the date and optionally the time the artwork or object in the image was created. This relates to artwork or objects with associated intellectual property rights.") },
{ "AOSource", N_("Artwork or object-Source"), "Text", xmpText, xmpExternal, N_("The organisation or body holding and registering the artwork or object in the image for inventory purposes.") },
{ "AOSourceInvNo", N_("Artwork or object-Source inventory number"), "Text", xmpText, xmpExternal, N_("The inventory number issued by the organisation or body holding and registering the artwork or object in the image.") },
{ "AOTitle", N_("Artwork or object-Title"), "Lang Alt", langAlt, xmpExternal, N_("A reference for the artwork or object in the image.") },
// End of list marker
{ 0, 0, 0, invalidTypeId, xmpInternal, 0 }
};
extern const XmpPropertyInfo xmpPlusInfo[] = {
// Part of PLUS Version 1.2.0
{ "ImageSupplier", N_("Image Supplier"), "seq ImageSupplierDetail", xmpSeq, xmpExternal, N_("Identifies the most recent supplier of the image, who is not necessarily its owner or creator.") },
{ "Version", N_("PLUS version"), "Text", xmpText, xmpExternal, N_("The version number of the PLUS standards in place at the time of the transaction.") },
{ "CopyrightOwner", N_("Copyright owner"), "seq CopyrightOwnerDetail", xmpSeq, xmpExternal, N_("Owner or owners of the copyright in the licensed image.") },
{ "ImageCreator", N_("Image Creator"), "seq ImageCreatorDetail", xmpSeq, xmpExternal, N_("Creator or creators of the image.") },
{ "Licensor", N_("Licensor"), "seq LicensorDetail", xmpSeq, xmpExternal, N_("A person or company that should be contacted to obtain a license for using the item or who has licensed the item.") },
{ "MinorModelAgeDisclosure", N_("Minor Model Age Disclosure"), "URL", xmpText, xmpExternal, N_("Age of the youngest model pictured in the image, at the time that the image was made.") },
{ "ModelReleaseID", N_("Model Release ID"), "bag Text", xmpBag, xmpExternal, N_("A PLUS-ID identifying each Model Release.") },
{ "ModelReleaseStatus", N_("Model Release Status"), "URL", xmpText, xmpExternal, N_("Summarizes the availability and scope of model releases authorizing usage of the likenesses of persons appearing in the photograph.") },
{ "PropertyReleaseID", N_("Property Release ID"), "bag Text", xmpBag, xmpExternal, N_("A PLUS-ID identifying each Property Release.") },
{ "PropertyReleaseStatus", N_("Property Release Status"), "URL", xmpText, xmpExternal, N_("Summarizes the availability and scope of property releases authorizing usage of the properties appearing in the photograph.") },
// End of list marker
{ 0, 0, 0, invalidTypeId, xmpInternal, 0 }
};
//! XMP plus:MinorModelAgeDisclosure
extern const TagVocabulary plusMinorModelAgeDisclosure[] = {
{ "AG-UNK", N_("Age Unknown") },
{ "AG-A25", N_("Age 25 or Over") },
{ "AG-A24", N_("Age 24") },
{ "AG-A23", N_("Age 23") },
{ "AG-A22", N_("Age 22") },
{ "AG-A21", N_("Age 21") },
{ "AG-A20", N_("Age 20") },
{ "AG-A19", N_("Age 19") },
{ "AG-A18", N_("Age 18") },
{ "AG-A17", N_("Age 17") },
{ "AG-A16", N_("Age 16") },
{ "AG-A15", N_("Age 15") },
{ "AG-U14", N_("Age 14 or Under") }
};
//! XMP plus:ModelReleaseStatus
extern const TagVocabulary plusModelReleaseStatus[] = {
{ "MR-NON", N_("None") },
{ "MR-NAP", N_("Not Applicable") },
{ "MR-UMR", N_("Unlimited Model Releases") },
{ "MR-LMR", N_("Limited or Incomplete Model Releases") }
};
//! XMP plus:PropertyReleaseStatus
extern const TagVocabulary plusPropertyReleaseStatus[] = {
{ "PR-NON", N_("None") },
{ "PR-NAP", N_("Not Applicable") },
{ "PR-UPR", N_("Unlimited Property Releases") },
{ "PR-LPR", N_("Limited or Incomplete Property Releases") }
};
extern const XmpPrintInfo xmpPrintInfo[] = {
{"Xmp.crs.CropUnits", EXV_PRINT_TAG(xmpCrsCropUnits)},
{"Xmp.crs.CropUnits", EXV_PRINT_TAG(crsCropUnits) },
{"Xmp.exif.ApertureValue", print0x9202 },
{"Xmp.exif.BrightnessValue", printFloat },
{"Xmp.exif.ColorSpace", print0xa001 },
@ -677,7 +766,10 @@ namespace Exiv2 {
{"Xmp.tiff.ResolutionUnit", printExifUnit },
{"Xmp.tiff.XResolution", printLong },
{"Xmp.tiff.YCbCrPositioning", print0x0213 },
{"Xmp.tiff.YResolution", printLong }
{"Xmp.tiff.YResolution", printLong },
{"Xmp.plus.MinorModelAgeDisclosure", EXV_PRINT_VOCABULARY(plusMinorModelAgeDisclosure) },
{"Xmp.plus.ModelReleaseStatus", EXV_PRINT_VOCABULARY(plusModelReleaseStatus) },
{"Xmp.plus.PropertyReleaseStatus", EXV_PRINT_VOCABULARY(plusPropertyReleaseStatus) }
};
XmpNsInfo::Ns::Ns(const std::string& ns)

@ -64,6 +64,12 @@ namespace {
// class member definitions
namespace Exiv2 {
bool TagVocabulary::operator==(const std::string& key) const
{
if (strlen(voc_) > key.size()) return false;
return 0 == strcmp(voc_, key.c_str() + key.size() - strlen(voc_));
}
//! @cond IGNORE
IfdInfo::Item::Item(const std::string& item)
{

@ -140,6 +140,24 @@ namespace Exiv2 {
const char* label_; //!< Description of the tag value
}; // struct TagDetailsBitmask
/*!
@brief Helper structure for lookup tables for translations of controlled
vocabulary strings to their descriptions.
*/
struct EXIV2API TagVocabulary {
const char* voc_; //!< Vocabulary string
const char* label_; //!< Description of the vocabulary string
/*!
@brief Comparison operator for use with the find template
Compare vocabulary strings like "PR-NON" with keys like
"http://ns.useplus.org/ldf/vocab/PR-NON" and return true if the vocabulary
string matches the end of the key.
*/
bool operator==(const std::string& key) const;
}; // struct TagDetails
/*!
@brief Generic pretty-print function to translate a long value to a description
by looking up a reference table.
@ -193,6 +211,26 @@ namespace Exiv2 {
//! Shortcut for the printTagBitmask template which requires typing the array name only once.
#define EXV_PRINT_TAG_BITMASK(array) printTagBitmask<EXV_COUNTOF(array), array>
/*!
@brief Generic pretty-print function to translate a controlled vocabulary value (string)
to a description by looking up a reference table.
*/
template <int N, const TagVocabulary (&array)[N]>
std::ostream& printTagVocabulary(std::ostream& os, const Value& value, const ExifData*)
{
const TagVocabulary* td = find(array, value.toString());
if (td) {
os << exvGettext(td->label_);
}
else {
os << "(" << value << ")";
}
return os;
}
//! Shortcut for the printTagVocabulary template which requires typing the array name only once.
#define EXV_PRINT_VOCABULARY(array) printTagVocabulary<EXV_COUNTOF(array), array>
//! Exif tag reference, implemented as a static class.
class EXIV2API ExifTags {
//! Prevent construction: not implemented.

@ -378,6 +378,8 @@ namespace Exiv2 {
initialized_ = SXMPMeta::Initialize();
SXMPMeta::RegisterNamespace("http://www.digikam.org/ns/1.0/", "digiKam", 0);
SXMPMeta::RegisterNamespace("http://ns.microsoft.com/photo/1.0/", "MicrosoftPhoto", 0);
SXMPMeta::RegisterNamespace("http://iptc.org/std/Iptc4xmpExt/2008-02-29/", "iptcExt", 0);
SXMPMeta::RegisterNamespace("http://ns.useplus.org/ldf/xmp/1.0/", "plus", 0);
#else
initialized_ = true;
#endif

Loading…
Cancel
Save