我对 exiv2 进行了一些修改,试图在 EXIF、IPTC 和 XMP 之间扩展它的日期/时间转换功能。http://dev.exiv2.org/issues/864
IPTC 日期和 IPTC 时间存储在不同的字段中,所以首先我尝试解析 IPTC 日期,稍后在我的代码中我尝试解析时间。
我是编程的初级初学者,所以这看起来是一个非常基本的问题,但这里有。该代码被添加到 cnvIptcValue 函数内的 exiv2 文件 convert.cpp 中。
我从命令行得到的确切错误:
$ exiv2 -eiX iptc.jpg
Warning: Failed to convert Iptc.Application2.DateCreated to Xmp.photoshop.DateCreated, unable to parse '1944-09-08'
Warning: Failed to convert Iptc.Application2.DigitizationDate to Xmp.xmp.CreateDate, unable to parse '2015-03-06'
起初我认为日期转换代码失败:
if (std::string(from) == "Iptc.Application2.DateCreated" || std::string(from) == "Iptc.Application2.DigitizationDate") {
int year, month, day, hour, min, sec, tzHour, tzMinute;
char tzSign;
char buf[30];
if (sscanf(value.c_str(), "%d-%d-%d", &year, &month, &day) != 3) {
EXV_WARNING << "Failed to convert " << from << " to " << to
<< ", unable to parse '" << value << "'\n";
return;
}
但进一步的测试表明,失败的是时间转换代码:
const char* iptcTime = 0;
if (std::string(from) == "Iptc.Application2.DateCreated") {
iptcTime = "Iptc.Application2.TimeCreated";
}
else if (std::string(from) == "Iptc.Application2.DigitizationDate") {
iptcTime = "Iptc.Application2.DigitizationTime";
}
if (iptcTime) {
if (sscanf(value.c_str(), "%d:%d:%d%1c%d:%02d", &hour, &min, &sec, &tzSign, &tzHour, &tzMinute) != 6) {
EXV_WARNING << "Failed to convert " << from << " to " << to
<< ", unable to parse '" << value << "'\n";
return;
}
所以时间代码试图解析日期字段。通过添加几行代码将其更改为时间字段:
Exiv2::IptcData::iterator iptctime_pos = iptcData_->findKey(IptcKey(from));
std::string value = iptctime_pos->toString();
我还扩展了错误消息代码以查看时间字段中的内容。现在的结果是:
Warning: Failed to convert Iptc.Application2.TimeCreated to Xmp.photoshop.DateCreated, unable to parse '11:11:14+00:00'
Year Month Day: 1944 9 8
Hour Minute Second: 32767 36913992 1978972555
Zone Sign Hour Minute: "U+007F" -184143665 6457088
Warning: Failed to convert Iptc.Application2.DigitizationTime to Xmp.xmp.CreateDate, unable to parse '16:26:47+00:00'
Year Month Day: 2015 3 6
Hour Minute Second: 32767 36909480 36909144
Zone Sign Hour Minute: "U+007F" -184143665 6457088
它正确解析日期字段,但不正确解析时间。为什么是这样?是不是解析错了?