29 for (
unsigned int i = 0; i < this->GetNumberOfIndexedOutputs(); ++i)
34 const mitk::Image* img = this->GetInput(i);
36 int dims = img->GetDimension();
37 int chn = img->GetNumberOfChannels();
41 MITK_ERROR <<
"Can not handle dimensionless images";
45 MITK_ERROR <<
"Can not handle more than three dimensions";
51 MITK_ERROR <<
"Can not handle anything but one channel. Image contained " << chn;
55 igtl::ImageMessage::Pointer imgMsg = igtl::ImageMessage::New();
58 imgMsg->SetCoordinateSystem(igtl::ImageMessage::COORDINATE_RAS);
63 imgMsg->SetEndian(igtl::ImageMessage::ENDIAN_LITTLE);
66 mitk::PixelType type = img->GetPixelType();
67 imgMsg->SetNumComponents(type.GetNumberOfComponents());
70 switch (type.GetComponentType())
72 case itk::IOComponentEnum::CHAR:
73 imgMsg->SetScalarTypeToInt8();
75 case itk::IOComponentEnum::UCHAR:
76 imgMsg->SetScalarTypeToUint8();
78 case itk::IOComponentEnum::SHORT:
79 imgMsg->SetScalarTypeToInt16();
81 case itk::IOComponentEnum::USHORT:
82 imgMsg->SetScalarTypeToUint16();
84 case itk::IOComponentEnum::INT:
85 imgMsg->SetScalarTypeToInt32();
87 case itk::IOComponentEnum::UINT:
88 imgMsg->SetScalarTypeToUint32();
90 case itk::IOComponentEnum::LONG:
94 imgMsg->SetScalarType(8);
96 case itk::IOComponentEnum::ULONG:
100 imgMsg->SetScalarType(9);
102 case itk::IOComponentEnum::FLOAT:
104 imgMsg->SetScalarType(10);
106 case itk::IOComponentEnum::DOUBLE:
108 imgMsg->SetScalarType(11);
111 MITK_ERROR <<
"Can not handle pixel component type "
112 << type.GetComponentType();
117 vtkMatrix4x4* matrix = img->GetGeometry()->GetVtkMatrix();
120 for (
size_t i = 0; i < 4; ++i)
122 for (
size_t j = 0; j < 4; ++j)
124 matF[i][j] = matrix->GetElement(i, j);
127 imgMsg->SetMatrix(matF);
130 auto spacingImg = img->GetGeometry()->GetSpacing();
132 for (
int i = 0; i < 3; ++i)
133 spacing[i] = spacingImg[i];
135 imgMsg->SetSpacing(spacing);
139 for (
size_t j = 0; j < 3; ++j)
141 sizes[j] = img->GetDimension(j);
143 imgMsg->SetDimensions(sizes);
146 imgMsg->AllocatePack();
147 imgMsg->AllocateScalars();
149 size_t num_pixel = sizes[0] * sizes[1] * sizes[2];
150 void* out = imgMsg->GetScalarPointer();
153 mitk::ImageReadAccessor readAccess(img, img->GetChannelData(0));
154 const void* in = readAccess.GetData();
156 memcpy(out, in, num_pixel * type.GetSize());
163 size_t num_scalars = num_pixel * type.GetNumberOfComponents();
164 switch (type.GetComponentType())
166 case itk::IOComponentEnum::CHAR:
167 case itk::IOComponentEnum::UCHAR:
170 case itk::IOComponentEnum::SHORT:
171 case itk::IOComponentEnum::USHORT:
172 itk::ByteSwapper<short>::SwapRangeFromSystemToLittleEndian((
short*)out,
175 case itk::IOComponentEnum::INT:
176 case itk::IOComponentEnum::UINT:
177 itk::ByteSwapper<int>::SwapRangeFromSystemToLittleEndian((
int*)out,
180 case itk::IOComponentEnum::LONG:
181 case itk::IOComponentEnum::ULONG:
182 itk::ByteSwapper<long>::SwapRangeFromSystemToLittleEndian((
long*)out,
185 case itk::IOComponentEnum::FLOAT:
186 itk::ByteSwapper<float>::SwapRangeFromSystemToLittleEndian((
float*)out,
189 case itk::IOComponentEnum::DOUBLE:
190 itk::ByteSwapper<double>::SwapRangeFromSystemToLittleEndian(
191 (
double*)out, num_scalars);
194 MITK_ERROR <<
"Can not handle pixel component type "
195 << type.GetComponentType();
200 igtl::TimeStamp::Pointer timestamp = igtl::TimeStamp::New();
201 timestamp->SetTime(img->GetMTime() / 1000, (
int)(img->GetMTime()) % 1000);
202 imgMsg->SetTimeStamp(timestamp);