1157 Exiv2::ExifData::const_iterator pos;
1166 if((pos = Exiv2::exposureTime(exifData)) != exifData.end() && pos->size())
1183 if((pos = Exiv2::fNumber(exifData)) != exifData.end() && pos->size())
1193 if((pos = Exiv2::isoSpeed(exifData)) != exifData.end() && pos->size())
1196 if(strcmp(pos->key().c_str(),
"Exif.Photo.ISOSpeedRatings") == 0)
1198 int isofield = pos->count() > 1 ? 1 : 0;
1199 img->
exif_iso = pos->toFloat(isofield);
1203 std::string str = pos->print();
1204 img->
exif_iso = (float)std::atof(str.c_str());
1212 std::string str = pos->print();
1213 img->
exif_iso = (float)std::atof(str.c_str());
1223 if((pos = Exiv2::focalLength(exifData)) != exifData.end() && pos->size())
1227 if (pos->key() ==
"Exif.Canon.FocalLength" && pos->count() == 4)
1236 const float focal_length_35mm = pos->toFloat();
1247 float x_resolution = pos->toFloat();
1248 float y_resolution = 0.0f;
1250 y_resolution = pos->toFloat();
1253 res_unit = pos->toLong();
1256 x_resolution /= 25.4f;
1257 y_resolution /= 25.4f;
1262 x_resolution /= 10.0f;
1263 y_resolution /= 10.0f;
1265 guint image_width = 0;
1266 guint image_height = 0;
1276 image_width = pos->toLong();
1278 image_height = pos->toLong();
1283 if(image_width == 0 &&
FIND_EXIF_TAG(
"Exif.SubImage1.NewSubfileType"))
1285 if(pos->toLong() == 0)
1288 image_width = pos->toLong();
1290 image_height = pos->toLong();
1296 if(image_width == 0)
1299 image_width = pos->toLong();
1301 image_height = pos->toLong();
1304 const float x_size_mm = (float)image_width / x_resolution;
1305 const float y_size_mm = (float)image_height / y_resolution;
1306 if(image_width && image_height)
1308 const float sensor_diagonal = dt_fast_hypotf(x_size_mm, y_size_mm);
1309 const float fullframe_diagonal = dt_fast_hypotf(36.0f, 24.0f);
1310 img->
exif_crop = fullframe_diagonal / sensor_diagonal;
1321 snprintf(tagname,
sizeof(tagname),
"darktable|mode|exif-crop");
1336 if(Exiv2::testVersion(0, 27, 4) &&
FIND_EXIF_TAG(
"Exif.NikonLd4.LensID") && pos->toLong() != 0)
1340#if EXIV2_TEST_VERSION(0, 28, 0)
1343 float value = pos->toFloat();
1344 if(Exiv2::testVersion(0, 28, 1))
value /= 256.0f;
1346 pos = exifData.end();
1347 for(
auto it = exifData.begin(); it != exifData.end(); it++)
1349 if(it->key() ==
"Exif.NikonLd4.FocusDistance") pos = it;
1351 if(pos != exifData.end() && pos->size())
1353 float value = pos->toFloat();
1359 || (Exiv2::testVersion(0, 27, 4) &&
FIND_EXIF_TAG(
"Exif.NikonLd4.FocusDistance")))
1361 float value = pos->toFloat();
1382 int nominator = pos->toRational(0).first;
1387 const float FocusDistanceUpper = pos->toFloat();
1388 if(FocusDistanceUpper <= 0.0f || (
int)FocusDistanceUpper >= 0xffff)
1397 const float FocusDistanceLower = pos->toFloat();
1398 if(FocusDistanceLower > 0.0f && (
int)FocusDistanceLower < 0xffff)
1410 else if((pos = Exiv2::subjectDistance(exifData)) != exifData.end() && pos->size())
1414 else if(Exiv2::testVersion(0,27,2) &&
FIND_EXIF_TAG(
"Exif.Sony2Fp.FocusPosition2"))
1416 const float focus_position = pos->toFloat();
1418 if (focus_position &&
FIND_EXIF_TAG(
"Exif.Photo.FocalLengthIn35mmFilm")) {
1419 const float focal_length_35mm = pos->toFloat();
1422 img->
exif_focus_distance = (pow(2, focus_position / 16 - 5) + 1) * focal_length_35mm / 1000;
1438 if(
FIND_EXIF_TAG(
"Exif.Thumbnail.PhotometricInterpretation") && (32803 == pos->toLong())
1447 Exiv2::ExifData::const_iterator ref = exifData.findKey(Exiv2::ExifKey(
"Exif.GPSInfo.GPSLatitudeRef"));
1448 if(ref != exifData.end() && ref->size() && pos->count() == 3)
1450 std::string sign_str = ref->toString();
1451 const char *
sign = sign_str.c_str();
1452 double latitude = 0.0;
1454 pos->toRational(1).first, pos->toRational(1).second,
1455 pos->toRational(2).first, pos->toRational(2).second,
sign[0], &latitude))
1462 Exiv2::ExifData::const_iterator ref = exifData.findKey(Exiv2::ExifKey(
"Exif.GPSInfo.GPSLongitudeRef"));
1463 if(ref != exifData.end() && ref->size() && pos->count() == 3)
1465 std::string sign_str = ref->toString();
1466 const char *
sign = sign_str.c_str();
1467 double longitude = 0.0;
1469 pos->toRational(1).first, pos->toRational(1).second,
1470 pos->toRational(2).first, pos->toRational(2).second,
sign[0], &longitude))
1477 Exiv2::ExifData::const_iterator ref = exifData.findKey(Exiv2::ExifKey(
"Exif.GPSInfo.GPSAltitudeRef"));
1478 if(ref != exifData.end() && ref->size())
1480 std::string sign_str = ref->toString();
1481 const char *
sign = sign_str.c_str();
1482 double elevation = 0.0;
1490 && pos->toLong() != 61182
1491 && pos->toLong() != 0
1492 && pos->toLong() != 65535)
1513 if(std::string::npos == lens.find_first_not_of(
" 1234567890"))
1527 fprintf(stderr,
"[exif] Warning: lens \"%s\" unknown as \"%s\"\n", img->
exif_lens, lens.c_str());
1530 else if(Exiv2::testVersion(0,27,4) &&
FIND_EXIF_TAG(
"Exif.NikonLd4.LensID") && pos->toLong() == 0)
1538 else if((pos = Exiv2::lensName(exifData)) != exifData.end() && pos->size())
1544 if(g_str_has_prefix(img->
exif_lens,
"RF"))
1548 pretty = g_strconcat(
"Canon RF-S ", &img->
exif_lens[4], (
char *)NULL);
1550 pretty = g_strconcat(
"Canon RF ", &img->
exif_lens[2], (
char *)NULL);
1556 if(g_str_has_prefix(img->
exif_lens,
"NIKKOR") || g_str_has_prefix(img->
exif_lens,
"TAMRON"))
1558 for(
size_t i = 1;
i <= 5; ++
i)
1566 if(std::string::npos == lens.find_first_not_of(
" (1234567890)")
1574 if ( (pos=exifData.findKey(Exiv2::ExifKey(
"Exif.Photo.Flash")))
1575 != exifData.end() && pos->size())
1577 uf_strlcpy_to_utf8(uf->conf->flashText, max_name, pos, exifData);
1580 if ( (pos=exifData.findKey(Exiv2::ExifKey(
"Exif.Photo.WhiteBalance")))
1581 != exifData.end() && pos->size())
1583 uf_strlcpy_to_utf8(uf->conf->whiteBalanceText, max_name, pos, exifData);
1593 std::string str = pos->print(&exifData);
1598 std::string str = pos->print(&exifData);
1605 std::string str = pos->print(&exifData);
1606 Exiv2::CommentValue
value(str);
1607 std::string str2 =
value.comment();
1608 if(str2 !=
"binary comment")
1613 std::string str = pos->print(&exifData);
1619 std::string str = pos->print(&exifData);
1625 const int stars = pos->toLong();
1630 const int stars = pos->toLong() * 5. / 100;
1638 float colmatrix[3][12];
1639 colmatrix[0][0] = colmatrix[1][0] = colmatrix[2][0] = NAN;
1648 const float correctmat[13][9] = {
1649 { 0.9555766, -0.0230393, 0.0631636, -0.0282895, 1.0099416, 0.0210077, 0.0122982, -0.0204830,
1651 { 0.9726856, -0.0135482, 0.0361731, -0.0167463, 1.0049102, 0.0120598, 0.0070026, -0.0116372,
1653 { 1.0206905, 0.0091588, -0.0228796, 0.0115005, 0.9984917, -0.0076762, -0.0043619, 0.0072053,
1655 { 0.8446965, -0.1179225, 0.3948108, -0.1366303, 1.1041226, 0.1291718, 0.0798489, -0.1348999,
1657 { 0.9415037, -0.0321240, 0.0584672, -0.0428238, 1.0250998, 0.0203309, 0.0101511, -0.0161170,
1659 { 0.9904476, -0.0071683, -0.0116156, -0.0123712, 1.0155950, -0.0029282, -0.0035635, 0.0067697,
1661 { 0.9212269, -0.0449128, 0.1211620, -0.0553723, 1.0277243, 0.0403563, 0.0235086, -0.0391019,
1665 { 0.8663030, -0.0913083, 0.2771784, -0.1090504, 1.0746895, 0.0913841, 0.0550856, -0.0924636,
1667 { 1.0096114, 0.0061501, 0.0068113, 0.0102539, 0.9888663, 0.0015575, 0.0023119, -0.0044823,
1669 { 0.9554129, -0.0231280, 0.0637169, -0.0283629, 1.0099053, 0.0211824, 0.0124188, -0.0206922,
1671 { 0.9147843, -0.0492842, 0.1202810, -0.0622085, 1.034984, 0.0404480, 0.0228014, -0.0375807,
1673 { 0.8805388, -0.0774890, 0.2293784, -0.0932136, 1.0589267, 0.0757827, 0.0453660, -0.0760107,
1675 { 0.8488316, -0.1107439, 0.3471428, -0.1310107, 1.0986874, 0.1141548, 0.0694025, -0.1167541,
1679 Exiv2::ExifData::const_iterator cm1_pos = exifData.findKey(Exiv2::ExifKey(
"Exif.Image.ColorMatrix1"));
1680 if((cm1_pos != exifData.end()) && (cm1_pos->count() == 9))
1682 for(
int i = 0;
i < 9;
i++) colmatrix[0][
i] = cm1_pos->toFloat(
i);
1687 Exiv2::ExifData::const_iterator cm2_pos = exifData.findKey(Exiv2::ExifKey(
"Exif.Image.ColorMatrix2"));
1688 if((cm2_pos != exifData.end()) && (cm2_pos->count() == 9))
1690 for(
int i = 0;
i < 9;
i++) colmatrix[1][
i] = cm2_pos->toFloat(
i);
1696#if EXIV2_TEST_VERSION(0,27,4)
1697 Exiv2::ExifData::const_iterator cm3_pos = exifData.findKey(Exiv2::ExifKey(
"Exif.Image.ColorMatrix3"));
1698 if((cm3_pos != exifData.end()) && (cm3_pos->count() == 9))
1700 for(
int i = 0;
i < 9;
i++) colmatrix[2][
i] = cm3_pos->toFloat(
i);
1709 int delta_min = D65temp;
1712 for(
int i = 0;
i < 3; ++
i)
1715 int delta_cur = abs(temp_cur - D65temp);
1716 if((temp_cur > sel_temp) && (delta_cur <= delta_min))
1719 sel_temp = temp_cur;
1720 delta_min = delta_cur;
1727 for(
int i = 0;
i < 3; ++
i)
1739 fprintf(stderr,
"[exif] `%s` dng illuminant %i (%iK) selected from ", img->
filename, illu[sel_illu], sel_temp);
1740 for(
int i = 0;
i < 3;
i++)
1741 fprintf(stderr,
" -- [%i] %i (%iK)",
i + 1, illu[
i],
_illu_to_temp(illu[
i]));
1742 fprintf(stderr,
"\n");
1752 switch(illu[sel_illu])
1805 fprintf(stderr,
"[exif] did not find a proper dng correction matrix for illuminant %i\n", illu[sel_illu]);
1820 format = pos->toLong();
1822 format = pos->toLong();
1825 bps = pos->toLong();
1827 bps = pos->toLong();
1830 spp = pos->toLong();
1832 spp = pos->toLong();
1834 if(
FIND_EXIF_TAG(
"Exif.SubImage1.PhotometricInterpretation"))
1835 phi = pos->toLong();
1836 else if(
FIND_EXIF_TAG(
"Exif.Image.PhotometricInterpretation"))
1837 phi = pos->toLong();
1839 if((format == 3) && (bps >= 16) && ((phi == 32803) || (phi == 34892)))
1842 if((spp == 1) && (phi == 34892))
1859 int colorspace = pos->toLong();
1860 if(colorspace == 0x01)
1862 else if(colorspace == 0x02)
1864 else if(colorspace == 0xffff)
1868 std::string interop_index = pos->toString();
1869 if(interop_index ==
"R03")
1871 else if(interop_index ==
"R98")
1878 if(
FIND_EXIF_TAG(
"Exif.Sony2.LensID") && pos->toLong() != 65535 && pos->print().find(
'|') == std::string::npos)
1892 std::string str = pos->print(&exifData);
1900 catch(
const std::exception &e)
1902 std::string s(e.what());
1903 std::cerr <<
"[exiv2 _exif_decode_exif_data] " << img->
filename <<
": " << s << std::endl;