Cleanup exif/xmp metadata handling

This commit is contained in:
Georg Hagen
2025-05-19 17:05:45 +02:00
parent 31bd94f939
commit 58922106f0

View File

@@ -44,6 +44,31 @@ namespace OpenVulkano::AR
{ {
return fmt::format("{:07d}.{}", frameId, fileExtension); return fmt::format("{:07d}.{}", frameId, fileExtension);
} }
std::string MakeXmpTag(ArFrame* arFrame)
{
Image::XmpBuilder xmpBuilder;
xmpBuilder.SetPose(arFrame->GetPose());
xmpBuilder.SetCreateDateNow();
xmpBuilder.SetExposureTime(arFrame->GetExposureTime());
xmpBuilder.SetFocalLength(arFrame->GetFocalLength());
xmpBuilder.SetCameraIntrinsic(arFrame->GetCameraIntrinsic());
return xmpBuilder.Finalize();
}
std::vector<uint8_t> MakeExifTag(ArFrame* arFrame)
{
Image::ExifBuilder exifBuilder;
exifBuilder.model = arFrame->GetLensModel();
exifBuilder.exposureTime = Image::RationalValue(1, 1.0f / arFrame->GetExposureTime());
exifBuilder.SetOrientation(atan2f(arFrame->GetCameraTransformation()[0][1], arFrame->GetCameraTransformation()[1][1]));
exifBuilder.dateTaken = exifBuilder.GetCurrentTimestamp();
exifBuilder.make = arFrame->GetArSession()->GetArType().GetVendorName();
exifBuilder.SetResolution();
exifBuilder.fNumber = arFrame->GetFNumber();
exifBuilder.focalLength = arFrame->GetFocalLength();
return exifBuilder.Build();
}
} }
ArRecorder::ArRecorder(ArSession* session) ArRecorder::ArRecorder(ArSession* session)
@@ -111,28 +136,10 @@ namespace OpenVulkano::AR
colorWriter->AddFile(fileName.c_str(), outBuffer, size); colorWriter->AddFile(fileName.c_str(), outBuffer, size);
if (path) [[unlikely]] if (path) [[unlikely]]
{ {
/*std::ofstream outFile(*path, std::ios::binary); auto exif = MakeExifTag(arFrame);
outFile.write(reinterpret_cast<const char*>(outBuffer), size);
outFile.close();*/
Image::ExifBuilder exifBuilder;
exifBuilder.model = arFrame->GetLensModel();
exifBuilder.exposureTime = Image::RationalValue(1, 1.0f / arFrame->GetExposureTime());
exifBuilder.SetOrientation(atan2f(arFrame->GetCameraTransformation()[0][1], arFrame->GetCameraTransformation()[1][1]));
exifBuilder.dateTaken = exifBuilder.GetCurrentTimestamp();
exifBuilder.make = arFrame->GetArSession()->GetArType().GetVendorName();
exifBuilder.SetResolution();
exifBuilder.fNumber = arFrame->GetFNumber();
exifBuilder.focalLength = arFrame->GetFocalLength();
auto exif = exifBuilder.Build();
Image::XmpBuilder xmpBuilder;
xmpBuilder.SetPose(arFrame->GetPose());
xmpBuilder.SetCreateDateNow();
xmpBuilder.SetExposureTime(arFrame->GetExposureTime());
xmpBuilder.SetFocalLength(arFrame->GetFocalLength());
xmpBuilder.SetCameraIntrinsic(arFrame->GetCameraIntrinsic());
JpegWithTagsWriter writer(*path); JpegWithTagsWriter writer(*path);
writer.WriteExifTag(exif); writer.WriteExifTag(exif);
writer.WriteXmpTag(xmpBuilder.Finalize()); writer.WriteXmpTag(MakeXmpTag(arFrame));
writer.WriteImageData({ outBuffer, size }); writer.WriteImageData({ outBuffer, size });
} }
} }