15 #include <vtkImageData.h> 16 #include <vtkPointData.h> 18 #include <vtkBitArray.h> 19 #include <vtkCharArray.h> 20 #include <vtkDoubleArray.h> 21 #include <vtkFloatArray.h> 22 #include <vtkIntArray.h> 23 #include <vtkLongArray.h> 24 #include <vtkShortArray.h> 25 #include <vtkUnsignedCharArray.h> 26 #include <vtkUnsignedIntArray.h> 27 #include <vtkUnsignedLongArray.h> 28 #include <vtkUnsignedShortArray.h> 37 unsigned int dimension,
41 : m_Data(static_cast<unsigned char *>(aParent.m_Data) + offset),
43 m_ManageMemory(false),
44 m_VtkImageData(nullptr),
45 m_VtkImageReadAccessor(nullptr),
46 m_VtkImageWriteAccessor(nullptr),
51 m_Dimension(dimension),
56 for (
unsigned int i = 0; i < dimension; i++)
58 m_Dimensions[i] = desc->GetDimensions()[i];
60 this->ComputeItemSize(m_Dimensions, dimension);
62 if (data !=
nullptr && data !=
m_Data)
67 delete[](
unsigned char *) data;
90 if (m_Parent.IsNull())
102 :
m_Data(static_cast<unsigned char *>(data)),
111 m_Dimension(desc->GetNumberOfDimensions()),
115 const unsigned int *dimensions = desc->GetDimensions();
116 for (
unsigned int i = 0; i < m_Dimension; i++)
118 m_Dimensions[i] = dimensions[i];
121 this->ComputeItemSize(m_Dimensions, m_Dimension);
125 m_Data = mitk::MemoryUtilities::AllocateElements<unsigned char>(
m_Size);
129 m_ReferenceCount = 0;
134 unsigned int dimension,
135 unsigned int *dimensions,
138 :
m_Data(static_cast<unsigned char *>(data)),
148 m_Dimension(dimension),
151 for (
unsigned int i = 0; i < m_Dimension; i++)
153 m_Dimensions[i] = dimensions[i];
156 this->ComputeItemSize(dimensions, dimension);
160 m_Data = mitk::MemoryUtilities::AllocateElements<unsigned char>(
m_Size);
164 m_ReferenceCount = 0;
168 :
itk::LightObject(),
178 m_Parent(other.m_Parent),
179 m_Dimension(other.m_Dimension),
180 m_Timestep(other.m_Timestep)
184 m_Dimensions[i] = other.m_Dimensions[i];
190 newGeometry->UnRegister();
191 return newGeometry.GetPointer();
194 void mitk::ImageDataItem::ComputeItemSize(
const unsigned int *dimensions,
unsigned int dimension)
196 m_Size = m_PixelType->GetSize();
197 for (
unsigned int i = 0; i < dimension; i++)
199 m_Size *= *(dimensions + i);
205 vtkImageData *inData = vtkImageData::New();
206 vtkDataArray *scalars =
nullptr;
208 const unsigned int *dims = m_Dimensions;
209 const unsigned int dim = m_Dimension;
211 unsigned long size = 0;
214 inData->SetDimensions(dims[0] - 1, 1, 1);
220 inData->SetDimensions(dims[0], dims[1], 1);
221 size = dims[0] * dims[1];
226 inData->SetDimensions(dims[0], dims[1], dims[2]);
227 size = dims[0] * dims[1] * dims[2];
230 inData->SetOrigin(0, 0, 0);
241 geom3d = iP->GetSlicedGeometry(m_Timestep);
244 double dspacing[3] = {vspacing[0], vspacing[1], vspacing[2]};
245 inData->SetSpacing(dspacing);
248 if (m_PixelType->GetComponentType() == itk::ImageIOBase::CHAR)
250 scalars = vtkCharArray::New();
252 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::UCHAR)
254 scalars = vtkUnsignedCharArray::New();
256 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::SHORT)
258 scalars = vtkShortArray::New();
260 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::USHORT)
262 scalars = vtkUnsignedShortArray::New();
264 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::INT)
266 scalars = vtkIntArray::New();
268 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::UINT)
270 scalars = vtkUnsignedIntArray::New();
272 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::LONG)
274 scalars = vtkLongArray::New();
276 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::ULONG)
278 scalars = vtkUnsignedLongArray::New();
280 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::FLOAT)
282 scalars = vtkFloatArray::New();
284 else if (m_PixelType->GetComponentType() == itk::ImageIOBase::DOUBLE)
286 scalars = vtkDoubleArray::New();
294 m_VtkImageData = inData;
297 scalars->SetNumberOfComponents(m_PixelType->GetNumberOfComponents());
298 scalars->SetVoidArray(m_Data, size * m_PixelType->GetNumberOfComponents(), 1);
300 m_VtkImageData->GetPointData()->SetScalars(scalars);
307 m_VtkImageData->Modified();
312 if (m_VtkImageData ==
nullptr)
314 ConstructVtkImageData(iP);
316 if (m_VtkImageReadAccessor ==
nullptr)
320 return m_VtkImageReadAccessor;
325 if (m_VtkImageData ==
nullptr)
327 ConstructVtkImageData(iP.GetPointer());
329 if (m_VtkImageWriteAccessor ==
nullptr)
333 return m_VtkImageWriteAccessor;
~ImageDataItem() override
DataCollection - Class to facilitate loading/accessing structured data.
itk::LightObject::Pointer InternalClone() const override
ImageDataItem(const ImageDataItem &aParent, const mitk::ImageDescriptor::Pointer desc, int timestep, unsigned int dimension, void *data=nullptr, bool manageMemory=false, vcl_size_t offset=0)
#define MAX_IMAGE_DIMENSIONS
Defines the maximum of 8 dimensions per image channel taken from ipPicDescriptor. ...
ImageVtkReadAccessor * GetVtkImageAccessor(ImageConstPointer) const
GetVtkImageAccessor Returns a vtkImageDataItem, if none is present, a new one is constructed by the C...
Describes the geometry of a data object consisting of slices.
virtual void Modified() const
ImageVtkReadAccessor class provides any image read access which is required by Vtk methods...
ImageVtkWriteAccessor * m_VtkImageWriteAccessor
virtual void ConstructVtkImageData(ImageConstPointer) const
const mitk::Vector3D GetSpacing() const
Get the spacing (size of a pixel).
ImageVtkReadAccessor * m_VtkImageReadAccessor
Internal class for managing references on sub-images.
ImageVtkWriteAccessor class provides any image write access which is required by Vtk methods...
Class for defining the data type of pixels.
vtkImageData * m_VtkImageData