Further XMP print function updates (based on patch from webustany for GHOP 98).

This commit is contained in:
Andreas Huggel 2008-01-29 13:33:51 +00:00
parent 6d8f98f11d
commit ceeff042fc
5 changed files with 129 additions and 77 deletions

View File

@ -578,7 +578,7 @@ namespace Exiv2 {
const TagInfo Nikon3MakerNote::tagInfo_[] = {
TagInfo(0x0001, "Version", N_("Version"),
N_("Nikon Makernote version"),
nikon3IfdId, makerTags, undefined, printVersion),
nikon3IfdId, makerTags, undefined, printExifVersion),
TagInfo(0x0002, "ISOSpeed", N_("ISO Speed"),
N_("ISO speed setting"),
nikon3IfdId, makerTags, unsignedShort, print0x0002),

View File

@ -450,7 +450,7 @@ namespace Exiv2 {
extern const TagDetails xmpExifColorSpace[] = {
{ 1, N_("sRGB") },
{ 2, N_("Adobe RGB") }, // Not defined to Exif 2.2 spec. But used by a lot of cameras.
{ 65535, N_("uncalibrated") }
{ 65535, N_("Uncalibrated") }
};
//! exif:ComponentsConfiguration
@ -483,8 +483,8 @@ namespace Exiv2 {
{ 1, N_("Average") },
{ 2, N_("Center weighted average") },
{ 3, N_("Spot") },
{ 4, N_("Multi spot") },
{ 5, N_("Pattern") },
{ 4, N_("Multi-spot") },
{ 5, N_("Multi-segment") },
{ 6, N_("Partial") },
{ 255, N_("other") }
};
@ -523,12 +523,12 @@ namespace Exiv2 {
//! exif:SensingMethod
extern const TagDetails xmpExifSensingMethod[] = {
{ 1, N_("Not defined") },
{ 2, N_("One-chip color area sensor") },
{ 3, N_("Two-chip color area sensor") },
{ 4, N_("Three-chip color area sensor") },
{ 5, N_("Color sequential area sensor") },
{ 2, N_("One-chip color area") },
{ 3, N_("Two-chip color area") },
{ 4, N_("Three-chip color area") },
{ 5, N_("Color sequential area") },
{ 7, N_("Trilinear sensor") },
{ 8, N_("Color sequential linear sensor") }
{ 8, N_("Color sequential linear") }
};
//! exif:FileSource
@ -785,47 +785,52 @@ namespace Exiv2 {
};
extern const XmpPrintInfo xmpPrintInfo[] = {
{"Xmp.crs.CropUnits", EXV_PRINT_TAG(xmpCrsCropUnits)},
{"Xmp.exif.ColorSpace", EXV_PRINT_TAG(xmpExifColorSpace)},
{"Xmp.exif.ComponentsConfiguration", EXV_PRINT_TAG(xmpExifComponentsConfiguration)},
{"Xmp.exif.Contrast", EXV_PRINT_TAG(xmpExifNormalSoftHard)},
{"Xmp.exif.CustomRendered", EXV_PRINT_TAG(xmpExifCustomRendered)},
{"Xmp.exif.ExposureProgram", EXV_PRINT_TAG(xmpExifExposureProgram)},
{"Xmp.exif.FileSource", EXV_PRINT_TAG(xmpExifFileSource)},
{"Xmp.exif.FocalPlaneResolutionUnit", EXV_PRINT_TAG(xmpExifFocalPlaneResolutionUnit)},
{"Xmp.exif.GainControl", EXV_PRINT_TAG(xmpExifGainControl)},
{"Xmp.exif.LightSource", EXV_PRINT_TAG(xmpExifLightSource)},
{"Xmp.exif.MeteringMode", EXV_PRINT_TAG(xmpExifMeteringMode)},
{"Xmp.exif.Saturation", EXV_PRINT_TAG(xmpExifSaturation)},
{"Xmp.exif.SceneCaptureType", EXV_PRINT_TAG(xmpExifSceneCaptureType)},
{"Xmp.exif.SceneType", EXV_PRINT_TAG(xmpExifSceneType)},
{"Xmp.exif.SensingMethod", EXV_PRINT_TAG(xmpExifSensingMethod)},
{"Xmp.exif.Sharpness", EXV_PRINT_TAG(xmpExifNormalSoftHard)},
{"Xmp.exif.SubjectDistanceRange", EXV_PRINT_TAG(xmpExifSubjectDistanceRange)},
{"Xmp.exif.WhiteBalance", EXV_PRINT_TAG(xmpExifWhiteBalance)},
{"Xmp.exif.GPSAltitudeRef", EXV_PRINT_TAG(xmpExifGPSAltitudeRef)},
{"Xmp.exif.GPSDestBearingRef", EXV_PRINT_TAG(xmpExifGPSDirection)},
{"Xmp.exif.GPSDestDistanceRef", EXV_PRINT_TAG(xmpExifGPSDestDistanceRef)},
{"Xmp.exif.GPSDifferential", EXV_PRINT_TAG(xmpExifGPSDifferential)},
{"Xmp.exif.GPSImgDirectionRef", EXV_PRINT_TAG(xmpExifGPSDirection)},
{"Xmp.exif.GPSMeasureMode", EXV_PRINT_TAG(xmpExifGPSMeasureMode)},
{"Xmp.exif.GPSSpeedRef", EXV_PRINT_TAG(xmpExifGPSSpeedRef)},
{"Xmp.exif.GPSStatus", EXV_PRINT_TAG(xmpExifGPSStatus)},
{"Xmp.exif.GPSTrackRef", EXV_PRINT_TAG(xmpExifGPSDirection)},
{"Xmp.tiff.XResolution", printLong},
{"Xmp.tiff.YResolution", printLong},
{"Xmp.exif.DateTimeOriginal", printDate},
{"Xmp.exif.GPSTimeStamp", printDate},
{"Xmp.exif.CreateDate", printDate},
{"Xmp.exif.ModifyDate", printDate},
{"Xmp.exif.ApertureValue", print0x9202},
{"Xmp.exif.FNumber", print0x9202},
{"Xmp.exif.BrightnessValue", printLong},
{"Xmp.exif.ExposureBiasValue", printLong},
{"Xmp.exif.FocalLength", print0x920a},
{"Xmp.exif.FocalPlaneXResolution", printFloat},
{"Xmp.exif.FocalPlaneYResolution", printFloat},
{"Xmp.exif.ShutterSpeedValue", print0x9201}
{"Xmp.crs.CropUnits", EXV_PRINT_TAG(xmpCrsCropUnits) },
{"Xmp.exif.ApertureValue", print0x9202 },
{"Xmp.exif.BrightnessValue", printFloat },
{"Xmp.exif.ColorSpace", EXV_PRINT_TAG(xmpExifColorSpace) },
{"Xmp.exif.ComponentsConfiguration", EXV_PRINT_TAG(xmpExifComponentsConfiguration) },
{"Xmp.exif.Contrast", EXV_PRINT_TAG(xmpExifNormalSoftHard) },
{"Xmp.exif.CreateDate", printXmpDate },
{"Xmp.exif.CustomRendered", EXV_PRINT_TAG(xmpExifCustomRendered) },
{"Xmp.exif.DateTimeOriginal", printXmpDate },
{"Xmp.exif.ExifVersion", printXmpVersion },
{"Xmp.exif.ExposureBiasValue", print0x9204 },
{"Xmp.exif.ExposureProgram", EXV_PRINT_TAG(xmpExifExposureProgram) },
{"Xmp.exif.FileSource", EXV_PRINT_TAG(xmpExifFileSource) },
{"Xmp.exif.FlashpixVersion", printXmpVersion },
{"Xmp.exif.FNumber", print0x829d },
{"Xmp.exif.FocalLength", print0x920a },
{"Xmp.exif.FocalPlaneResolutionUnit", EXV_PRINT_TAG(xmpExifFocalPlaneResolutionUnit) },
{"Xmp.exif.FocalPlaneXResolution", printFloat },
{"Xmp.exif.FocalPlaneYResolution", printFloat },
{"Xmp.exif.GainControl", EXV_PRINT_TAG(xmpExifGainControl) },
{"Xmp.exif.GPSAltitudeRef", EXV_PRINT_TAG(xmpExifGPSAltitudeRef) },
{"Xmp.exif.GPSDestBearingRef", EXV_PRINT_TAG(xmpExifGPSDirection) },
{"Xmp.exif.GPSDestDistanceRef", EXV_PRINT_TAG(xmpExifGPSDestDistanceRef) },
{"Xmp.exif.GPSDifferential", EXV_PRINT_TAG(xmpExifGPSDifferential) },
{"Xmp.exif.GPSImgDirectionRef", EXV_PRINT_TAG(xmpExifGPSDirection) },
{"Xmp.exif.GPSMeasureMode", EXV_PRINT_TAG(xmpExifGPSMeasureMode) },
{"Xmp.exif.GPSSpeedRef", EXV_PRINT_TAG(xmpExifGPSSpeedRef) },
{"Xmp.exif.GPSStatus", EXV_PRINT_TAG(xmpExifGPSStatus) },
{"Xmp.exif.GPSTimeStamp", printXmpDate },
{"Xmp.exif.GPSTrackRef", EXV_PRINT_TAG(xmpExifGPSDirection) },
{"Xmp.exif.LightSource", EXV_PRINT_TAG(xmpExifLightSource) },
{"Xmp.exif.MeteringMode", EXV_PRINT_TAG(xmpExifMeteringMode) },
{"Xmp.exif.ModifyDate", printXmpDate },
{"Xmp.exif.Saturation", EXV_PRINT_TAG(xmpExifSaturation) },
{"Xmp.exif.SceneCaptureType", EXV_PRINT_TAG(xmpExifSceneCaptureType) },
{"Xmp.exif.SceneType", EXV_PRINT_TAG(xmpExifSceneType) },
{"Xmp.exif.SensingMethod", EXV_PRINT_TAG(xmpExifSensingMethod) },
{"Xmp.exif.Sharpness", EXV_PRINT_TAG(xmpExifNormalSoftHard) },
{"Xmp.exif.ShutterSpeedValue", print0x9201 },
{"Xmp.exif.SubjectDistanceRange", EXV_PRINT_TAG(xmpExifSubjectDistanceRange) },
{"Xmp.exif.WhiteBalance", EXV_PRINT_TAG(xmpExifWhiteBalance) },
{"Xmp.tiff.Orientation", print0x0112 },
{"Xmp.tiff.ResolutionUnit", printExifUnit },
{"Xmp.tiff.XResolution", printLong },
{"Xmp.tiff.YCbCrPositioning", print0x0213 },
{"Xmp.tiff.YResolution", printLong }
};
XmpNsInfo::Ns::Ns(const std::string& ns)

View File

@ -54,6 +54,13 @@ EXIV2_RCSID("@(#) $Id$")
# include <iconv.h>
#endif
// *****************************************************************************
// local declarations
namespace {
// Print version string from an intermediate string
std::ostream& printVersion(std::ostream& os, const std::string& str);
}
// *****************************************************************************
// class member definitions
namespace Exiv2 {
@ -295,7 +302,7 @@ namespace Exiv2 {
ifd0Id, recOffset, unsignedLong, printValue),
TagInfo(0x0112, "Orientation", N_("Orientation"),
N_("The image orientation viewed in terms of rows and columns."),
ifd0Id, imgStruct, unsignedShort, EXV_PRINT_TAG(exifOrientation)),
ifd0Id, imgStruct, unsignedShort, print0x0112),
TagInfo(0x0115, "SamplesPerPixel", N_("Samples per Pixel"),
N_("The number of components per pixel. Since this standard applies "
"to RGB and YCbCr images, the value set for this tag is 3. "
@ -329,7 +336,7 @@ namespace Exiv2 {
N_("The unit for measuring <XResolution> and <YResolution>. The same "
"unit is used for both <XResolution> and <YResolution>. If "
"the image resolution is unknown, 2 (inches) is designated."),
ifd0Id, imgStruct, unsignedShort, EXV_PRINT_TAG(exifUnit)),
ifd0Id, imgStruct, unsignedShort, printExifUnit),
TagInfo(0x012d, "TransferFunction", N_("Transfer Function"),
N_("A transfer function for the image, described in tabular style. "
"Normally this tag is not necessary, since color space is "
@ -417,7 +424,7 @@ namespace Exiv2 {
"<YCbCrPositioning>, it shall follow the TIFF default regardless "
"of the value in this field. It is preferable that readers "
"be able to support both centered and co-sited positioning."),
ifd0Id, imgStruct, unsignedShort, EXV_PRINT_TAG(exifYCbCrPositioning)),
ifd0Id, imgStruct, unsignedShort, print0x0213),
TagInfo(0x0214, "ReferenceBlackWhite", N_("Reference Black/White"),
N_("The reference black point value and reference white point "
"value. No defaults are given in TIFF, but the values "
@ -725,7 +732,7 @@ namespace Exiv2 {
TagInfo(0x9000, "ExifVersion", N_("Exif Version"),
N_("The version of this standard supported. Nonexistence of this "
"field is taken to mean nonconformance to the standard."),
exifIfdId, exifVersion, undefined, printVersion),
exifIfdId, exifVersion, undefined, printExifVersion),
TagInfo(0x9003, "DateTimeOriginal", N_("Date and Time (original)"),
N_("The date and time when the original image data was generated. "
"For a digital still camera the date and time the picture was taken are recorded."),
@ -807,7 +814,7 @@ namespace Exiv2 {
exifIfdId, dateTime, asciiString, printValue),
TagInfo(0xa000, "FlashpixVersion", N_("FlashPix Version"),
N_("The FlashPix format version supported by a FPXR file."),
exifIfdId, exifVersion, undefined, printVersion),
exifIfdId, exifVersion, undefined, printExifVersion),
TagInfo(0xa001, "ColorSpace", N_("Color Space"),
N_("The color space information tag is always "
"recorded as the color space specifier. Normally sRGB "
@ -868,7 +875,7 @@ namespace Exiv2 {
TagInfo(0xa210, "FocalPlaneResolutionUnit", N_("Focal Plane Resolution Unit"),
N_("Indicates the unit for measuring <FocalPlaneXResolution> and "
"<FocalPlaneYResolution>. This value is the same as the <ResolutionUnit>."),
exifIfdId, captureCond, unsignedShort, EXV_PRINT_TAG(exifUnit)),
exifIfdId, captureCond, unsignedShort, printExifUnit),
TagInfo(0xa214, "SubjectLocation", N_("Subject Location"),
N_("Indicates the location of the main subject in the scene. The "
"value of this tag represents the pixel at the center of the "
@ -1165,7 +1172,7 @@ namespace Exiv2 {
iopIfdId, iopTags, asciiString, printValue),
TagInfo(0x0002, "InteroperabilityVersion", N_("Interoperability Version"),
N_("Interoperability version"),
iopIfdId, iopTags, undefined, printVersion),
iopIfdId, iopTags, undefined, printExifVersion),
TagInfo(0x1000, "RelatedImageFileFormat", N_("Related Image File Format"),
N_("File format of image file"),
iopIfdId, iopTags, asciiString, printValue),
@ -1760,6 +1767,11 @@ namespace Exiv2 {
} // printUcs2
std::ostream& printExifUnit(std::ostream& os, const Value& value)
{
return EXV_PRINT_TAG(exifUnit)(os, value);
}
std::ostream& print0x0000(std::ostream& os, const Value& value)
{
if (value.size() != 4 || value.typeId() != unsignedByte) {
@ -1816,6 +1828,16 @@ namespace Exiv2 {
return os;
}
std::ostream& print0x0112(std::ostream& os, const Value& value)
{
return EXV_PRINT_TAG(exifOrientation)(os, value);
}
std::ostream& print0x0213(std::ostream& os, const Value& value)
{
return EXV_PRINT_TAG(exifYCbCrPositioning)(os, value);
}
std::ostream& print0x8298(std::ostream& os, const Value& value)
{
// Print the copyright information in the format Photographer, Editor
@ -1899,7 +1921,10 @@ namespace Exiv2 {
std::ostream& print0x9201(std::ostream& os, const Value& value)
{
URational ur = exposureTime(value.toFloat());
Rational r = value.toRational();
if (!value.ok() || r.second == 0) return os << "(" << value << ")";
URational ur = exposureTime(static_cast<float>(r.first) / r.second);
os << ur.first;
if (ur.second > 1) {
os << "/" << ur.second;
@ -2021,33 +2046,37 @@ namespace Exiv2 {
return os;
}
std::ostream& printVersion(std::ostream& os, const Value& value)
std::ostream& printExifVersion(std::ostream& os, const Value& value)
{
if (value.size() != 4 || value.typeId() != undefined) {
return os << "(" << value << ")";
}
int i = 0;
/* Strip an eventual non significative digit */
if (value.toLong(0) == '0') {
i++;
char s[5];
for (int i = 0; i < 4; ++i) {
s[i] = value.toLong(i);
}
for (; i < 4 ; ++i) {
os << static_cast<char>(value.toLong(i));
if (i == 1) {
os << '.';
}
}
return os;
s[4] = '\0';
return printVersion(os, s);
}
std::ostream& printDate(std::ostream& os, const Value& value)
std::ostream& printXmpVersion(std::ostream& os, const Value& value)
{
if (value.size() != 4 || value.typeId() != xmpText) {
return os << "(" << value << ")";
}
return printVersion(os, value.toString());
}
std::ostream& printXmpDate(std::ostream& os, const Value& value)
{
if (value.size() != 20 || value.typeId() != xmpText) {
return os << "(" << value << ")";
}
std::string stringValue = value.toString();
std::string stringValue = value.toString();
if (stringValue[19] == 'Z') {
stringValue = stringValue.substr(0, 19);
}
@ -2078,3 +2107,14 @@ namespace Exiv2 {
}
} // namespace Exiv2
namespace {
std::ostream& printVersion(std::ostream& os, const std::string& str)
{
if (str.size() != 4) {
return os << "(" << str << ")";
}
if (str[0] != '0') os << str[0];
return os << str[1] << "." << str[2] << str[3];
}
}

View File

@ -444,13 +444,18 @@ namespace Exiv2 {
std::ostream& printDegrees(std::ostream& os, const Value& value);
//! Print function converting from UCS-2LE to UTF-8
std::ostream& printUcs2(std::ostream& os, const Value& value);
//! Print function for Exif units (wrapper to be able to this also for XMP properties)
std::ostream& printExifUnit(std::ostream& os, const Value& value);
//! Print GPS version
std::ostream& print0x0000(std::ostream& os, const Value& value);
//! Print GPS altitude
std::ostream& print0x0006(std::ostream& os, const Value& value);
//! Print GPS timestamp
std::ostream& print0x0007(std::ostream& os, const Value& value);
//! Print orientation (wrapper to be able to this also for XMP properties)
std::ostream& print0x0112(std::ostream& os, const Value& value);
//! Print YCbCrPositioning (wrapper to be able to this also for XMP properties)
std::ostream& print0x0213(std::ostream& os, const Value& value);
//! Print the copyright
std::ostream& print0x8298(std::ostream& os, const Value& value);
//! Print the exposure time
@ -478,9 +483,11 @@ namespace Exiv2 {
//! Print 35mm equivalent focal length
std::ostream& print0xa405(std::ostream& os, const Value& value);
//! Print any version packed in 4 Bytes format : major major minor minor
std::ostream& printVersion(std::ostream& os, const Value& value);
std::ostream& printExifVersion(std::ostream& os, const Value& value);
//! Print any version encoded in the ASCII string majormajorminorminor
std::ostream& printXmpVersion(std::ostream& os, const Value& value);
//! Print a date following the format YYYY-MM-DDTHH:MM:SSZ
std::ostream& printDate(std::ostream& os, const Value& value);
std::ostream& printXmpDate(std::ostream& os, const Value& value);
//@}
//! Calculate F number from an APEX aperture value

View File

@ -397,7 +397,7 @@ namespace Exiv2 {
#endif
} // XmpParser::registerNs
void XmpParser::unregisterNs(const std::string& ns)
void XmpParser::unregisterNs(const std::string& /*ns*/)
{
#ifdef EXV_HAVE_XMP_TOOLKIT
try {