Skip to content
Snippets Groups Projects
Commit 094c3929 authored by Mathieu Westphal (Kitware)'s avatar Mathieu Westphal (Kitware) :zap:
Browse files

Adding a CreateImageReader2FromExtension method

parent 6084b266
Branches
No related tags found
No related merge requests found
......@@ -5,7 +5,7 @@ VTK_DATA_ROOT = vtkGetDataRoot()
# Image pipeline
createReader = vtk.vtkImageReader2Factory()
reader = createReader.CreateImageReader2("" + str(VTK_DATA_ROOT) + "/Data/beach.tif")
reader = createReader.CreateImageReader2FromExtension("tif")
reader.SetFileName("" + str(VTK_DATA_ROOT) + "/Data/beach.tif")
# "beach.tif" image contains ORIENTATION tag which is
# ORIENTATION_TOPLEFT (row 0 top, col 0 lhs) type. The TIFF
......
......@@ -34,6 +34,8 @@
// until after the AvailableReaders singleton has been destroyed.
#include "vtkFilteringInformationKeyManager.h"
#include <sstream>
vtkStandardNewMacro(vtkImageReader2Factory);
class vtkImageReader2FactoryCleanup
......@@ -112,6 +114,61 @@ vtkImageReader2* vtkImageReader2Factory::CreateImageReader2(const char* path)
return nullptr;
}
vtkImageReader2* vtkImageReader2Factory::CreateImageReader2FromExtension(const char* extension)
{
vtkImageReader2Factory::InitializeReaders();
vtkImageReader2* ret;
vtkCollection* collection = vtkCollection::New();
vtkObjectFactory::CreateAllInstance("vtkImageReaderObject", collection);
vtkObject* object;
// first try the current registered object factories to see
// if one of them can
for (collection->InitTraversal(); (object = collection->GetNextItemAsObject());)
{
if (object)
{
ret = vtkImageReader2::SafeDownCast(object);
if (ret)
{
const char* extensions = ret->GetFileExtensions();
if (vtkImageReader2Factory::CheckExtensionIsInExtensions(extension, extensions))
{
return ret;
}
}
}
}
// get rid of the collection
collection->Delete();
vtkCollectionSimpleIterator sit;
for (vtkImageReader2Factory::AvailableReaders->InitTraversal(sit);
(ret = vtkImageReader2Factory::AvailableReaders->GetNextImageReader2(sit));)
{
const char* extensions = ret->GetFileExtensions();
if (vtkImageReader2Factory::CheckExtensionIsInExtensions(extension, extensions))
{
return ret->NewInstance();
}
}
return nullptr;
}
bool vtkImageReader2Factory::CheckExtensionIsInExtensions(
const char* extension, const char* extensions)
{
auto iss = std::istringstream{ extensions };
std::string localExtension;
while (iss >> localExtension)
{
if (localExtension == std::string(extension) || localExtension == "." + std::string(extension))
{
return true;
}
}
return false;
}
void vtkImageReader2Factory::InitializeReaders()
{
if (vtkImageReader2Factory::AvailableReaders)
......
......@@ -57,18 +57,34 @@ public:
/**
* open the image file, it is the callers responsibility to call
* Delete on the returned object. If no reader is found, null
* Delete on the returned object. If no reader is found, nullptr
* is returned.
*/
VTK_NEWINSTANCE
static vtkImageReader2* CreateImageReader2(const char* path);
/**
* Create a vtkImageReader2 from a (dotted or not) file extension.
* If mulitple readers support the same extension, only one reader
* will be returned.
* It is the callers responsibility to call Delete on the returned object.
* If no reader is found, nullptr is returned.
*/
VTK_NEWINSTANCE
static vtkImageReader2* CreateImageReader2FromExtension(const char* extension);
/**
* The caller must allocate the vtkImageReader2Collection and pass in the
* pointer to this method.
*/
static void GetRegisteredReaders(vtkImageReader2Collection*);
/*
* An utility method to check if a (dotted or not) file extension is present
* in a list a whitespace separated list of dotted file extensions
*/
static bool CheckExtensionIsInExtensions(const char* extension, const char* extensions);
protected:
vtkImageReader2Factory();
~vtkImageReader2Factory() override;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment