#include <vtkPointData.h>
#include <vtkLookupTable.h>
-vtkCxxRevisionMacro(vtkGdcmWriter, "$Revision: 1.1 $");
+vtkCxxRevisionMacro(vtkGdcmWriter, "$Revision: 1.3 $");
vtkStandardNewMacro(vtkGdcmWriter);
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Protected
+/**
+ * Copy the image and reverse the Y axis
+ */
+// The output datas must be deleted by the user of the method !!!
+size_t ReverseData(vtkImageData *img,unsigned char **data)
+{
+ int *dim = img->GetDimensions();
+ size_t lineSize = dim[0] * img->GetScalarSize()
+ * img->GetNumberOfScalarComponents();
+ size_t planeSize = dim[1] * lineSize;
+ size_t size = dim[2] * planeSize;
+
+ *data = new unsigned char[size];
+
+ unsigned char *src = (unsigned char *)img->GetScalarPointer();
+ unsigned char *dst = *data + planeSize - lineSize;
+ for (int plane = 0; plane < dim[2]; plane++)
+ {
+ for (int line = 0; line < dim[1]; line++)
+ {
+ // Copy one line at proper destination:
+ memcpy((void*)dst, (void*)src, lineSize);
+
+ src += lineSize;
+ dst -= lineSize;
+ }
+ dst += 2 * planeSize;
+ }
+
+ return size;
+}
+
+/**
+ * Set the datas informations in the file
+ */
void SetImageInformation(gdcm::File *file,vtkImageData *image)
{
std::ostringstream str;
str<<image->GetScalarSize()*8-1;
file->ReplaceOrCreateByNumber(str.str(),0x0028,0x0102);
+ // Pixel Repr
+ // FIXME : what do we do when the ScalarType is
+ // VTK_UNSIGNED_INT or VTK_UNSIGNED_LONG
+ str.str("");
+ if( image->GetScalarType() == VTK_UNSIGNED_CHAR ||
+ image->GetScalarType() == VTK_UNSIGNED_SHORT ||
+ image->GetScalarType() == VTK_UNSIGNED_INT ||
+ image->GetScalarType() == VTK_UNSIGNED_LONG )
+ {
+ str<<"0"; // Unsigned
+ }
+ else
+ {
+ str<<"1"; // Signed
+ }
+ file->ReplaceOrCreateByNumber(str.str(),0x0028,0x0103);
+
// Samples per pixel
str.str("");
str<<image->GetNumberOfScalarComponents();
file->ReplaceOrCreateByNumber(str.str(),0x0028,0x0002);
- std::cout<<file->GetHeader()->GetEntryByNumber(0x0028,0x0002)<<"-"<<file->GetHeader()->GetNumberOfScalarComponents()<<"\n";
// Spacing
double *sp = image->GetSpacing();
file->ReplaceOrCreateByNumber(str.str(),0x0028,0x1050);
// Pixels
- size_t size = dim[0] * dim[1] * dim[2]
- * image->GetScalarSize()
- * image->GetNumberOfScalarComponents();
- file->SetImageData((unsigned char *)image->GetScalarPointer(),size);
+ unsigned char *data;
+ size_t size = ReverseData(image,&data);
+ file->SetImageData(data,size);
}
-void vtkGdcmWriter::RecursiveWrite(int dim, vtkImageData *region, ofstream *file)
+/**
+ * Write of the files
+ * The call to this method is recursive if there is some files to write
+ */
+void vtkGdcmWriter::RecursiveWrite(int axis, vtkImageData *image, ofstream *file)
{
if(file)
{
return;
}
- if( region->GetScalarType() == VTK_FLOAT
- || region->GetScalarType() == VTK_DOUBLE )
+ if( image->GetScalarType() == VTK_FLOAT ||
+ image->GetScalarType() == VTK_DOUBLE )
{
vtkErrorMacro(<< "Bad input type. Scalar type musn't be of type "
<< "VTK_FLOAT or VTKDOUBLE (found:"
- << region->GetScalarTypeAsString());
+ << image->GetScalarTypeAsString());
return;
}
+ WriteFile(this->FileName,image);
+}
+
+void vtkGdcmWriter::WriteFile(char *fileName,vtkImageData *image)
+{
+ // From here, the write of the file begins
gdcm::File *dcmFile = new gdcm::File();
- ///////////////////////////////////////////////////////////////////////////
// Set the image informations
- SetImageInformation(dcmFile,region);
+ SetImageInformation(dcmFile,image);
- ///////////////////////////////////////////////////////////////////////////
// Write the image
- if(!dcmFile->Write(this->FileName))
+ if(!dcmFile->Write(FileName))
{
vtkErrorMacro(<< "File " << this->FileName << "couldn't be written by "
<< " the gdcm library");