void Exiv2Lib::setWhiteBalanceCoeffsNikon(ExifData& data, float wb[3]) { ExifData::const_iterator pos; /* * This seems to be unnecessary as the multipliers are also * available as rational numbers in the WB_RBLevels tag */ /* pos = data.findKey(ExifKey("Exif.Nikon3.Version")); int makerNoteVersion = -1; if (pos != data.end()) { char* buf = new char[pos->size()]; pos->copy((unsigned char*)buf, littleEndian); QString val(buf); qDebug() << val; delete [] buf; makerNoteVersion = val.toInt(); } qDebug() << "Nikon makenote version:" << makerNoteVersion; if (makerNoteVersion >= 200) { qDebug() << "Decrypt Nikon Color Balance"; } */ pos = data.findKey(ExifKey("Exif.Nikon3.WB_RBLevels")); if (pos != data.end()) { if (*mExifInfo.model == "NIKON D300") { wb[0] = 1.0f; wb[1] = 1.0f; wb[2] = 1.0f; // wb[0] = colorData->V3.WhiteBalanceTable[WB_AsShot].RGGB[0]; // wb[1] = // ((colorData->V1.WhiteBalanceTable[WB_AsShot].RGGB[1] + // colorData->V1.WhiteBalanceTable[WB_AsShot].RGGB[2]) / 2); // wb[2] = colorData->V1.WhiteBalanceTable[WB_AsShot].RGGB[3]; qDebug() << "White balance for model Nikon D300"; if (pos != data.end()) { wb[0] = pos->toFloat(0); wb[1] = 1.0f; wb[2] = pos->toFloat(1); qDebug() << "Nikon: RGB" << wb[0] << "," << wb[1] << "," << wb[2]; } } float mx = max3(wb[0], wb[1], wb[2]); wb[0] /= mx; wb[1] /= mx; wb[2] /= mx; } else { qDebug () << "Nikon: Color balance data not available"; wb[0] = 1.0f; wb[1] = 1.0f; wb[2] = 1.0f; } }
gboolean exiv2_load_meta_interface(const gchar *service, RAWFILE *rawfile, guint offset, RSMetadata *meta) { try { Image::AutoPtr img = ImageFactory::open((byte*)raw_get_map(rawfile), raw_get_filesize(rawfile)); img->readMetadata(); ExifData &exifData = img->exifData(); #if EXIV2_TEST_VERSION(0,17,0) /* We perfer XMP data, so copy it to EXIF */ XmpData &xmpData = img->xmpData(); if (!xmpData.empty()) copyXmpToExif(xmpData, exifData); #endif /* Parse Exif Data */ if (!exifData.empty()) { ExifData::const_iterator i; i = exifData.findKey(ExifKey("Exif.Image.Make")); if (i != exifData.end()) set_metadata_maker(i->toString(), meta); i = exifData.findKey(ExifKey("Exif.Image.Model")); if (i != exifData.end()) meta->model_ascii = g_strdup(i->toString().c_str()); #if EXIV2_TEST_VERSION(0,19,0) i = orientation(exifData); if (i != exifData.end()) { std::auto_ptr<Exiv2::Value> val = i->getValue(); if (val->count()) { switch (val->toLong()) { case 6: meta->orientation = 90; break; case 8: meta->orientation = 270; break; } } } #endif i = exifData.findKey(ExifKey("Exif.Image.DateTimeOriginal")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Image.DateTime")); if (i != exifData.end()) { meta->time_ascii = g_strdup(i->toString().c_str()); meta->timestamp = rs_exiftime_to_unixtime(meta->time_ascii); } i = exifData.findKey(ExifKey("Exif.Image.ExposureTime")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Photo.ExposureTime")); if (i != exifData.end()) meta->shutterspeed = 1.0 / i->getValue()->toFloat(); else { i = exifData.findKey(ExifKey("Exif.Image.ShutterSpeedValue")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Photo.ShutterSpeedValue")); if (i != exifData.end()) meta->shutterspeed = 1.0 / i->toFloat(); } i = exifData.findKey(ExifKey("Exif.Image.FNumber")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Photo.FNumber")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Image.ApertureValue")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Photo.ApertureValue")); if (i != exifData.end()) meta->aperture = i->toFloat(); i = exifData.findKey(ExifKey("Exif.Image.FocalLength")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.Photo.FocalLength")); if (i != exifData.end()) meta->focallength = i->toFloat()-0.01; #if EXIV2_TEST_VERSION(0,19,0) i = isoSpeed(exifData); if (i != exifData.end()) meta->iso = i->toLong(); /* Text based Lens Identifier */ i = lensName(exifData); if (i != exifData.end()) { TypeId type = i->typeId(); if (type == unsignedShort || type == unsignedLong || type == signedShort || type == signedLong || type == unsignedByte || type == signedByte) meta->lens_id = i->toLong(); else if (type == asciiString || type == string) meta->fixed_lens_identifier = g_strdup(i->toString().c_str()); } #endif /* Canon*/ i = exifData.findKey(ExifKey("Exif.CanonCs.Lens")); if (i != exifData.end() && i->value().count() >= 3 && i->value().typeId() == unsignedShort) { float fu = i->value().toFloat(2); if (fu != 0.0) { meta->lens_min_focal = i->toFloat(0) / fu; meta->lens_max_focal = i->toFloat(1) /fu; } } i = exifData.findKey(ExifKey("Exif.CanonCs.MinAperture")); if (i != exifData.end()) meta->lens_min_aperture = (gfloat) exp(CanonEv(i->toFloat())*log(2)/2); i = exifData.findKey(ExifKey("Exif.CanonCs.MaxAperture")); if (i != exifData.end()) meta->lens_max_aperture = (gfloat) exp(CanonEv(i->toFloat())*log(2)/2); /* Olympus */ i = exifData.findKey(ExifKey("Exif.OlympusEq.MinFocalLength")); if (i != exifData.end()) meta->lens_min_focal = i->toFloat(); i = exifData.findKey(ExifKey("Exif.OlympusEq.MaxFocalLength")); if (i != exifData.end()) meta->lens_max_focal = i->toFloat(); /* Nikon */ i = exifData.findKey(ExifKey("Exif.NikonLd1.MinFocalLength")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd2.MinFocalLength")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MinFocalLength")); if (i != exifData.end()) meta->lens_min_focal = 5.0 * pow(2.0, i->toLong()/24.0); i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxFocalLength")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd2.MaxFocalLength")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxFocalLength")); if (i != exifData.end()) meta->lens_max_focal = 5.0 * pow(2.0, i->toLong()/24.0); i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxApertureAtMinFocal")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd2.MaxApertureAtMinFocal")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxApertureAtMinFocal")); if (i != exifData.end()) meta->lens_min_aperture = i->toLong()/12.0; i = exifData.findKey(ExifKey("Exif.NikonLd1.MaxApertureAtMaxFocal")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd2.MaxApertureAtMaxFocal")); if (i == exifData.end()) i = exifData.findKey(ExifKey("Exif.NikonLd3.MaxApertureAtMaxFocal")); if (i != exifData.end()) meta->lens_max_aperture = i->toLong()/12.0; /* Fuji */ i = exifData.findKey(ExifKey("Exif.Fujifilm.MinFocalLength")); if (i != exifData.end()) meta->lens_min_focal = i->toFloat(); i = exifData.findKey(ExifKey("Exif.Fujifilm.MaxFocalLength")); if (i != exifData.end()) meta->lens_max_focal = i->toFloat(); return TRUE; } } catch (Exiv2::Error& e) { g_debug("Exiv2 Metadata Loader:'%s'", e.what()); } return FALSE; }