This code demonstrates how to store, modify and parse metadata in ImageViews.
This code demonstrates how to store, modify and parse metadata in ImageViews.An ImageView is created and metadata are stored into it. Then the metadata are modified and parsed.
#include <iostream>
#include <numeric>
#include <vector>
#include <iolink/VariantDataValueConverter.h>
#include <iolink/VariantDataValueFactory.h>
#include <iolink/metadata/MetadataNodeFactory.h>
#include <iolink/metadata/MetadataNodeHelper.h>
#include <iolink/view/ImageViewFactory.h>
static void
addMetadata(std::shared_ptr<ImageView> image)
{
if (!image->support(ImageCapability::WRITE))
{
throw std::runtime_error("Image does not have WRITE capability");
}
std::shared_ptr<MetadataNode> root = MetadataNodeFactory::create("root", nullptr);
std::shared_ptr<MetadataNode> nameNode =
MetadataNodeFactory::create("name", VariantDataValueFactory::create("generated image for example"));
std::shared_ptr<MetadataNode> authorNode =
MetadataNodeFactory::create("author", VariantDataValueFactory::create("Arthur Conley"));
std::shared_ptr<MetadataNode> createDateNode =
MetadataNodeFactory::create("creation_date", VariantDataValueFactory::create("2024-08-23"));
root->addChild(nameNode);
root->addChild(authorNode);
root->addChild(createDateNode);
MetadataNodeHelper::createPath(root, "parameters/param1", VariantDataValueFactory::create(42));
MetadataNodeHelper::createPath(root, "parameters/param2", VariantDataValueFactory::create(3.14));
MetadataNodeHelper::createPath(root, "parameters/param3", VariantDataValueFactory::create("Hello world!"));
MetadataNodeHelper::createPath(root, "parameters/version", VariantDataValueFactory::create(1));
image->setMetadata(root);
}
static void
incrementVersionMetadata(std::shared_ptr<ImageView> image)
{
if (!image->support(ImageCapability::WRITE))
{
throw std::runtime_error("Image does not have WRITE capability");
}
std::shared_ptr<const MetadataNode> root = image->metadata();
std::shared_ptr<const MetadataNode> versionValue = MetadataNodeHelper::getNode(root, "parameters/version");
if (!versionValue)
{
throw std::runtime_error("version node does not exist");
}
int64_t version = VariantDataValueConverter::toInt64(versionValue->value());
std::shared_ptr<MetadataNode> rootCloned = root->clone();
MetadataNodeHelper::createPath(rootCloned, "parameters/version", VariantDataValueFactory::create(version + 1));
image->setMetadata(rootCloned);
}
static void
recursiveDisplayMethod(std::shared_ptr<const MetadataNode> root, size_t level)
{
std::string indent(level, ' ');
std::cout << indent << root->key() << " : ";
if (root->value())
std::cout << VariantDataValueConverter::toString(root->value());
std::cout << std::endl;
for (auto child : *root)
{
recursiveDisplayMethod(child, level + 1);
}
}
static void
displayMetadata(std::shared_ptr<ImageView> image)
{
if (!image->metadata())
{
std::cout << "No metadata to display" << std::endl;
return;
}
std::shared_ptr<const MetadataNode> root = image->metadata();
std::cout << "Metadata tree:" << std::endl;
recursiveDisplayMethod(root, 0);
}
int
main(int argc, char** argv)
{
std::shared_ptr<ImageView> image = ImageViewFactory::allocate(
VectorXu64{100, 200}, DataTypeId::UINT8);
addMetadata(image);
displayMetadata(image);
incrementVersionMetadata(image);
displayMetadata(image);
return EXIT_SUCCESS;
}
A dynamically sized arithmetic vector.
Definition VectorX.h:18
All IOLink symbols are enclosed in this namespace.
Definition ArrayX.h:8